Skip to main content
 首页 » 编程设计

python之当 docker-compose run 成功时 docker-compose up 失败

2024年11月01日29zhenyulu

我正在尝试对我的 Django-postgres 应用进行 docker 化,并使用 docker-compose 运行 2 个命令 我的 Dockerfile 是:

FROM python:3 
 
ENV PYTHONUNBUFFERED 1 
 
RUN mkdir /code 
WORKDIR /code 
ADD requirements.txt /code/ 
RUN pip install -r requirements.txt 
ADD . /code/ 

我的 docker-compose.yml 是:

version: '3' 
 
services: 
  web: 
    build: . 
    command: bash -c "python app/manage.py migrate && python app/manage.py runserver 0.0.0.0:8000" 
    volumes: 
      - .:/code 
    ports: 
      - "8000:8000" 
    depends_on: 
      - db 
  db: 
    image: postgres 
    ports: 
      - "5432:5432" 
    environment: 
      POSTGRES_PASSWORD: password 

我的设置 .py 具有以下数据库代码:

DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.postgresql', 
        'NAME': 'postgres', 
        'USER': 'postgres', 
        'PASSWORD': 'password', 
        'HOST': 'db', 
        'PORT': '5432', 
    } 
} 

当我运行时,我的数据库和网络容器已经启动:

docker-compose run web python app/manage.py migrate 
docker-compose run web python app/manage.py runserver 0.0.0.0:8000 

但是当我运行的时候

docker-compose up 

它因错误而失败:

web_1  | django.db.utils.OperationalError: could not connect to server: Connection refused 
web_1  |        Is the server running on host "db" (172.23.0.2) and accepting 
web_1  |        TCP/IP connections on port 5432? 

谁能帮我找出我哪里出错了?

请您参考如下方法:

这里的问题是 docker-compose up 不会等到 db 运行。

你可以使用wait-for-it.sh , 请参阅 this

例子:

command: ["/code/wait-for-it.sh", "db:5432", "--", "python", "MY_CODE"] 

docker 文件:

FROM python:3 
 
ENV PYTHONUNBUFFERED 1 
 
RUN mkdir /code 
WORKDIR /code 
ADD requirements.txt /code/ 
RUN pip install -r requirements.txt 
ADD . /code/ 
RUN wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh \ 
    && chmod +x wait-for-it.sh 

或者沉睡在你的命令中:

command: bash -c "sleep 60 && python app/manage.py migrate && python app/manage.py runserver 0.0.0.0:8000" 

附言

我可以看到您使用 ADD 。/code/ 和 volumes: - .:/code ,所以你需要删除 ADD 。/code/ 因为它将被卷覆盖,但是你需要在另一个路径中安装 wait-for-it.sh