You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"]

执行步骤

  1. 确保项目根目录存在.env文件,配置好所有环境变量(SECRET_KEY、DATABASE_NAME等)。
  2. 执行构建:docker-compose build,此时会看到web服务的完整构建日志。
  3. 启动服务:docker-compose up,web容器会先执行数据库迁移,再启动Django服务,db容器使用官方MySQL镜像启动并持久化数据。

内容的提问来源于stack exchange,提问作者Noor ul ain Ibrahim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:05:07