docker-compose up завершается неудачно, когда docker-compose up успешен - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь докертизировать мое приложение Django-postgres и запустить 2 команды, используя docker-compose. Мой 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?

Может кто-нибудь помочь мне найти, где я иду не так?

1 Ответ

1 голос
/ 24 сентября 2019

проблема здесь в том, что 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"

PS

Я вижу, что вы используете ADD . /code/ и volumes: - .:/code, поэтому вам нужно удалить ADD . /code/, так как он будет перезаписан с тома, но тогда вам нужно установить wait-for-it.sh в другомпуть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...