通过GitLab容器注册表共享DRF API Docker镜像后,启动时出现manage.py文件不存在的错误
通过GitLab容器注册表共享DRF API Docker镜像后,启动时出现manage.py文件不存在的错误
嘿,这个问题我太熟了!你遇到的python: can't open file '/app/manage.py'错误,根源就在你的docker-compose.yml配置里。
问题分析
你给api服务加了这么一行卷挂载配置:
volumes: - ./app:/app
这行代码的作用是把你本地机器上的./app目录,直接覆盖容器镜像里已经存在的/app目录。
在你自己的机器上运行时没问题,是因为你的项目目录里本来就有app文件夹,挂载后容器能正常找到manage.py。但当你朋友(或者你自己在空的新目录)运行时,这个目录里根本没有app文件夹,容器里的/app就变成空的了,自然找不到文件。
解决方案
很简单,只需要修改docker-compose.yml,移除这个不必要的卷挂载:
- 编辑你的
docker-compose.yml,删掉api服务下的- ./app:/app这一行,修改后的api服务配置大概是这样:
services: api: container_name: wishlist_api image: registry.gitlab.com/[你的项目路径]:latest ports: - "8080:8080" # 删掉下面这两行卷挂载配置 # volumes: # - ./app:/app command: > sh -c "python manage.py wait_for_db && python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8080" environment: - DB_HOST=db - DB_NAME=wishlistDB - DB_USER=postgres - DB_PASS=Testowe123! - DB_PORT=5432 depends_on: - db
- 从你的Dockerfile来看,你已经用
COPY ./app /app把代码复制进镜像了,所以只要把修改后的docker-compose.yml分享给朋友就行。如果不确定镜像内容是否正确,也可以重新构建并推送一次镜像:
docker build -t registry.gitlab.com/[你的项目路径]:latest . docker push registry.gitlab.com/[你的项目路径]:latest
- 让你的朋友执行以下步骤:
- 创建一个新目录,把修改后的
docker-compose.yml放进去 - 拉取镜像:
docker pull registry.gitlab.com/[你的项目路径]:latest - 启动服务:
docker-compose up
- 创建一个新目录,把修改后的
额外建议(本地开发用)
如果你平时本地开发需要挂载app目录(这样修改代码不用重新构建镜像),可以给这个卷挂载加个开关,比如用环境变量控制:
volumes: - ${DEV_MOUNT:-none}:/app
然后本地开发时,运行命令前先设置环境变量:
export DEV_MOUNT=./app docker-compose up
分享给别人或者部署到VPS时,不用设置这个变量,容器就会使用镜像里的代码,不会出现文件缺失的问题。
备注:内容来源于stack exchange,提问作者KrysPy
相关产品推荐
相关产品推荐

