本文共 5859 字,大约阅读时间需要 19 分钟。
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指令,用来指定运行容器时的操作命令。
指令的一般格式为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文件(每一行添加一条匹配模式)来让Docker忽略匹配模式路径下的目录和文件,例如:
# comment */temp* */*/temp* tmp? ~*
转载地址:http://luchf.baihongyu.com/