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中在该命令后的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。格式形如:
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信号,也因此无法做到优雅关闭容器而被强杀进程。