Dockerfile
Dockerfile 是用于构建 Docker 容器镜像的文本文件。它包含一系列指令,这些指令描述了如何从基础镜像开始,逐步添加应用程序和依赖项,并配置容器的环境。通过 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- 基础镜像选择: 使用
FROM指令选择一个已有的基础镜像作为构建的起点。例如:FROM node:16。 - 安装依赖项: 使用
RUN指令执行安装软件包、库或其他依赖项的命令。例如:yarn global add pnpm && pnpm i --frozen-lockfile;。 - 设置环境变量: 使用
ENV指令设置环境变量,定义容器中运行应用程序所需的环境。例如:ENV MY_ENV_VARIABLE=value。 - 复制文件: 使用
COPY或ADD指令将本地文件复制到容器中。例如:COPY . /app。 - 工作目录设置: 使用
WORKDIR指令设置容器内的工作目录。例如:WORKDIR /app。 - 暴露端口: 使用
EXPOSE指令声明容器运行时需要监听的网络端口。例如:EXPOSE 80。 - 运行命令: 使用
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 命令。例如:
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 的参数外,还可以在构建过程中设置环境变量。这些环境变量在构建过程中可以被引用,也会在运行时成为容器的环境变量。例如:
ARG version=latest
ENV APP_VERSION=${version}ENV指令用于设置容器运行时的环境变量,这些变量在容器启动后仍然有效。ENV设置的环境变量对容器内的进程、shell 等都是可见的,并可以在容器运行时使用。ENV定义的环境变量在构建过程中也可以被引用,但它们的主要作用是在容器运行时提供环境配置。ENV设置的变量可以在 Dockerfile 中的任何位置使用。
这些参数化指令使得 Dockerfile 在构建时更加灵活,可以根据需要进行定制。要使用这些参数,您可以在构建时通过 --build-arg 选项传递参数值,例如:
docker build --build-arg version=2.0 -t my_image .在上面的例子中,version 参数的值将会被设置为 2.0。请注意,ARG 定义的参数只在构建过程中有效,而 ENV 设置的环境变量则会在容器运行时保留。
总的来说,ARG 主要用于在构建时传递参数,而 ENV 用于在容器运行时设置环境变量。这两者在作用范围和使用场景上有所不同。
COPY
COPY <src> <dest>复制指令从中复制新的文件或目录,并将它们添加到路径处的容器文件系统中。
<src>指定的源可以多个,但必须是上下文的根目录的相对路径。不能使用COPY ../something /something
# 添加以 hom 开头的所有文件到目录 /mydir 中
COPY hom* /mydir/ADD
ADD <src> <dest>获取网络文件的文件名为 filename,该文件会被复制添加到 <dest>/<filename>
获取本地压缩归档文件,该文件在复制到容器中会被解压提取,若为归档文件则不会被解压提取
推荐使用COPY,因为 COPY只支持本地文件,相比ADD 而言,更透明。
RUN
RUN指令会在前一条命令创建出的镜像基础上创建一个容器,并在容器中运行命令,在命令结束后提交容器为新镜像,新镜像被Dockerfile中的下一条指令使用。
两种格式
Shell 格式,命令通过/bin/sh -c 运行
RUN <command>exec 格式 , 推荐格式,命令直接运行,容器不调用 shell 程序,即容器中没有 shell 程序,参数会当成 JSON 数组被 Docker 解析,故必须使用双引号而不能使用单引号。
RUN ["executable", "params1","params2"]因为不是在 Shell 中执行,所以环境变量的参数不会被替换,如:`
CMD
CMD提供容器运行时的默认值,可以是一条指令,也可以是一些参数。一个Dockerfile中可以有多条CMD指令,但只有最后一条CMD 指令有效。CMD 在构建镜像时不执行任何命令,而是在容器启动时默认将CMD指令作为第一条执行的命令。如果
- Dockerfile 文件中支持的环境变量