深色模式
Dockerfile 指令
参考
常用指令
FROM
指定基础镜像,在 Docker Hub 上有非常多的高质量的官方镜像。
一个 Dockerfile
中 FROM
是必备的指令,并且必须是第一条指令。
docker
FROM scratch
...
WORKDIR
指定当前工作目录,此指令会改变以后各层的工作目录的位置。
可以使用绝对路径或相对路径,相对路径相对于上一个WORKDIR
指令的路径。
docker
WORKDIR /a
WORKDIR b
WORKDIR c # /a/b/c
RUN
执行指令,格式有两种:
shell 格式:
RUN <命令>
docker
RUN apt-get update
exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
docker
RUN ["apt-get", "update"]
减少RUN
的层数
每一条RUN
指令都会使镜像增加一层,减少使用RUN
的次数,就能减少镜像层数。
docker
RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
清理
在RUN
指令的最后加上--auto-remove
,清理掉缓存等不需要的东西。
COPY
复制文件,与RUN
指令一样,有 shell 格式与 exec 格式:
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
COPY
指令将从构建上下文目录中 <源路径>
的文件/目录复制到新的一层的镜像内的 <目标路径>
位置。比如:
docker
COPY package.json /usr/src/app/
<源路径>
可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 filepath.Match
规则,如:
docker
COPY a.txt b.txt /mydir/
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>
可以是容器内的绝对路径,也可以是相对路径(相对于 WORKDIR
指定的工作目录)。
目标路径会被自动创建。
COPY
指令会保留文件的元信息。
可以加上 --chown=<user>:<group>
选项来改变文件的所属用户及所属组:
docker
COPY --chown=55:mygroup files* /mydir/
COPY --chown=bin files* /mydir/
COPY --chown=1 files* /mydir/
COPY --chown=10:11 files* /mydir/
ADD
ADD
指令和 COPY
的格式和性质基本一致。但是在 COPY
基础上增加了一些功能。
尽可能使用COPY
,而不使用ADD
。
ENV
设置环境变量,格式有两种:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ENV
设置的环境变量,可以被后面的其它指令使用,也可以被容器里的应用使用。
ARG
构建参数,格式:
ARG <参数名>[=<默认值>]
ARG
设置的构建参数,可以被后面的其它指令使用,但不能被容器里的应用使用。
ARG
指令有生效范围,如果在 FROM
指令之前指定,那么只能用于 FROM
指令中,包括后面的每一条FROM
指令。
在其它指令中使用不了,除非另外再次使用ARG
指令。
VOLUME
定义匿名卷,格式:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
CMD
容器启动命令,有两种格式:
CMD <命令>
CMD ["可执行文件", "参数1", "参数2"...]
docker run
时,最后面的命令会覆盖CMD
指令。
ENTRYPOINT
容器启动入口点,也有两种格式。
当使用了ENTRYPOINT
指令后,CMD指令的含义就变成了:将 CMD
的内容作为参数传给 ENTRYPOINT
指令。
EXPOSE
暴露端口,格式:EXPOSE <端口1> [<端口2>...]
。
EXPOSE
指令是声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务(提示作用)。
要将 EXPOSE
和在运行时使用 -p <宿主端口>:<容器端口>
区分开来。
SHELL
指定shell,格式:SHELL ["executable", "parameters"]
SHELL
指令可以指定 RUN
ENTRYPOINT
CMD
指令的 shell,Linux 中默认为 ["/bin/sh", "-c"]
docker
SHELL ["/bin/sh", "-c"]
RUN lll ; ls
SHELL ["/bin/sh", "-cex"]
RUN lll ; ls
LABEL
向镜像添加元数据。
LABEL <key>=<value> <key>=<value> <key>=<value> ...