You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose容器名称分隔符规则咨询:短横线还是下划线?

Docker Compose 自动生成容器名称的规则解析

我开发的pymediawikidocker工具可自动为MediaWiki生成Docker镜像与容器,实现一键搭建不同版本、带扩展、不同数据库配置的MediaWiki集群用于测试。工具依赖python-on-whales库处理Docker Compose命令,但目前遇到问题:程序需要按Docker Compose规则计算自动生成的容器名称,然而不同操作系统和Docker Compose版本下生成的名称格式不一致,例如出现mw1_35_8-mw-1或mw_135_8_mw_1这类差异。

此前参考GitHub相关issue,尝试过通过系统判断分隔符的代码:

separator="-" if platform.system()=="Darwin" else "_"

但仍无法得到一致结果,CI测试持续失败。目前只能临时通过尝试两种分隔符解决,希望明确Docker Compose生成容器名称的具体规则。

附上生成的示例docker-compose.yml:

version: "3"

# 2 services
#   db - database
#   mw - mediawiki
services:

#  MySQL compatible relational database
  db:
# use original image
    image: mariadb:10.9
    
    restart: always
    
    environment:
      MYSQL_DATABASE: wiki
      MYSQL_USER: wikiuser
      MYSQL_PASSWORD: "BOqdADGJYADBsZK7fg"
      MYSQL_ROOT_PASSWORD: "hnOZz1xbkvySSh3RJg"
    
    ports:
      - 9308:3306
    
    volumes:
       - etc:/etc
      
# mediawiki
  mw:
    #image: mediawiki:1.35.8
    # use the Dockerfile in this directory
    build: .
       
    restart: always
    
    ports:
      - 9082:80
    
    links:
      - db
      
    depends_on:
      - db
    
    volumes:
      - wikiimages:/var/www/html/images
    # After initial setup, download LocalSettings.php to the same directory as
    # this yaml and uncomment the following line and use compose to restart
    # the mediawiki service
    # - ./LocalSettings.php:/var/www/html/LocalSettings.php
    
volumes:
  etc:
    driver: local
  wikiimages:
    driver: local

Docker Compose 容器命名核心规则

  • 版本差异是根本原因:
    • 旧版Docker Compose(v1.x):命名格式为[项目名]_[服务名]_[实例序号],分隔符统一使用下划线_
    • 新版Docker Compose(v2.x及以上):命名格式为[项目名]-[服务名]-[实例序号],分隔符统一使用连字符-
  • 项目名的来源:默认是docker-compose.yml所在目录的名称,也可通过-p参数手动指定
  • 特殊情况说明:早期部分macOS环境下的Docker Compose可能因兼容性保留旧格式,但本质是版本问题,与操作系统无关

可靠的解决思路

  1. 按版本动态选择分隔符:
    通过python-on-whales获取Docker Compose版本,根据版本号判断使用的分隔符:
    from python_on_whales import docker
    import semver
    
    # 获取Compose版本并去除前缀(如v2.20.0转为2.20.0)
    compose_version_str = docker.compose.version()["version"].lstrip("v")
    separator = "-" if semver.compare(compose_version_str, "2.0.0") >= 0 else "_"
    
  2. 直接获取运行中的容器名称(推荐):
    不依赖命名规则推导,直接通过Docker Compose命令查询实际容器名称,彻底规避版本/系统差异:
    from python_on_whales import docker
    
    # 查询指定服务的容器信息,提取名称
    mw_containers = docker.compose.ps(services=["mw"], format="json")
    if mw_containers:
        target_container_name = mw_containers[0]["Name"]
    

内容的提问来源于stack exchange,提问作者Wolfgang Fahl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:15:34