为何已打包全量文件的docker-compose应用在其他机器运行报文件缺失错误
问题核心原因
- 你的docker-compose配置中所有自定义服务(myapp、migration、upgrade_head)都设置了
volumes: - .:/myapp绑定挂载规则,该规则会将宿主机当前目录的内容覆盖容器内/myapp路径下的所有文件,优先级高于镜像内置的文件。 - 笔记本A运行正常是因为当前目录包含完整的代码文件,挂载后内容与镜像内一致;笔记本B仅复制了docker-compose.yml和.env文件,当前目录没有alembic.ini、alembic目录等代码资源,挂载后直接覆盖了镜像内已经打包好的
/myapp目录,因此触发文件缺失报错。 - 额外的小问题:你修改后的docker-compose.yml里myapp服务仍保留了
build: .配置,若运行环境没有Dockerfile和代码可能触发构建失败,你当前镜像拉取成功是因为指定了image字段优先使用远端镜像,该字段可以删除避免不必要的问题。
修复方案
- 移除所有自定义服务下的
volumes: - .:/myapp配置,容器会直接使用镜像内提前打包好的/myapp目录下的全部文件,即可解决缺失报错。 - 可删除
migration和upgrade_head两个冗余服务:你已经在myapp的command中配置了alembic upgrade head启动时自动执行迁移,不需要额外的迁移服务,也避免了依赖顺序导致的重复执行问题。 - 修正Dockerfile中的无效CMD配置:当前Dockerfile的
CMD 0.0.0.0:$PORT为无效指令,虽然你在docker-compose中用command覆盖了该配置不会触发错误,但建议修正为标准启动指令,比如:
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
内容的提问来源于stack exchange,提问作者Peksio
相关产品推荐
相关产品推荐

