Docker镜像在Windows和一台Ubuntu正常运行,另一台报错找不到gunicorn.conf
根因分析
最核心的触发原因是挂载的外部卷覆盖了镜像内的/code目录:
你的docker-compose配置里将外部命名卷query-results-volume直接挂载到了容器的/code路径,而你的gunicorn配置文件是构建镜像时COPY到/code/docker/semantic_search_django/gunicorn.conf路径下的。当故障机器上的该外部卷不存在对应目录结构时,挂载后会直接覆盖镜像中原有的/code目录内容,导致程序找不到配置文件。
其他可能的次要原因:docker版本差异、卷权限异常、selinux限制。
排查步骤
- 确认镜像本身无问题:在故障机器上执行以下命令,不挂载卷直接检查镜像内的文件是否存在
如果正常输出文件信息,说明镜像完整,问题出在挂载环节。docker run --rm --entrypoint ls m.artifactory.com/ciee_ssrdjango /code/docker/semantic_search_django/gunicorn.conf - 检查故障机器的卷内容:执行命令查看命名卷内的目录结构
正常情况下会输出gunicorn.conf文件,故障机器此处会提示目录不存在。docker run --rm -v query-results-volume:/vol busybox ls -la /vol/docker/semantic_search_django/ - 对比两台Linux设备的docker版本:执行
docker --version、docker compose version确认是否存在版本差异导致挂载逻辑不同。 - 检查docker daemon日志:启动容器时执行
journalctl -u docker.service -f查看是否有挂载相关的权限报错。
解决方案
永久修复(推荐)
修改docker-compose.yml的挂载配置,不要直接挂载到整个/code目录,仅挂载需要持久化的query_results子目录即可,避免覆盖镜像内的代码和配置:
将原配置中的
volumes: - query-results-volume:/code
修改为
volumes: - query-results-volume:/code/query_results
修改后重新执行docker-compose up -d即可。
临时修复(不修改配置的应急方案)
将镜像内的/code内容同步到故障机器的命名卷中:
- 停止删除运行失败的容器
- 执行命令同步文件:
docker run --rm -v query-results-volume:/vol m.artifactory.com/ciee_ssrdjango cp -r /code/* /vol/ - 重新启动容器即可。
兜底修复
直接删除故障机器上的旧卷,让docker重新创建新卷(第一次挂载新卷时会自动将镜像内/code目录的内容同步到卷中):
docker stop ciee_ssrdjango docker rm ciee_ssrdjango docker volume rm query-results-volume docker-compose up -d
内容的提问来源于stack exchange,提问作者Phil O
相关产品推荐
相关产品推荐

