1. 概述

容器化技术在现代软件开发中扮演着至关重要的角色,它确保了环境间的一致性,并简化了依赖管理。Docker 作为主流的容器化平台,使开发者能够轻松管理容器。然而,很多时候我们需要对标准镜像进行定制,例如添加配置文件或依赖,而无需从头开始重建镜像。

本文将介绍如何使用 docker compose 向标准 Docker 镜像中添加文件,从而高效地扩展和定制镜像,避免直接修改原始的 Dockerfile。

2. 理解 Docker 镜像与 Docker Compose

在深入定制之前,先明确 Docker 镜像和 Docker Compose 的基本概念。

  • Docker 镜像是预构建的运行环境,包含运行应用所需的一切,比如代码、依赖库和配置。
  • Docker Compose 是一个用于管理多容器应用的工具,通过 docker-compose.yml 文件定义服务、网络、存储等容器化应用的运行方式。

有了这些基础,我们就可以用 Docker Compose 来定制镜像了。

3. 使用 Docker Compose 构建自定义镜像

这种方式通过 docker-compose build 命令,将本地文件打包进镜像中。适用于需要将配置、脚本等静态资源固化进镜像的场景。

3.1. 项目结构

示例项目结构如下:

├── docker-compose.yml
└── LocalFolder/
    ├── Dockerfile
    └── configfile/
        └── config.txt

其中 config.txt 的内容如下:

This is a demo config file.

3.2. docker-compose.yml 配置

services:
  my-config-app:
    build: LocalFolder/.
    image: custom-image

该配置定义了一个服务,使用 LocalFolder 目录下的 Dockerfile 构建名为 custom-image 的镜像。

3.3. Dockerfile 内容

FROM nginx:alpine
COPY ./configfile /LocalFolder/configfile

该 Dockerfile 基于 nginx:alpine,并将本地配置文件复制到镜像中。

3.4. 构建镜像

执行以下命令进行构建:

$ docker compose up --build

3.5. 检查镜像内容

构建完成后,可以运行容器并检查文件是否已正确打包进镜像:

$ docker run -it --rm custom-image /bin/bash
bash-5.1# cat /LocalFolder/configfile/config.txt
This is a demo config file.

✅ 文件存在,说明构建成功。

4. 使用 Docker Volume 挂载文件

这种方式通过 volume 将主机上的文件或目录挂载到容器中,适用于需要频繁修改配置或数据的场景,避免重复构建镜像。

4.1. 确定源目录与目标路径

确定本地目录(源)与容器内挂载路径(目标),注意两者路径可以不同。

4.2. docker-compose.yml 配置

services:
  web:
    image: nginx:alpine
    volumes:
      - ./LocalFolder:/usr/share/LocalFolder

该配置将本地的 LocalFolder 目录挂载到容器的 /usr/share/LocalFolder 路径下。

4.3. 启动容器

$ docker compose up -d

查看容器 ID:

$ docker ps

输出示例:

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
47624ce40bce   nginx:alpine   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   80/tcp    docker_compose_test-web-1

4.4. 检查挂载内容

进入容器检查文件是否挂载成功:

$ docker exec -it 47624ce40bce /bin/sh
/ # cd /usr/share/LocalFolder/configfile
/usr/share/LocalFolder/configfile # cat config.txt
This is a demo config file.

✅ 文件存在,说明 volume 挂载成功。

5. 使用 Docker Swarm 部署

Docker Swarm 是 Docker 原生的容器编排工具,支持集群部署与服务管理。我们也可以在 Swarm 模式下使用 bind mount 挂载本地文件。

5.1. 初始化 Swarm 模式

$ docker swarm init

5.2. 部署 Stack

使用 docker-compose.yml 文件部署服务:

$ docker stack deploy -c docker-compose.yml my_stack

之后使用 docker ps 检查容器状态,并验证挂载是否生效。

⚠️ 注意:Swarm 模式下,所有节点必须能访问挂载路径,否则服务可能无法启动。

6. 其他方式:docker cp

如果你不想构建或挂载,也可以直接将文件复制进运行中的容器,适用于临时调试或快速修改。

6.1. Docker Compose V1

$ docker cp ./config.txt "$(docker compose ps -q web)":/usr/share

6.2. Docker Compose V2

$ docker compose cp ./config.txt web:/usr/share

两种方式都能将本地文件复制进容器中,适合快速修改而不影响镜像构建流程。

7. 总结

本文介绍了几种使用 Docker Compose 定制标准镜像的方法:

方法 适用场景 是否持久化 是否需重建镜像
构建(build) 固定配置、脚本
Volume 挂载 动态文件、调试 ❌(容器销毁即失效)
docker cp 临时调试
Docker Swarm 集群部署 可选

✅ 推荐做法:

  • 需要长期保存配置:使用 docker-compose build
  • 频繁修改文件:使用 volume;
  • 临时修改:使用 docker cp
  • 生产部署:结合 volume 与 swarm 模式,实现灵活扩展。

合理选择方法,能让你在开发、调试、部署中游刃有余。


原始标题:Customizing Standard Docker Images Using docker compose