Skip to content

Dockerfile ​

Dockerfile 是用于构建 Docker 容器镜像的文本文件。它包含一系列指令,这些指令描述了如何从基础镜像开始,逐步添加应用程序和依赖项,并配置容器的环境。通过 Dockerfile,您可以定义容器的构建过程,使得整个过程可重复、自动化。

一个基本的 Dockerfile 通常包括以下几个部分:

Dockerfile
FROM node:16.20.2 AS builder

WORKDIR /app

COPY package.json pnpm-lock.yaml* ./
RUN yarn global add pnpm && pnpm i --frozen-lockfile;

COPY . .
RUN pnpm run docs:build

FROM nginx:stable-alpine

EXPOSE 80

COPY --from=builder /app/docs/.vitepress/dist /usr/share/nginx/html
  1. 基础镜像选择: 使用 FROM 指令选择一个已有的基础镜像作为构建的起点。例如:FROM node:16。
  2. 安装依赖项: 使用 RUN 指令执行安装软件包、库或其他依赖项的命令。例如:yarn global add pnpm && pnpm i --frozen-lockfile;。
  3. 设置环境变量: 使用 ENV 指令设置环境变量,定义容器中运行应用程序所需的环境。例如:ENV MY_ENV_VARIABLE=value。
  4. 复制文件: 使用 COPY 或 ADD 指令将本地文件复制到容器中。例如:COPY . /app。
  5. 工作目录设置: 使用 WORKDIR 指令设置容器内的工作目录。例如:WORKDIR /app。
  6. 暴露端口: 使用 EXPOSE 指令声明容器运行时需要监听的网络端口。例如:EXPOSE 80。
  7. 运行命令: 使用 CMD 或 ENTRYPOINT 指令定义容器启动时要执行的命令。例如:CMD ["executable","param1","param2"]。

通过编写 Dockerfile,您可以将应用程序、环境和依赖项打包成一个独立的容器镜像,使得应用的部署和分发变得更加方便、可重复。要构建容器,可以使用 docker build 命令,该命令会根据 Dockerfile 中的指令生成镜像。

Dockerfile 构建上下文 ​

构建上下文 是指传入docker build 命令的所有文件,一般将本地主机的一个包含 Dockerfile 的目录中的所有内容作为上下文。 上下文通过 docker build 命令传入到 Docker daemon 后,便开始安装 Dockerfile 中的内容构建镜像。

Dockerfile 指令 ​

Dockerfile中指令不区分大小写,但为了与参数区分,推荐使用大写。第一条指令必须是 FROM ,用于指定构建镜像的基础镜像。

Dockerfile 中可以使用一些参数化的指令,这些参数可以在构建容器镜像时传递,从而实现更灵活的构建过程。以下是 Dockerfile 中一些常见的参数化指令:

ARG (构建时参数) ​

用于定义构建时传递给 Dockerfile 的参数。这些参数在构建时通过 --build-arg 选项传递给 docker build 命令。例如:

dockerfile
ARG version=latest
FROM node:${version}

指令定义了一个变量,在构建时通过 docker build 命令使用 --build-arg <varname>=<value> 标志将其传递给构建器。

  • ARG 指令用于定义构建时的参数,这些参数可以在构建过程中被传递给 Dockerfile。
  • 构建参数可以通过 --build-arg 选项传递给 docker build 命令,例如:docker build --build-arg key=value .。
  • 构建参数的作用范围仅限于 Dockerfile 的构建阶段,无法在运行时影响容器的环境。
  • ARG 定义的参数在 FROM 指令之前可用,可以用于指定基础镜像的版本或其他构建时的变量。

ENV (运行时环境变量) ​

除了在构建过程中传递给 Dockerfile 的参数外,还可以在构建过程中设置环境变量。这些环境变量在构建过程中可以被引用,也会在运行时成为容器的环境变量。例如:

dockerfile
ARG version=latest
ENV APP_VERSION=${version}
  • ENV 指令用于设置容器运行时的环境变量,这些变量在容器启动后仍然有效。
  • ENV 设置的环境变量对容器内的进程、shell 等都是可见的,并可以在容器运行时使用。
  • ENV 定义的环境变量在构建过程中也可以被引用,但它们的主要作用是在容器运行时提供环境配置。
  • ENV 设置的变量可以在 Dockerfile 中的任何位置使用。

这些参数化指令使得 Dockerfile 在构建时更加灵活,可以根据需要进行定制。要使用这些参数,您可以在构建时通过 --build-arg 选项传递参数值,例如:

bash
docker build --build-arg version=2.0 -t my_image .

在上面的例子中,version 参数的值将会被设置为 2.0。请注意,ARG 定义的参数只在构建过程中有效,而 ENV 设置的环境变量则会在容器运行时保留。

总的来说,ARG 主要用于在构建时传递参数,而 ENV 用于在容器运行时设置环境变量。这两者在作用范围和使用场景上有所不同。

COPY ​

Dockerfile
COPY <src> <dest>

复制指令从中复制新的文件或目录,并将它们添加到路径处的容器文件系统中。

<src>指定的源可以多个,但必须是上下文的根目录的相对路径。不能使用COPY ../something /something

Dockerfile
# 添加以 hom 开头的所有文件到目录 /mydir 中
COPY hom* /mydir/

ADD ​

Dockerfile
ADD <src> <dest>

获取网络文件的文件名为 filename,该文件会被复制添加到 <dest>/<filename>

获取本地压缩归档文件,该文件在复制到容器中会被解压提取,若为归档文件则不会被解压提取

推荐使用COPY,因为 COPY只支持本地文件,相比ADD 而言,更透明。

RUN ​

RUN指令会在前一条命令创建出的镜像基础上创建一个容器,并在容器中运行命令,在命令结束后提交容器为新镜像,新镜像被Dockerfile中的下一条指令使用。

两种格式

Shell 格式,命令通过/bin/sh -c 运行

Dockerfile
RUN <command>

exec 格式 , 推荐格式,命令直接运行,容器不调用 shell 程序,即容器中没有 shell 程序,参数会当成 JSON 数组被 Docker 解析,故必须使用双引号而不能使用单引号。

Dockerfile
RUN ["executable", "params1","params2"]

因为不是在 Shell 中执行,所以环境变量的参数不会被替换,如:`

CMD ​

CMD提供容器运行时的默认值,可以是一条指令,也可以是一些参数。一个Dockerfile中可以有多条CMD指令,但只有最后一条CMD 指令有效。CMD 在构建镜像时不执行任何命令,而是在容器启动时默认将CMD指令作为第一条执行的命令。如果