编写 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>
- 此指令告诉 Builder 运行指定的命令。ENV <name> <value>
- 此指令设置正在运行的容器将使用的环境变量。EXPOSE <port-number>
- 此指令在镜像上设置配置,以指示镜像要公开的端口。USER <user-or-uid>
- 该指令设置所有后续指令的默认用户。CMD ["<command>", "<arg1>"]
- 此指令设置使用此镜像的容器将运行的默认命令。
要通读所有说明或更详细地了解,请查看 Dockerfile 参考。
试用
正如您在前面的示例中看到的那样,Dockerfile 通常遵循以下步骤:
- 确定基础镜像
- 安装应用程序依赖项
- 复制任何相关的源代码和/或Binaries
- 配置最终镜像
在本快速动手指南中,您将编写一个 Dockerfile 来构建一个简单的 Node.js 应用程序。如果您不熟悉基于 JavaScript 的应用程序,请不要担心。没有必要遵循本指南。
建立
下载此 ZIP 文件并将内容提取到计算机上的目录中。
创建 Dockerfile
现在您拥有了项目,可以创建Dockerfile
.
下载并安装Docker 桌面。
创建一个名为
Dockerfile
与文件位于同一文件夹中package.json
.Dockerfile 文件扩展名
请务必注意,
Dockerfile
没有文件扩展名。一些编辑 将自动为文件添加扩展名(或抱怨它没有扩展名)。在
Dockerfile
,通过添加以下行来定义您的基础镜像:FROM node:20-alpine
现在,使用
WORKDIR
指令。这将指定将来命令的运行位置,并将目录文件复制到容器镜像中。WORKDIR /app
使用
COPY
指令:COPY . .
使用
yarn
CLI 和软件包管理器。为此,请使用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
Command 将分析您的项目并快速创建 一个 Dockerfile、一个compose.yaml
和.dockerignore
,帮助您获取 不断前进。由于您在这里专门学习了 Dockerfile, 你现在不会使用它。但是,请在此处了解更多信息。
其他资源
要了解有关编写 Dockerfile 的更多信息,请访问以下资源:
后续步骤
现在,您已经创建了 Dockerfile 并了解了基础知识,是时候了解如何构建、标记和推送镜像了。