# DockerFile 指令

参考官方文档

# FROM 指令

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
1

指定后续指令基于哪个镜像,所以一个有效的DockerFile必须以FROM指令(前面可以加ARG指令定义变量)开头。

# platform 参数

用于指定镜像的平台。例如linux / amd64,linux / arm64或Windows / amd64。默认情况下,使用构建请求的目标平台。

# image 参数

镜像名称,可以加:version,来指定版本。

# AS 参数

对FROM进行命名,后续镜像可以使用这个名称来引用这个构建完成的镜像。

# RUN 指令

RUN <command>
RUN ["executable", "param1", "param2"]
1
2

基于镜像执行命令。行尾可以使用''换行。 例如:

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

等效于:

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

# CMD 指令

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
1
2
3
  1. 执行指令,并赋予参数,使用镜像对应系统的默认执行方式。
  2. 给ENTRYPOINT指令提供参数。
  3. 使用shell执行指令,并赋予参数。 镜像启动时指定的命令。如果指定多个CMD,则只有最后一个生效。 示例:
FROM ubuntu
CMD ["/usr/bin/wc","--help"]
1
2

# LABEL 指令

LABEL <key>=<value> <key>=<value> <key>=<value> ...
1

给镜像添加描述元数据(metadata)。 示例:

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."
1
2
3
4
5

使用 docker inspect 命令查看。 示例:

"Labels": {
    "com.example.vendor": "ACME Incorporated"
    "com.example.label-with-value": "foo",
    "version": "1.0",
    "description": "This text illustrates that label-values can span multiple lines.",
    "multi.label1": "value1",
    "multi.label2": "value2",
    "other": "value3"
},
1
2
3
4
5
6
7
8
9

# EXPOSE 指令

EXPOSE <port> [<port>/<protocol>...]
1

通知镜像运行时应监听的端口和协议。默认是TCP协议。 示例:

EXPOSE 80/tcp
EXPOSE 80/udp
1
2

可以使用一下命令在运行镜像时监听端口,TCP和UDP协议是不同的,默认为TCP协议。 示例:

docker run -p 80:80/tcp -p 80:80/udp ...
1

# ENV 指令

ENV <key> <value>
ENV <key>=<value> ...
1
2

设置镜像中的环境变量。可以使用反斜杠(\)来转义空格,或者用双引号。或者也可以直接不写等号,使用多条语句。 示例:

ENV myName="John Doe" myDog=Rex\ The\ Dog \
    myCat=fluffy
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
1
2
3
4
5

使用 docker inspect 命令查看,使用docker run --env <key>=<value>在运行镜像时更改环境变量。

# ADD 指令

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] (this form is required for paths containing whitespace)
1
2

将文件复制到容器中,也可以使用url,并且tar格式压缩的文件添加到容器中时会自动解压。chown参数针对用户进行授权,只对linux系统有效。 示例:

ADD hom* /mydir/        # adds all files starting with "hom"
ADD hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"
ADD test relativeDir/          # adds "test" to `WORKDIR`/relativeDir/
ADD test /absoluteDir/         # adds "test" to /absoluteDir/
ADD arr[[]0].txt /mydir/    # copy a file named "arr[0].txt" to /mydir/
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
1
2
3
4
5
6
7
8
9

# COPY 指令

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] (this form is required for paths containing whitespace)
1
2

将文件复制到容器中,并且可以复制 --from=<name|index> 参数来使用FROM AS指令指定的镜像。

COPY hom* /mydir/        # adds all files starting with "hom"
COPY hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"
COPY test relativeDir/   # adds "test" to `WORKDIR`/relativeDir/
COPY test /absoluteDir/  # adds "test" to /absoluteDir/
COPY arr[[]0].txt /mydir/    # copy a file named "arr[0].txt" to /mydir/
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
1
2
3
4
5
6
7
8
9

# ENTRYPOINT 指令

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)
1
2

指定在容器运行时执行的命令,CMD 指令可以为其补充参数。 示例:

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
1
2
3

可以在运行时使用 --entrypoint 覆盖。 示例:

docker run --entrypoint=top
1

ENTRYPOINT 指令 和 CMD 指令的互动。

No ENTRYPOINT ENTRYPOINT exec_entry p1_entry ENTRYPOINT [“exec_entry”, “p1_entry”]
No CMD error, not allowed /bin/sh -c exec_entry p1_entry exec_entry p1_entry
CMD [“exec_cmd”, “p1_cmd”] exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry exec_cmd p1_cmd
CMD [“p1_cmd”, “p2_cmd”] p1_cmd p2_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry p1_cmd p2_cmd
CMD exec_cmd p1_cmd /bin/sh -c exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd

# VOLUME 指令

VOLUME ["/data"]
1

创建具有指定名称的装载点,并将其标记为保存来自本地主机或其他容器的外部安装的卷。即将容器中指定目录,挂载为本机或其他容器的目录,从而使其在运行时不在容器内部进行写操作。运行时可以覆盖这个挂载设置:

docker run -d -v mydata:/data xxxx
docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash
1
2

# USER 指令

USER <user>[:<group>] or
USER <UID>[:<GID>]
1
2

指定镜像运行时,执行指令的用户。

# WORKDIR 指令

WORKDIR /path/to/workdir
1

设置容器运行时的工作目录,即 RUN、CMD、ENTRYPOINT、ADD 指令执行的目录。

# ARG 指令

ARG <name>[=<default value>]
1

定义一个变量,用户可以在构建时使用 --build-arg=xxx 来覆盖。