言简意赅的讲解Docker Compose build解决的痛点
之前我介绍了 Docker 的一些基础使用和常见问题。
后续遇见了拉取不到镜像的网络问题,解决了网络问题之后,有些童鞋反馈很多项目现场无法拉取镜像,甚至有内网限制的情况,需要优先拉取镜像否则本地构建,大家的需求越来越复杂,那本文就给大家提供一个解决思路。
在应用开发中,使用 Docker Compose 来管理多容器环境已经成为一种标准做法。一个常见需求是,在没有远程镜像时,我们希望自动构建本地镜像,而当远程镜像存在时,又能够优先拉取最新版本的镜像。本文将展示如何通过 Docker Compose 配置文件实现这一功能
1. Docker Compose 配置说明:如何优先拉取镜像并自动构建
通常,Docker Compose 需要配置镜像来启动服务,但有时我们并不希望预先定义镜像,而是希望在镜像不存在时自动构建,存在时直接拉取。这种方式非常适合需要在本地开发环境中进行快速迭代的项目。
以下是 Docker Compose 文件的一个例子,展示了如何配置后端服务来优先拉取镜像,如果没有找到指定的镜像,Docker Compose 会自动从本地构建:
version: '3.8'
services:
backend:
image: wenhao/backend:latest
container_name: backend
ports:
- "8080:8080"
environment:
- ENV_DB_HOST=postgresql
- ENV_DB_PORT=5432
volumes:
- ./log/backend:/logs
depends_on:
- postgresql
- keycloak
build:
context: ./backend # 如果没有远程镜像,尝试本地构建
dockerfile: Dockerfile
2. 关键配置解析
-
image
:指定服务的镜像名称。当该镜像存在时,Docker Compose 会直接拉取并启动容器。如果镜像不存在,则跳过拉取步骤,执行build
过程。 -
build
:定义了构建镜像的上下文路径(context
)以及 Dockerfile 的位置。此配置意味着当 Docker Compose 检测到镜像不可用时,会使用指定的本地目录和 Dockerfile 构建镜像。 -
depends_on
:指定该服务依赖于postgresql
和keycloak
服务,确保数据库和身份验证服务先启动。 -
volumes
:将本地日志目录映射到容器中,以便后端服务生成的日志能够持久化到本地文件系统。
3. 如何使用 Docker Compose 启动服务
在配置好 docker-compose.yml
文件后,使用以下命令启动服务:
docker-compose up -d
-d
参数表示在后台启动容器。此时,如果 Docker Hub 上有 wenhao/backend:latest
镜像,Docker Compose 会优先拉取该镜像;如果镜像不可用,Docker Compose 会根据配置的 build
指令从本地目录构建镜像。
4. 项目目录结构:避免困惑
为了避免团队开发过程中对项目结构产生困惑,我们建议遵循以下的项目目录结构:
/my-project
├── docker-compose.yml # Docker Compose 配置文件
├── /backend # 后端服务代码
│ ├── Dockerfile # 后端服务 Dockerfile
│ ├── /src # 后端服务源代码
│ └── /logs # 存储日志的目录
├── /postgresql # PostgreSQL 数据库配置(如果有)
└── /keycloak # Keycloak 身份认证服务配置(如果有)
backend/Dockerfile
:该文件用于构建后端服务的镜像。你可以根据自己的需求修改 Dockerfile 中的构建步骤。backend/src
:后端服务的源代码所在目录。backend/logs
:存放容器日志的目录,通过volumes
配置与宿主机同步。
这种目录结构确保了每个服务的代码和配置文件有清晰的分层,避免了代码混乱或服务间的依赖问题。
5. 启动成功后的展示
启动成功后,你还可以查看后台运行的服务状态:
docker-compose ps
以下是一个启动成功的示意图,可以看到这里提示拉取镜像失败,然后执行了本地构建并启动。
6. 总结:提高开发效率与灵活性
通过使用 Docker Compose 的 build
配置,我们可以在镜像可用时优先拉取,而没有镜像时再进行构建。这不仅提高了开发效率,还避免了在不同环境中手动构建镜像的麻烦。同时,清晰的项目目录结构和配套的 Dockerfile 使得团队成员可以更容易理解和参与到项目中。
通过上述内容,你就已经基本理解了这个方法,基础用法我也都有展示。如果你能融会贯通,我相信你会很强
Best
Wenhao (楠博万)