Files
nexus/wiki/concepts/external配置.md

4.2 KiB
Raw Blame History

title, type, tags, date
title type tags date
external配置 concept
docker
compose
configuration
volume
network
2026-04-22

external配置

Definition

external: true 是 Docker Compose 文件中的一种声明式配置,用于告诉 Compose 某个 Volume 或 Network 已经存在,不要尝试创建它,而是直接使用已存在的资源。适用于需要保留数据、不希望 Compose 管理资源生命周期的场景。

Syntax

Volume

volumes:
  portainer_data:
    external: true

# 引用时直接使用名称
services:
  portainer:
    volumes:
      - portainer_data:/data

Network网络

networks:
  portainer_network:
    external: true

services:
  portainer:
    networks:
      - portainer_network

Behavior Comparison

配置 Compose up Compose down
external: false(默认) 自动创建资源 自动删除资源
external: true 不会创建,直接使用已存在的 不会删除,保持资源
external: { name: xxx } 使用指定名称的已存在资源 不会删除

Common Use Cases

Case 1: 保留数据重装应用

# Portainer 重装时保留 portainer_data 卷
volumes:
  portainer_data:
    external: true

services:
  portainer:
    image: portainer/portainer-ce:lts
    volumes:
      - portainer_data:/data

这样即使删除并重建 Portainer 容器,用户账户和配置也不会丢失。

Case 2: 多个 Compose 共享网络

# compose-a.yml
networks:
  shared_backend:
    external: true

# compose-b.yml同一机器上的另一个项目
networks:
  shared_backend:
    external: true

两个 compose 文件可以连接同一个外部网络,实现跨项目通信。

Case 3: 预创建的基础设施

运维人员预先创建好 Volume/Network开发者通过 external: true 引用:

# 运维预先创建
docker network create monitoring
docker volume create prometheus_data

# 开发 compose 中声明
networks:
  monitoring:
    external: true
volumes:
  prometheus_data:
    external: true

Limitations

1. 资源不存在会导致错误

# 如果 portainer_data 卷不存在compose up 会报错:
# ERROR: Volume portainer_data declared as external, but could not be found

解决:先确认资源存在,或使用脚本预创建:

docker volume create portainer_data 2>/dev/null || true
docker compose up -d

2. 不能控制生命周期

external: true 资源不会被 docker compose down --volumes 删除。需要手动清理:

docker volume rm portainer_data
docker network rm portainer_network

3. Compose 文件中的其他字段无效

volumes:
  portainer_data:
    external: true
    driver: local    # ❌ 会被忽略
    driver_opts: {}  # ❌ 会被忽略

External with Custom Name

如果已存在的资源名称与 compose 中声明的名称不同,使用 external.name 指定:

volumes:
  app_data:
    external:
      name: old_project_data_volume

Best Practices

  1. 始终显式声明:所有 external 资源都应在 compose 文件中明确声明,便于维护者理解
  2. 文档化:在 README 中记录哪些资源需要预先创建
  3. 命名规范:使用统一的前缀或命名约定(如 project_name_resource
  4. 验证脚本:部署前运行验证脚本确保依赖资源存在
  • Portainer — 典型的需要 external 配置保留数据的应用

See Also