Docker-Compose构建运行失败求助:Django+MySQL容器化部署问题
问题:Django+MySQL项目容器化构建与启动失败
问题场景
Windows环境下本地运行正常的Django+MySQL项目,编写Dockerfile和docker-compose.yml后,执行docker-compose build无有效构建输出,执行docker-compose up时出现拉取blogs、data镜像权限被拒的错误。
配置文件
Dockerfile
FROM python:3.10 ENV DockerHOME=/home/app/webapp RUN mkdir -p $DockerHOME WORKDIR $DockerHOME ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 RUN pip install --upgrade pip COPY . $DockerHOME RUN pip install -r requirements.txt # Add Django migrations and apply them RUN python manage.py makemigrations RUN python manage.py migrate EXPOSE 8080 CMD ["python", "manage.py", "runserver", "0.0.0.0:8080"]
docker-compose.yml
version: '3' services: web: image: blogs:latest container_name: blogs_web ports: - "8080:8080" volumes: - .:/home/app/webapp environment: - PYTHONDONTWRITEBYTECODE=1 - PYTHONUNBUFFERED=1 - SECRET_KEY=${SECRET_KEY} - DEBUG=${DEBUG} - DATABASE_NAME=${DATABASE_NAME} - DATABASE_USER=${DATABASE_USER} - DATABASE_PASSWORD=${DATABASE_PASSWORD} - DATABASE_HOST=${DATABASE_HOST} - DATABASE_PORT=${DATABASE_PORT} depends_on: - db db: image: data:latest container_name: blogs_db environment: MYSQL_DATABASE: ${DATABASE_NAME} MYSQL_USER: ${DATABASE_USER} MYSQL_PASSWORD: ${DATABASE_PASSWORD} MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD} ports: - "3306:3306" command: --default-authentication-plugin=mysql_native_password
报错信息
docker-compose build输出
(venv) PS C:\Users\Dell\Downloads\Blogs> docker-compose build [+] Building 0.0s (0/0)
docker-compose up报错
(venv) PS C:\Users\Dell\Downloads\Blogs> docker-compose up [+] Running 2/2 ✘ web Error 3.8s ✘ db Error 3.8s Error response from daemon: pull access denied for blogs, the repository does not exist or may require 'docker login': denied: requested access to the resource is denied
解决方案
1. 修复构建无输出问题
docker-compose build无输出是因为web服务未指定构建上下文,Compose不知道要基于哪个Dockerfile构建blogs:latest镜像。需要在web服务中添加build: .字段,指向当前目录的Dockerfile。
2. 修复镜像拉取权限被拒问题
- web服务:
image: blogs:latest不是公共仓库镜像,本地也未构建,Docker会尝试从Docker Hub拉取不存在的镜像导致报错。添加build: .后,Compose会优先构建本地镜像。 - db服务:
image: data:latest不是有效的MySQL镜像,应替换为官方MySQL镜像(如mysql:8.0或mysql:5.7)。
3. 优化Dockerfile(避免构建阶段执行迁移)
构建阶段无法连接到未启动的数据库,执行makemigrations和migrate会失败。应将迁移操作放到容器启动时执行。
修改后的配置文件
修改后的docker-compose.yml
version: '3' services: web: build: . image: blogs:latest container_name: blogs_web ports: - "8080:8080" volumes: - .:/home/app/webapp environment: - PYTHONDONTWRITEBYTECODE=1 - PYTHONUNBUFFERED=1 - SECRET_KEY=${SECRET_KEY} - DEBUG=${DEBUG} - DATABASE_NAME=${DATABASE_NAME} - DATABASE_USER=${DATABASE_USER} - DATABASE_PASSWORD=${DATABASE_PASSWORD} - DATABASE_HOST=db - DATABASE_PORT=3306 depends_on: - db command: > sh -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8080" db: image: mysql:8.0 container_name: blogs_db environment: MYSQL_DATABASE: ${DATABASE_NAME} MYSQL_USER: ${DATABASE_USER} MYSQL_PASSWORD: ${DATABASE_PASSWORD} MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD} ports: - "3306:3306" command: --default-authentication-plugin=mysql_native_password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
修改后的Dockerfile
FROM python:3.10 ENV DockerHOME=/home/app/webapp RUN mkdir -p $DockerHOME WORKDIR $DockerHOME ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 RUN pip install --upgrade pip COPY . $DockerHOME RUN pip install -r requirements.txt EXPOSE 8080 CMD ["python", "manage.py", "runserver", "0.0.0.0:8080"]
执行步骤
- 确保项目根目录存在
.env文件,配置好所有环境变量(SECRET_KEY、DATABASE_NAME等)。 - 执行构建:
docker-compose build,此时会看到web服务的完整构建日志。 - 启动服务:
docker-compose up,web容器会先执行数据库迁移,再启动Django服务,db容器使用官方MySQL镜像启动并持久化数据。
内容的提问来源于stack exchange,提问作者Noor ul ain Ibrahim
相关产品推荐
相关产品推荐

