参考链接:https://docs.docker.com/engine/reference/builder/
- 通过写好的Dockerfile可以自动构建Docker镜像。
- Dockerfile中包含了构建一个镜像可能用到的所有命令。
具体示例参考:https://docs.docker.com/engine/reference/builder/#dockerfile-examples
命令
docker build -t <name:tag> -f /path/to/a/Dockerfile <context>
- 创建镜像时需要Dockerfile和一个指定路径
- 这个路径是一个明确指出的宿主局文件目录或者一个给定的URL(Git仓库地址)
- 创建镜像时,会首先将指定的context发送给docker daemon。
- 大部分情况,最好指定一个空目录,目录下只有Dockerfile即可(以及构建镜像 必须的文件)。
- 可以在目录下创建 .dockerignore文件,忽略掉不需要传递的文件。
BuildKit
从18.09开始,Docker支持一种新的方式构建镜像,即moby/buildkit
使用这种方式,需要首先设置环境变量:
DOCKER_BUILDKIT=1,之后再进行构建。
格式
# Comment
INSTRUCTION arguments
其中 INSTRUCTION是大小写不敏感的,不过约定为大写,以更好的和参数进行区分。
parser directives: 可选,如果有,则在最前边,支持syntax,escape
以FROM 开头。
环境变量ENV
支持 $variable_name或者${variable_name}
${variable:-word} 如果参数设置了值,则为给定的值,否则参数的值为word
${variable:+word} 如果参数设置了值,则参数值为word,否则为空。
支持变量的命令如下: ADD,COPY,ENV,EXPOSE,FROM,LABEL,STOPSIGNAL,USER,VOLUME,WORKDIR,ONBUILD
FROM
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
只有ARG指令可能出现在FROM之前,可以出现多次,每次代表初始化一次新的stage。
RUN
RUN <command>
RUN ["executable","param1","param2"]
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)- 一般每个Dockerfile只有一个CMD,如果有多个,只有最后一个有效。必须用双引号。
LABEL
LABEL <key>=<value> <key>=<value> ...
MAINTAINER 废弃之后的代替方法 --->>> maintainer="SvenDowideit@home.org.au"
EXPOSE
EXPOSE <port> [<port>/<protocol> ...]
暴露端口,可以在run镜像的时候通过 -p 覆盖。
ADD
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",..."<dest>"]
COPY
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",..."<dest>"]
ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
VOLUME
VOLUME ["/data"] 创建一个挂载点
USER
USER <user>[:<group>]
USER <UID>[:<GID]
WORKDIR
WORKDIR /path/to/workdir 可以出现多次,如果是相对路径,则在上一个workdir的基础上创建。
ARG
ARG <name>[=<default value>]