之前写了一个脚本,依赖 compose 起的容器的 name,过了一段时间有人问我为什么跑不起来了,而且报错 no such container,我就用我自己的环境重新试了一次,是完全没问题的,那问题就出在环境上。对比了一下输出,发现两个环境中 docker-compose 生成的容器的名称不一样,在他的环境中,容器名称最前面中的横线(也就是连字符,-)不见了!因为 docker-compose 默认的命名规范是 <project>_<service>_<index>[_<slug>]
,也就是说,他的 docker-compose 把最前面的 project name 里的连字符给吃掉了。
查了一下 docker-compose 的源码。我的环境是 v1.29.2,:
def get_project_name(working_dir, project_name=None, environment=None):
def normalize_name(name):
return re.sub(r'[^-_a-z0-9]', '', name.lower())
而他的环境是 v1.17.1,估计是用 apt 安装的:
def get_project_name(working_dir, project_name=None, environment=None):
def normalize_name(name):
return re.sub(r'[^a-z0-9]', '', name.lower())
可以看出,新版本在生成 project name 的时候选择保留了连字符,而老版本的没有。然后这个变更的时间是 2018 年,v1.17.1 是 2017 年的包,所以出了这个问题。
看 github 上有人讨论这个问题:https://github.com/docker/compose/issues/4002 和 https://github.com/docker/compose/pull/572,给出的原因居然是因为觉得混用连字符和下划线会很丑……
解决办法就是升级到新版本。