Dockerfile指令备忘

1,231 阅读3分钟

引言

  在频繁使用Docker技术的当下,构建Docker镜像是日常开发中的基本技能了,自然我们就需要会编写Dockerfile文件,下面将详细介绍一下常用的Dockerfile指令,算是做一个备忘录吧。

  • 指令必须是大写
  • 每一个指令会创建一个新的镜像层

Dockerfile常用指令

FROM

# 构建所需的基础镜像(已下载),格式:
# --platform指定构建的平台,默认使用构建的目标平台(可选)
# image基础镜像
# name给使用镜像取一个别称,供后面指令使用
# tag指定基础镜像的标签,默认当前版本(可选)
# digest指定基础镜像的摘要,默认当前版本(可选)
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

RUN

# 构建时需要运行的命令
# shell形式,可以使用变量
RUN <command>
# exec形式,不可以使用变量
RUN ["executable", "param1", "param2"]

EXPOSE

# 通知 Docker 容器在运行时侦听指定的网络端口。可以指定端口是监听TCP还是UDP,如果不指定协议,默认为TCP。
EXPOSE <port> [<port>/<protocol>...]

ENV

# 设置全局的环境变量
ENV <key>=<value> ...

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>"]

VOLUME

# 创建一个具有指定名称的挂载点,并将其标记为保存来自本机主机或其他容器的外部挂载卷。该值可以是 JSON 数组、带有多个参数的纯字符串
VOLUME ["/data"]

WORKDIR

# 指定进入容器后的工作目录
WORKDIR /path/to/workdir

ENTRYPOINT

# 指定容器启动时要运行的命令,可以追加命令
# exec形式,首选
ENTRYPOINT ["executable", "param1", "param2"]
# shell形式
ENTRYPOINT command param1 param2

CMD

# 指定容器启动时要运行的命令,不可以追加命令,会重写命令
# exec形式,首选
CMD ["executable","param1","param2"]
# 作为ENTRYPOINT的默认参数
CMD ["param1","param2"]
# shell形式
CMD command param1 param2

USER

# 指定容器运行时要使用的用户名
USER <user>[:<group>]
USER <UID>[:<GID>]

ARG

# 定义一个变量,可以在构建或Dockerfile指令中使用
ARG <name>[=<default value>]

# 在Dockerfile文件指令中使用
ARG version=latest
ARG user=root
FROM node:$version
USER $user
# 在构建镜像命令中使用
ARG version
ARG user
docker build --build-arg version=1.0.0 user=root -t qiuqfang/node .

SHELL

# 允许覆盖用于命令的 shell 形式的默认 shell
SHELL ["executable", "parameters"]

# 在Windows上比较常用,cmd 与 powershell是两种不同的shell
# Windows中 cmd 为默认shell,Write-Host 为 powershell 中的命令,需加上 powershell -command 
RUN powershell -command Write-Host hello world
# 切换默认的shell为powershell
SHELL ["powershell", "-command"]
# 切换后,则可以直接使用 Write-Host 输出 hello world
RUN Write-Host hello world
# 切换默认的shell为cmd
SHELL ["cmd", "/S", "/C"]

ONBUILD

# 将一个触发指令添加到图像中
ONBUILD <INSTRUCTION>

STOPSIGNAL

# 设置将发送到容器退出的系统调用信号
STOPSIGNAL signal

HEALTHCHECK

# 通过在容器内运行命令来检查容器健康状况
HEALTHCHECK [OPTIONS] CMD command
# 禁用从基础镜像继承的任何健康检查
HEALTHCHECK NONE

\