基本指令
FROM
格式为FROM <image>
或FROM <image>:<tag>
Dockerfile中的第一条指令必须是FROM,如果在同一个Dockerfile创建多个镜像,可以使用多个FROM。
MAINTAINER
格式为MAINTAINER <name>
,指定维护者信息
RUN
格式为RUN <command>
或RUN ["executable","param1","param2"]
前者会在shell终端(即/bin/sh -c)运行,后者则使用exec执行。
如果需要指定使用其他终端,则可以使用后者
RUN ["/bin/bash","-c","echo hello"]
每条RUN指令在当前镜像基础上执行,并提交为新的镜像。若命令较长,可以使用\来换行。
CMD
CMD支持3种格式:
CMD ["executable","param1","param2"]
:使用exec执行CMD command param1 param2
:在/bin/sh执行CMD ["param1","param2"]
:提供给ENTRYPOINT的默认参数
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令;如果指定了多条命令,则只有最后一条会被执行。
如果用户启动容器时指定了运行的命令,则会覆盖CMD指定的命令。
其他指令
EXPOSE
格式为EXPOSE <port> [<port>...]
如暴露端口22,80,8443
EXPOSE 22 80 8443
ENV
格式为ENV <key> <value>
当指定环境变量后,会被后续的RUN指令使用,并在容器运行时保持。
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgres && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD
格式为ADD <src> <dest>
命令将复制指定的src到容器的dest。其中,src是Dockerfile所在目录的相对路径,它可以是URL,如果是tar文件,则自动解压为目录。
COPY
格式为COPY <src> <dest>
赋值本地的src(相对于Dockerfile的路径),到容器的dest。如果目标路径不存在,则自动创建。
当使用本地目录为源目录时,则使用COPY。
ENTRYPOINT
ENTRYPOINT有两种格式:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2
配置容器启动后执行的命令,并且不被docker run提供的参数覆盖。
每个Dockerfile只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个有效。
VOLUME
格式为VOLUME ["/data"]
创建一个从本地主机或其他容器挂载的挂载点,一般用来存放数据库等。
USER
格式为USER daemon
指定运行容器时的用户名或UID,后续的RUN也会使用指定的用户。
当服务不需要管理员权限时,可以使用该命令指定运行用户,并且可以在之前创建所需要的用户
RUN groupadd -r postgres && useradd -r -g postgres postgres
要临时获取管理员权限可以使用gosu,而不推荐使用sudo
WORKDIR
格式为WORKDIR /path/to/workdir
为后续的RUN、CMD、ENTRYPOINT指定配置工作目录。
可以使用多个WORKDIR指令,后续命令如果是相对路径,则会基于此前命令指定的路径
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
此时最终路径为/a/b/c
ONBUILD
格式为ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果新的镜像基于上面镜像构建,则等价于添加两条命令
FROM image-A
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用ONBUILD指令的镜像,最好在标签中注明,如ruby:1.9-onbuild