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(v1.x):命名格式为
- 项目名的来源:默认是
docker-compose.yml所在目录的名称,也可通过-p参数手动指定 - 特殊情况说明:早期部分macOS环境下的Docker Compose可能因兼容性保留旧格式,但本质是版本问题,与操作系统无关
可靠的解决思路
- 按版本动态选择分隔符:
通过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 "_" - 直接获取运行中的容器名称(推荐):
不依赖命名规则推导,直接通过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
相关产品推荐
相关产品推荐

