Logo
Section 1 / 5

Dockerfile

学习在 Dockerfile 中可以使用的指令。

导入

Dockerfile

学习在 Dockerfile 中可以使用的指令。

Dockerfile

Dockerfile 是一个纯文本文件,用于描述构建镜像的步骤,通常用于您自己的应用程序。要从当前目录中的 Dockerfile 构建 Docker 镜像,请输入:

1docker image build -t <镜像名称> .

命令末尾的句点表示当前目录。若需使用其他路径或文件名,可附加 -f <文件> 参数。

以下命令使用频率最高。

# 注释

以 # 开头的行表示注释:

1#我的注释

ARG 参数

可以通过 --build-arg <名称>=<值> 选项在构建时传递变量。通过 ARG 语句导入该值:

1# 获取 myvar 2ARG myvar

若未传入值,可定义默认值:

1# 获取 myvar,默认值为 "myimage" 2ARG myvar=myimage

在其他地方使用该值时,需在前面加上 $ 符号:

1RUN echo $myvar

当值需要嵌入字符串中时,可以使用 ${name} 形式的替换:

1FROM ${myvar}:latest

ENV 环境变量

设置环境变量:

1ENV HOME=/home/app

在其他地方使用该值时,可通过在前面加 $ 或 ${} 来引用:

1RUN echo $HOME 2RUN echo ${HOME}

FROM <镜像> 起始镜像

使用现有镜像作为起点创建新镜像。这通常是 Dockerfile 中的第一条命令:

1# Alpine Linux 上的最新 Node LTS 版本 2FROM node:lts-alpine

WORKDIR 工作目录

设置后续 COPY、ADD、RUN、CMD 和 ENTRYPOINT 指令的工作目录:

1WORKDIR /home/myapp

COPY 从主机复制文件到镜像

支持使用文件模式:

1# 将所有文件复制到当前目录 2COPY . . 3 4# 将所有 txt 文件复制到 /doc/ 目录 5COPY *.txt /doc/ 6 7# 将所有文件复制并指定用户和组的所有权 8#(仅限 Linux 容器) 9COPY --chown=myuser:mygroup . .

ADD 添加文件

ADD 与 COPY 类似,但还支持使用 URL 和 tar 文件作为源。虽然这可能有用,但使用 RUN 链式调用 curl 和 tar 命令通常能生成更小、层数更少的 Docker 镜像。

挂载 VOLUME

通过创建挂载点,可以使文件和文件夹对其他容器可见。例如,以下示例中,/data/myvol 文件夹中的数据也可被网络中的其他容器访问:

1RUN mkdir -p /data/myvol 2VOLUME /data/myvol

可指定多个卷或挂载点:

1VOLUME /myvol1 /myvol2 /myvol3

示例用途:如果您正在将 Node.js 应用程序提供给 NGINX,并希望与 NGINX 共享部分 Node.js 文件,可以在 Node.js 容器中挂载客户端的 HTML、CSS、JavaScript 和媒体文件到一个 static 文件夹。这样,这些文件就可以由另一个容器中运行的 NGINX Web 服务器直接提供。

设置 USER

定义用于 RUN、CMD 和 ENTRYPOINT 指令的用户(可选地包括组):

1USER myuser

RUN 运行命令

RUN 在构建过程中执行指令,如安装或配置命令。Dockerfile 中可包含任意数量的 RUN 命令。

使用 shell 形式执行命令:

1RUN npm install

或使用 exec(数组)形式直接运行可执行文件,这是推荐方式:

1RUN ["npm", "install"]

📌 Exec 形式能正确接收 Unix 信号(如终止信号)。它是最常用的方式,也推荐优于 Shell 形式。Shell 形式省略了复杂的数组语法,Docker 会通过命令壳(shell)执行命令,前缀为 /bin/sh -c,因此实际运行的是 /bin/sh -c node ./index.js。应避免使用这种形式,因为它不会将信号传递给子进程,可能导致服务器终止时出现问题。

EXPOSE 暴露端口

通知 Docker 容器将在指定的网络端口上监听。注意,暴露的端口必须在使用 docker run 时通过 -p 发布:

1EXPOSE 3000

CMD 执行容器

CMD 设置默认的应用启动指令,当使用 docker run 启动容器时未指定命令时生效。Dockerfile 中只允许一条 CMD,因此只有最后一条会被处理。

命令可使用 shell 形式:

1CMD node ./index.js

或使用 exec(数组)形式直接运行可执行文件:

1CMD ["node", "/index.js"]

通常情况下,使用 CMD 提供一个默认命令,可在启动容器时通过命令行覆盖。

ENTRYPOINT 执行容器

ENTRYPOINT 设置构建可执行 Docker 镜像时的启动指令。容器启动时应用将运行。Dockerfile 中只允许一条 ENTRYPOINT,它会覆盖任何 CMD 指令。

命令可使用 shell 形式:

1ENTRYPOINT node ./index.js

或使用 exec(数组)形式——推荐方式——直接运行可执行文件:

1ENTRYPOINT ["node", "/index.js"]

.dockerignore 文件模式

.dockerignore 文件指定在使用 COPY 和 ADD 时应忽略的文件名模式。例如:

1Dockerfile 2docker*.yml 3 4.git 5.gitignore 6.config 7 8.npm 9.vscode 10node_modules 11 12README.md

练习

上述讨论的 Dockerfile 如下所示。对于名为 myimage 的镜像,您可以使用以下命令进行构建:

1docker image build -t myimage .

查看您的镜像,请使用:

1docker images

No configuration found for ID: e1bad28773425e7a8826b4109539113061ab44b934abe33492cc45da6281f253

Docker 命令行工具命令

Docker Compose 文件