Dockerfile常用指令详解

195 阅读3分钟

FROM:指定基础镜像

FROM  <image>
FROM  <image>:<tag>
FROM  <image>@<digest>

LABEL:指定镜像元数据, 如:镜像作者等

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

RUN:执行shell命令

每一个run指令都会建立一层,所以尽可能合并成一条指令

ADD:复制和解包文件

可认为是增强版的COPY,不仅支持COPY,还支持解缩。可以将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)

  • 如果src是目录,只复制目录中的内容,而非目录本身
  • 如果src是本地打包或压缩文件,如gzip, bzip2 ,xz ,将解包
  • 如果src是一个 URL ,下载后的文件权限自动设置为 600

COPY:复制本地主机的文件到容器中

  • 可以是多个、以及使用通配符,通配符规则满足Go的filepath.Match 规则
  • 使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等
  • 如果是目录,只复制目录内容,而非目录本身
# copy arthas
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas

CMD:容器启动命令

指定启动容器时默认执行的命令,即:如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT,那么就会使用执行CMD指定的默认的命令

每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行

如果用户启动容器时指定了运行的命令,如:docker run xxx /bin/bash,则/bin/bash 会覆盖 CMD 指定的命令

NTRYPOINT:入口点

功能类似于CMD,配置容器启动后执行的命令及参数,并且不可被 docker run 提供的参数覆盖,而是追加

如果docker run命令有参数,那么参数全部都会作为ENTRYPOINT的参数

可以通过docker run –entrypoint 参数在运行时替换

使用CMD要在运行时重新写命令才能追加运行参数,ENTRYPOINT则可以运行时接受新参数

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效

ENV:设置环境变量

指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持

ENV <key><value>
ENV <key>=<value>...

ARG:设置构建参数

ARG <name>[=<default value>]

示例

USER ${user:-some_user}
ARG user
USER $user
docker build --build-arg user=what_user .

# 
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER

EXPOSE:暴露端口

EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射

在启动容器时需要通过 -P 或-p ,Docker 主机会分配一个端口转发到指定暴露的端口,才可以使用

EXPOSE 80/tcp `80/udp`

STOPSIGNAL:退出容器的信号

USER:指定当前用户

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户

当服务不需要管理员权限时,可以通过该命令指定运行用户

这个用户必须是事先建立好的,否则无法切换

要临时获取管理员权限可以使用 gosu,而不推荐 sudo

VOLUME:挂载点

WORKDIR:指定工作目录

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内的默认目录

ONBUILD:子镜像引用父镜像的指令

新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。

.dockerignore文件

docs.docker.com/engine/refe…

与.gitignore文件类似,生成构建上下文时Docker客户端应忽略的文件和文件夹指定模式

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
LABEL <key>=<value> <key>=<value> <key>=<value> ...
ENV <key1>=<value1> <key2>=<value2>...

RUN groupadd -r mysql && useradd -r -g mysql mysql
USER mysql

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
RUN ["/bin/bash", "-c", "echo hello world"]

COPY hom* /mydir/    COPY hom?.txt /mydir/

VOLUME ["<容器内路径1>", "<容器内路径2>"...]
VOLUME <路径>

CMD [ "curl", "-s","https://ip.cn"]
# 使用 exec 执行,推荐方式,第一个参数必须是命令的全路径
CMD ["executable","param1","param2"] 
# 提供给 ENTRYPOINT 的默认参数;
CMD ["param1","param2"] 

参考资料