编写 Dockerfile

说明

Dockerfile 是一个基于文本的文档,用于创建容器镜像。它为镜像构建器提供指令,说明要运行的命令、要复制的文件、启动命令等。

例如,下面的 Dockerfile 将生成一个可立即运行的 Python 应用

FROM python:3.12
WORKDIR /usr/local/app

# Install the application dependencies
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# Copy in the source code
COPY src ./src
EXPOSE 5000

# Setup an app user so the container doesn't run as the root user
RUN useradd app
USER app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

常用指令

Dockerfile 中一些最常用的指令包括

  • FROM <image> - 这指定了构建将基于的基础镜像。
  • WORKDIR <path> - 这个指令指定了“工作目录”,即在镜像中文件将被复制和命令将要执行的路径。
  • COPY <host-path> <image-path> - 这个指令告诉构建器从主机复制文件到容器镜像中。
  • RUN <command> - 这个指令告诉构建器运行指定的命令。
  • ENV <name> <value> - 这个指令设置一个环境变量,供正在运行的容器使用。
  • EXPOSE <port-number> - 这个指令在镜像上设置配置,指示镜像希望暴露的端口。
  • USER <user-or-uid> - 这个指令设置后续所有指令的默认用户。
  • CMD ["<command>", "<arg1>"] - 这个指令设置使用该镜像的容器将要运行的默认命令。

要阅读所有指令或了解更多细节,请查阅Dockerfile 参考

动手实践

正如你在之前的例子中看到的,Dockerfile 通常遵循以下步骤

  1. 确定你的基础镜像
  2. 安装应用依赖项
  3. 复制所有相关的源代码和/或二进制文件
  4. 配置最终镜像

在这个快速实操指南中,你将编写一个构建简单 Node.js 应用的 Dockerfile。如果你不熟悉基于 JavaScript 的应用,不用担心。跟着本指南操作无需这方面的知识。

设置

下载此 ZIP 文件 并将其内容解压到你机器上的一个目录中。

创建 Dockerfile

现在你已经有了项目文件,可以创建 Dockerfile 了。

  1. 下载并安装 Docker Desktop。

  2. 在与文件 package.json 相同的文件夹中创建一个名为 Dockerfile 的文件。

    Dockerfile 文件扩展名

    重要的是要注意,Dockerfile 没有文件扩展名。一些编辑器会自动为文件添加扩展名(或抱怨它没有扩展名)。

  3. Dockerfile 中,通过添加以下行来定义你的基础镜像

    FROM node:20-alpine
  4. 现在,使用 WORKDIR 指令定义工作目录。这将指定未来命令将运行的位置以及文件将复制到容器镜像内的哪个目录。

    WORKDIR /app
  5. 使用 COPY 指令将你机器上项目中的所有文件复制到容器镜像中

    COPY . .
  6. 使用 yarn CLI 和包管理器安装应用的依赖项。为此,使用 RUN 指令运行一个命令

    RUN yarn install --production
  7. 最后,使用 CMD 指令指定要运行的默认命令

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

    这样一来,你应该会得到以下 Dockerfile

    FROM node:20-alpine
    WORKDIR /app
    COPY . .
    RUN yarn install --production
    CMD ["node", "./src/index.js"]

此 Dockerfile 尚未为生产环境准备就绪

重要的是要注意,此 Dockerfile 尚未遵循所有最佳实践(这是有意为之的)。它将构建应用,但构建速度不会像最佳实践那样快,镜像也不会像最佳实践那样安全。

继续阅读,了解如何让镜像最大限度地利用构建缓存、以非 root 用户身份运行以及进行多阶段构建。

使用 docker init 快速容器化新项目

docker init 命令将分析你的项目并快速创建一个 Dockerfile、一个 compose.yaml 和一个 .dockerignore 文件,帮助你快速启动和运行。由于你在这里专门学习 Dockerfile,所以现在不会使用它。但是,可以在这里了解更多信息

其他资源

要了解更多关于编写 Dockerfile 的信息,请访问以下资源

下一步

现在你已经创建了 Dockerfile 并学习了基础知识,接下来是学习如何构建、标记和推送镜像。

页面选项