编写 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. Dockerfile在与该文件相同的文件夹中创建一个名为 的文件package.json

    Dockerfile 文件扩展名

    请务必注意,该文件没有Dockerfile文件扩展名。有些编辑器会自动向文件添加扩展名(或抱怨它没有扩展名)。

  3. 在 中Dockerfile,通过添加以下行来定义您的基础映像:

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

    WORKDIR /usr/local/app
  5. 使用以下指令将计算机上项目中的所有文件复制到容器映像中COPY

    COPY . .
  6. 使用yarnCLI 和包管理器安装应用程序的依赖项。为此,请使用以下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 并学习了基础知识,是时候学习如何构建、标记和推送镜像了。