【问题标题】:docker-compose up fails when docker-compose run is successfuldocker-compose run 成功时 docker-compose up 失败
【发布时间】:2019-09-24 07:39:16
【问题描述】:

我正在尝试 dockerize 我的 Django-postgres 应用程序并使用 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',
    }
}

当我运行时,我的 db 和 web 容器已启动:

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?

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

【问题讨论】:

  • 可能你的 db docker 镜像出现了,但是在 Django 启动时 postgres 没有启动。

标签: python django docker


【解决方案1】:

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

你可以使用wait-for-it.sh,见this

示例:

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

Dockerfile:

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

【讨论】: