编写 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 通常遵循以下步骤
- 确定您的基镜像
- 安装应用程序依赖项
- 复制任何相关的源代码和/或二进制文件
- 配置最终镜像
在本快速实践指南中,您将编写一个 Dockerfile 来构建一个简单的 Node.js 应用程序。如果您不熟悉基于 JavaScript 的应用程序,请不要担心。遵循本指南不需要您了解它。
设置
下载此 ZIP 文件并将其内容解压到您机器上的目录中。
创建 Dockerfile
现在您已经有了项目,您可以创建 Dockerfile 了。
下载并安装 Docker Desktop。
在与
package.json文件相同的文件夹中创建一个名为Dockerfile的文件。Dockerfile 文件扩展名
重要的是要注意
Dockerfile没有文件扩展名。一些编辑器会自动为文件添加扩展名(或抱怨它没有扩展名)。在
Dockerfile中,使用以下行定义您的基镜像FROM node:20-alpine现在,使用
WORKDIR指令定义工作目录。这将指定未来命令将在何处运行以及将文件复制到容器镜像中的目录。WORKDIR /usr/local/app使用
COPY指令将您机器上的项目中的所有文件复制到容器镜像中COPY . .使用
yarnCLI 和包管理器安装应用程序的依赖项。为此,使用RUN指令运行一个命令RUN yarn install --production最后,使用
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 并学习了基础知识,现在该学习构建、标记和推送镜像了。