博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker学习(六):Dockerfile创建镜像
阅读量:2095 次
发布时间:2019-04-29

本文共 5859 字,大约阅读时间需要 19 分钟。

一、Dockerfile介绍

Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像

二、Dockerfile基础结构

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行

一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令

# This dockerfile uses ubuntu image# VERSION 2 - EDITION 1# Author: docker_user# Command format: Instruction [arguments / command] ..FROM centos/python-36-centos7:latestMAINTAINER luozelinRUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources/listRUN apt-get update && apt-get install -y nginxRUN echo "\ndaemon off;" >> /etc/nginx/nginx.confCMD /usr/sbin/nginx

一开始指明所基于的镜像名称,接下来一般是说明维护者信息。后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像就添加新的一层,并提交。最后是CMD指令,用来指定运行容器时的操作命令。

三、Dockerfile指令说明

指令的一般格式为INSTRUCTION arguments,指令包括 FROM、MAINTAINER、RUN等

指令 说明 命令
FROM 指定所创建镜像的基础镜像 FROM centos:latest
MAINTAINER 指定维护者信息 MAINTAINER luozelin
RUN 运行镜像时运行的Shell命令

RUN ["yum","install","httpd"]

RUN yum install httpd

CMD 指定启动容器时默认执行的Shell命令

CMD ["-c","/start.sh"]

CMD ["/usr/sbin/sshd","-D"]

CMD /usr/sbin/sshd -D

LABEL 指定生成镜像的元数据标签信息  
EXPOSE 声明镜像内服务所监听的端口 EXPOST 80 443
ENV 指定容器内的环境变量 ENV MYSQL_ROOT_PASSWORD 123456
ADD 复制指定的<src>路径下的内容到容器中的<dest>路径下,<src>可以为URL;如果为tar文件,会自动解压到<dest>路径下

ADD <src>...<dest>

ADD ["<src>",..."<dest>"]

ADD https://xxx.com/html.tar.gz /var/www/html

ADD html.tar.gz /var/www/html

COPY 复制本地主机的<src>路径下的内容到镜像中的<dest>路径下;一般情况下推荐使用COPY,而不是ADD,但是如果拷贝到容器中的文件需要自动解压就需要使用ADD COPY ./start.sh /start.sh
ENTRYPOINT 指定镜像的默认入口,运行容器时执行的Shell命令

ENTRYPOINT ["/bin/bash","-c","/start.sh"]

ENTRYPOINT /bin/bash -c '/start.sh'

VOLUME 创建数据卷挂载点,指定容器挂载点到宿主机自动生成的目录或其他容器 VOLUME ["/var/lib/mysql"]
USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户 USER <user>[:<group>] or USER <UID>[:<GID>]
WORKDIR 为RUN、CMD和ENTRYPOINT、COPY和ADD配置工作目录,在进入容器时就会自动切换到指定的workdir目录中 WORKDIR /data
ARG 指定镜像内使用的参数(例如版本号信息等),在构造镜像时指定一些参数

FROM centos:6

ARG user #ARG user=root

USER $user

#docker build --build-arg user=luozelin Dockerfile

ONBUILD 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令  
STOPSIGNAL 容器退出的信号值  
HEALTHCHECK 如何进行健康检查 HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http://localhost/ || exit 1
SHELL 指定使用shell时的默认shell类型  

FROM

指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。

格式为FROM<image>:<tag>,如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一次)

MAINTAINER

指定维护者信息,格式为MAINTAINER <name>,例如 MAINTAINER image_creator@docker.com,该信息会写入生成镜像的Author属性域中

RUN

运行指定命令,格式为RUN <command>RUN ["executable","param1","param2"]

每条RUN指令将在当前镜像的基础上执行指定指令,并提交为新的镜像。

CMD

CMD指令用来指定启动容器时默认执行的命令,支持三种格式:

第一种:CMD ["executable","param1","param2"]使用exec执行,是推荐使用的方式

第二种:CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用

第三种:CMD ["param1","param2"] 只能有一条CMD命令,如果指定了多条命令,只有最后一条会被执行

如果用户启动容器时手动指定了运行的命令(作为run的参数),则会覆盖CMD指定的命令

LABEL

LABEL指令用来指定生成镜像的元数据标签信息

格式为LABEL <key>=<value> <key>=<value> <key>=<value>  ...

例如:

LABEL version="1.0"LABEL description="This text illustrates \ that label-values can span multiple lines."

EXPOSE

声明镜像内服务所监听的端口

格式为 EXPOSE <port> [<port>...]

例如:

EXPOSE 20 80 8443

注意:该指令只是起到了声明作用,并不会自动完成端口映射!

在启动容器时需要使用-P,Docker主机会自动分配一个宿主机的临时端口转发到指定的端口;使用-p,则可以具体指定哪个宿主机的本地端口会映射过来

ENV

指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在

格式为 ENV <key><value>ENV <key>=<value>...

例如

ENV PG_MAJOR 9.3ENV PG_VERSION 9.3.4RUM curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

指令指定的环境变量在运行时可以被覆盖掉,如docker run --env <key>=<value> built_image

 ADD

该命令将复制指定的<src>路径下的内容到容器中的<dest>路径下

格式为 ADD <src> <dest>

其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,还可以是一个tar文件(自动解压到<dest>路径下),<dest>可以是镜像内的绝对路径,或者相对于工作目录(WORKDIR)的相对路径

路径支持正则格式,例如

ADD *.c /code/

COPY

格式为 COPY <src> <dest>

复制本地主机的<src>(为Dockerfile所在目录的相对路径、文件或目录)下的内容到镜像中的<dest>下,目录路径不存在时,会自动创建

ENTRYPOINT

指定镜像的默认入口命令,该入口命令会在启动容器时作为跟命令执行,所有传入值作为该命令的参数

支持两种格式:

ENTRYPOINT ["executable","param1","param2"](exec调用执行)

ENTRYPOINT command param1 param2(shell中执行)

此时,CMD指令指定值将作为根命令的参数

每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效,在运行时可以被 --entrypoint参数覆盖掉

VOLUMN

创建一个数据卷挂载点

格式为 VOLUME ["/data"]

可以从本地主机或者其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等

USER

指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份

格式为 USER daemon

当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需要的用户。例如

RUN groupadd -r postgres && useradd -r -g postgres postgres

要临时获取管理员权限可以使用gosu或sudo

WORKDIR

为后续的RUN、CMD和ENTRYPOINT指令配置工作目录

格式为 WORKDIR /path/to/workdir

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径,例如

WORKDIR /aWORKDIR bWORKDIR cRUN pwd

则最终路径为/a/b/c

ARG

指定一些镜像内使用的参数(例如版本号信息等),这些参数在执行docker build命令时才以 --build-arg<varname>=<value>格式传入

格式为 ARG <name> [=<default value>]

则可以用 docker build --build-arg<name>=<value>来指定参数值

ONBUILD

配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令

格式为 ONBUILD [INSTRUCTION]

例如,Dockerfile使用如下的内容创建了镜像image-A

[...]ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build --dir /app/src[...]

如果基于image-A创建新的镜像时,新的Dockerfile中使用FROM image-A指定基础镜像,会自动执行ONBUILD指令的内容,等价于在后天添加了两条指令:

FROM image-AADD . /app/srcRUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的镜像,推荐在标签中注明,例如:ruby:1.9-onbuild

STOPSIGNAL

指定所创建镜像启动的容器接收退出的信号值。例如

STOPSIGNAL signal

HEALTHCHECK

配置所启动容器如何进行健康检查(如何判断健康与否),自Docker1.12开始支持

格式有两种:

第一种:HEALTHCHECK [OPTIONS] CMD command 根据所执行命令返回值是否为0来判断

第二种:HEALTHCHECK NONE 禁止基础镜像中的健康检查

OPTION支持:

--interval=DURATION(默认为30s):过多久检查一次

--timeout=DURATION(默认为30s):每次检查等待结果的超时

--retries=N(默认为3):如果失败了,重试几次才最终确定失败

SHELL

指定其他命令使用shell时的默认shell类型

格式为 SHELL ["executable","parameters"]

默认值为["/bin/sh","-c"]

四、创建镜像

编写完成Dockerfile之后,可以通过docker build命令来创建镜像

基本格式为 docker build [options] 内容路径该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像。因此除非生成镜像需要,否则一般建议放置Dockerfile的目录为空目录。

有两点经验:

第一、如果使用非内容路径下的Dockerfile,可以通过 -f 选项来指定其路径

第二、要指定生成镜像的标签信息,可以使用 -t 选项

例如,指定Dockerfile所在路径为/tmp/docker_builder/,并且希望生成镜像标签为build_repo/first_image,可以使用下面的命令:

docker build -t build_repo/first_image /tmp/docker_builder/

五、使用.dockerignore文件

可以通过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略匹配模式路径下的目录和文件,例如:

# comment    */temp*    */*/temp*    tmp?    ~*

 

转载地址:http://luchf.baihongyu.com/

你可能感兴趣的文章
BufferedInputStream(缓冲输入流)详解
查看>>
修改linux文件权限命令:chmod
查看>>
Linux vi/vim编辑器常用命令与用法总结
查看>>
如何使用Git Bash Here,将本地项目传到github上
查看>>
eclipse git控件操作 回退到历史提交 重置 删除(撤销)历史的某次提交
查看>>
Oracle | 给表和字段添加注释
查看>>
java比较日期大小及日期与字符串的转换【SimpleDateFormat操作实例】
查看>>
Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence
查看>>
java中System.exit()方法
查看>>
在hbase shell中过滤器的简单使用
查看>>
java静态方法和实例方法
查看>>
java多线程并发去调用一个类的静态方法,会有问题吗?
查看>>
关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
查看>>
Java命令学习系列(一)——Jps
查看>>
java如何计算程序运行时间
查看>>
Java Calendar 类的时间操作
查看>>
Java]NIO:使用Channel、Charset(字符集)、使用Charset传递CharBuffer
查看>>
Eclipse下运行Maven项目提示缺少maven-resources-plugin:2.4.3
查看>>
Java 中int、String的类型转换
查看>>
比较两个JSON字符串是否完全相等
查看>>