Dockerfile常用指令

200 阅读3分钟

Dockerfile是构建docker精选的主要方式,了解和记录常用的Dockerfile命令,方便以后查阅,该篇内容大部分来自docker官网,请以官网为准,此仅作记录。

FROM

指定base镜像。格式形如:

FROM centos

LABEL

LABEL指令用于向镜像添加元数据。LABEL是个键值对格式,如下:

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
      that label-values can span multiple lines."
LABEL multi.label1="value1" multi.label2="value2" other="value3"
LABEL multi.label1="value1" \
      multi.label2="value2" \
      other="value3"

构建镜像时,镜像会从base镜像或者父镜像继承label,如果镜像的label与上级镜像冲突,则会出现label覆盖。

MAINTAINER (已过时)

设置镜像的作者。请使用LABEL替代。

EXPOSE

EXPOSE 指令通知 Docker 容器在运行时监听指定的网络端口。 可以指定端口是监听TCP还是UDP,如果不指定协议,默认为TCP。格式形如:

EXPOSE 80/tcp
EXPOSE 80/udp

ENV

设置环境变量。格式如下:

# 旧的写法
ENV JAVA_HOME /usr/local/jdk1.8.0_291
# 新的写法
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
    MY_CAT=fluffy

COPY

将文件或目录从build context(host上的文件夹)复制到容器的文件系统中。格式形如:

COPY test.txt /absoluteDir/

ADD

COPY类似,但是复制的文件如果是个压缩包则会自动解压到容器中,需要注意的是,是否会自动解压缩取决于文件内容而不是文件的名字。

WORKDIR

为Dockerfile中在该命令后的任何RUNCMDENTRYPOINTCOPYADD指令设置工作目录。格式形如:

WORKDIR /usr

举个栗子,当Dockfile内容为下面代码的时候,执行该镜像会打印这样的结果:

FROM centos
WORKDIR /usr
CMD ["pwd"]

VOLUME

用于创建一个具有指定名称的挂载点,并将其标记为保存来自本机主机或其他容器的外部挂载卷。格式形如:

VOLUME /myvol

RUN

在当前容器中执行指定命令并提交结果,生成的镜像用于下面的操作(执行命令并创建新的镜像层,常用于安装软件包)

RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
CMD

设置容器启动时执行的命令和参数,可被docker run后面的参数替换。CMD有三种格式:

  • CMD ["executable","param1","param2"](推荐)
FROM centos CMD ["/bin/echo""Hello Foo Bar"]

  • CMD command param1 param2(shell格式)
FROM centos
CMD echo "Hello Foo Bar"

结果同上。

  • CMD ["param1","param2"],作为ENTRYPOINT的默认参数(常用)
FROM centos
ENTRYPOINT ["/bin/echo""Hello"]
CMD ["Bar"]


ENTRYPOINT中的参数始终会被使用,但CMD的参数可被替换。

CMD还可以给容器设置默认的启动命令。如:

FROM centos CMD ["echo""Hello Bar"]

ENTRYPOINT

设置容器启动时执行的命令。Dockerfile中可以有多个ENTRYPOINT指令,但只有最后一个会生效CMD或者docker run之后的参数会被当作参数传递给ENTRYPOINT。ENTRYPOINT有两种格式:

  • ENTRYPOINT ["executable", "param1", "param2"](推荐) 使用方式形如:
FROM centos
ENV name "foo bar"
ENTRYPOINT ["/bin/echo""Hello $name"]


可见环境变量未生效,若需要环境变量生效,需调整为:

FROM centos
ENV name "foo bar"
ENTRYPOINT ["/bin/sh""-c""echo Hello $name"]

  • ENTRYPOINT command param1 param2 使用方式形如:
ENTRYPOINT exec top -b

需注意:

  • 此方式会忽略CMD和启动时附带的参数。
  • ENTRYPOINT将作为/bin/sh -c的子命令启动,导致不能收到从docker stop <container>发来的SIGTERM信号,也因此无法做到优雅关闭容器而被强杀进程。