如何使用Dockerfile创建容器映像

如何使用Dockerfile创建容器映像

Dockerfile是一个基于文本的文档,用于创建容器映像。它为映像构建器提供有关要运行的命令、要复制的文件、启动命令等的说明。在这篇博客中,我们将介绍如何编写一个Dockerfile来生成一个可立即运行的应用程序容器映像。

Dockerfile 示例

以下是一个简单的Dockerfile示例,它将生成一个可立即运行的Python应用程序:

dockerfile 复制代码
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 通用指令

Dockerfile中一些最常见的指令包括:

  • FROM - 指定构建将扩展的基本图像。
  • WORKDIR - 指定"工作目录"或图像中复制文件和执行命令的路径。
  • COPY - 从主机复制文件并将它们放入容器映像中。
  • RUN - 运行指定的命令。
  • ENV - 设置正在运行的容器将使用的环境变量。
  • EXPOSE - 配置映像要公开的端口。
  • USER - 为所有后续指令设置默认用户。
  • CMD "", "" - 设置使用此映像的容器将运行的默认命令。

要通读所有说明或更详细地了解,请查看Dockerfile参考.

快速入门:构建Node.js应用程序的Dockerfile

在这个快速动手指南中,我们将编写一个Dockerfile来构建一个简单的Node.js应用程序。如果您不熟悉基于JavaScript的应用程序,请不要担心,按照以下步骤操作即可。

设置

  1. 下载并解压这个ZIP文件到您的机器上。
  2. 下载并安装Docker Desktop
  3. 在与package.json相同的文件夹中创建一个名为Dockerfile的文件。

创建Dockerfile

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

dockerfile 复制代码
FROM node:20-alpine

使用WORKDIR指令定义工作目录。这将指定未来命令将在哪里运行,目录文件将被复制到容器映像中:

dockerfile 复制代码
WORKDIR /usr/local/app

使用COPY指令将机器上项目中的所有文件复制到容器映像中:

dockerfile 复制代码
COPY . .

使用yarn CLI和包管理器安装应用程序的依赖项。为此,请使用RUN指令运行命令:

dockerfile 复制代码
RUN yarn install --production

最后,使用CMD指令指定要运行的默认命令:

dockerfile 复制代码
CMD ["node", "./src/index.js"]

有了这些步骤,你应该有以下Dockerfile:

dockerfile 复制代码
FROM node:20-alpine
WORKDIR /usr/local/app
COPY . .
RUN yarn install --production
CMD ["node", "./src/index.js"]

需要注意的是,此Dockerfile尚未遵循所有最佳实践(按设计)。它将构建应用程序,但构建不会像它们可能的那样快,并且图像可能不够安全。以下是一些改进建议:

  1. 使用多阶段构建:减少最终映像的大小。
  2. 缓存依赖项:最大化构建缓存,提高构建速度。
  3. 非root用户运行:提高容器的安全性。
相关推荐
一技安身4 小时前
【Docker】 镜像导出 & 导入,实验环境aarch64(arm64)Linux操作系统
linux·docker·容器
鹤落晴春8 小时前
【K8s】从 ConfigMap 到 Argo CD:Kubernetes 配置管理链路
运维·云原生·容器·kubernetes
ezreal_pan9 小时前
Pod 重启多场景复盘:OOM、日志阻塞、并发 map 读写导致程序崩溃
docker·k8s
玉宇夕落10 小时前
Docker + Milvus,数据库永久存放记忆,让对话历史永不丢失
数据库·docker·llm
名字还没想好☜12 小时前
Docker 镜像瘦身进阶:用 distroless/scratch 把 Go 服务打到 10MB,以及没 shell 怎么调试
运维·docker·容器·golang·kubernetes
JavaPub-rodert12 小时前
Docker 深入理解:从容器原理到生产环境最佳实践
运维·docker·容器
暖核14 小时前
Docker 入门|吃透容器生态与底层原理
运维·docker·容器
滕州市燕猫虎计算机科技工作室个体工商户15 小时前
Docker常用命令
运维·docker·容器
wdfk_prog15 小时前
lely-canopen-rtt:为什么推荐在 RT-Thread 上使用 Lely CANopen 构建主站
java·运维·缓存·docker·容器
智_永无止境16 小时前
一个Docker命令,40万首古诗词API开箱即用
docker·诗泉