记录下Dockerfile中常用的指令,完整列表和说明可参考官方文档。

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
FROM scratch

MAINTAINER lz94wpz

WORKDIR /workspaces

COPY alpine-minirootfs-3.9.3-x86_64.tar.gz /
# COPY ["alpine-minirootfs-3.9.3-x86_64.tar.gz", "/"]

ADD alpine-minirootfs-3.9.3-x86_64.tar.gz /
# ADD ["alpine-minirootfs-3.9.3-x86_64.tar.gz", "/"]

ENV HELLO hello
ENV WORLD world

RUN ["/bin/sh", "-c", "echo $HELLO"]
RUN echo $WORLD

CMD ["/bin/sh", "-c", "/bin/echo $HELLO"]
# CMD echo $WORLD

# ENTRYPOINT ["/bin/sh", "-c", "/bin/echo $HELLO"]
# ENTRYPOINT echo $WORLD

EXPOSE 80

VOLUME /test
1
2
docker build -t IMAGE_NAME:TAG .  # 默认使用指定路径下的Dockerfile文件构建镜像,Dockerfile文件不存在时会报错
docker build -t IMAGE_NAME:TAG -f Dockerfile . # 使用-f参数指定构建镜像的Dockerfile文件

FROM

指定基础镜像。

MAINTAINER

设置镜像作者信息。

WORKDIR

设置镜像的工作目录,默认为/根目录。

ENV

设置环境变量。可设置多个。

EXPOSE

指定容器中的进程会监听某个端口,Docker可以将该端口暴露出来。

VOLUME

将文件或目录声明为volume

COPY && ADD

COPYADD都是用于将构建环境中指定的文件添加到镜像中的。不同的是如果指定的文件是归档文件(tar, zip, tgz, xz等),ADD指令会将其解压,COPY指令不会。

COPYADD都支持两种形式的写法:

COPY src dest
COPY ["src", "dest"]

ADD src dest
ADD ["src", "dest"]

RUN && CMD && ENTRYPOINT

RUN指定的命令在docker build构建镜像的时候执行。可以有多个RUN指令,且每个都生效。

CMD指定的命令在容器启动时执行。可以有多个CMD指令,但只有最后一个生效。CMD指定的命令会被docker run之后的参数替换。

ENTRYPOINT指定的命令在容器启动时执行。可以有多个ENTRYPOINT指令,但只有最后一个生效。CMDdocker run之后的参数会被当做参数传递给ENTRYPOINTENTRYPOINT命令一定会执行。

RUNCMDENTRYPOINT都支持两种形式的写法:

Shell 格式

Shell 格式
1
<instruction> <command>

当指令执行时,Shell格式的写法底层会调用/bin/sh -c <command>

如:

ENV WORLD world
ENTRYPOINT echo "Hello $WORLD"

执行docker run <image>将输出:Hello world

Exec 格式

Exec 格式
1
<instruction> ["executable", "param1", "param2", ...]

当指令执行时,Exec格式的写法会直接调用<command>,不会被shell解析。

如:

ENV WORLD world
ENTRYPOINT ["/bin/echo", "Hello $WORLD"]

执行docker run <image>将输出:Hello $WORLD

注意环境变量WORLD没有被替换。如果希望环境变量被替换,修改为:

ENV WORLD world
ENTRYPOINT ["/bin/sh", "-c", "echo Hello $WORLD"]

参考链接

Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)

RUN vs CMD vs ENTRYPOINT - 每天5分钟玩转 Docker 容器技术(17)