# DockerFile 指令
参考官方文档
# FROM 指令
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
指定后续指令基于哪个镜像,所以一个有效的DockerFile必须以FROM指令(前面可以加ARG指令定义变量)开头。
# platform 参数
用于指定镜像的平台。例如linux / amd64,linux / arm64或Windows / amd64。默认情况下,使用构建请求的目标平台。
# image 参数
镜像名称,可以加:version,来指定版本。
# AS 参数
对FROM进行命名,后续镜像可以使用这个名称来引用这个构建完成的镜像。
# RUN 指令
RUN <command>
RUN ["executable", "param1", "param2"]
2
基于镜像执行命令。行尾可以使用''换行。 例如:
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
2
等效于:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
# 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)
2
3
- 执行指令,并赋予参数,使用镜像对应系统的默认执行方式。
- 给ENTRYPOINT指令提供参数。
- 使用shell执行指令,并赋予参数。 镜像启动时指定的命令。如果指定多个CMD,则只有最后一个生效。 示例:
FROM ubuntu
CMD ["/usr/bin/wc","--help"]
2
# LABEL 指令
LABEL <key>=<value> <key>=<value> <key>=<value> ...
给镜像添加描述元数据(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."
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"
},
2
3
4
5
6
7
8
9
# EXPOSE 指令
EXPOSE <port> [<port>/<protocol>...]
通知镜像运行时应监听的端口和协议。默认是TCP协议。 示例:
EXPOSE 80/tcp
EXPOSE 80/udp
2
可以使用一下命令在运行镜像时监听端口,TCP和UDP协议是不同的,默认为TCP协议。 示例:
docker run -p 80:80/tcp -p 80:80/udp ...
# ENV 指令
ENV <key> <value>
ENV <key>=<value> ...
2
设置镜像中的环境变量。可以使用反斜杠(\)来转义空格,或者用双引号。或者也可以直接不写等号,使用多条语句。 示例:
ENV myName="John Doe" myDog=Rex\ The\ Dog \
myCat=fluffy
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
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)
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/
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)
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/
2
3
4
5
6
7
8
9
# ENTRYPOINT 指令
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)
2
指定在容器运行时执行的命令,CMD 指令可以为其补充参数。 示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
2
3
可以在运行时使用 --entrypoint
覆盖。
示例:
docker run --entrypoint=top
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"]
创建具有指定名称的装载点,并将其标记为保存来自本地主机或其他容器的外部安装的卷。即将容器中指定目录,挂载为本机或其他容器的目录,从而使其在运行时不在容器内部进行写操作。运行时可以覆盖这个挂载设置:
docker run -d -v mydata:/data xxxx
docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash
2
# USER 指令
USER <user>[:<group>] or
USER <UID>[:<GID>]
2
指定镜像运行时,执行指令的用户。
# WORKDIR 指令
WORKDIR /path/to/workdir
设置容器运行时的工作目录,即 RUN、CMD、ENTRYPOINT、ADD 指令执行的目录。
# ARG 指令
ARG <name>[=<default value>]
定义一个变量,用户可以在构建时使用 --build-arg=xxx
来覆盖。