Docker: выполнить миграцию django в контейнер db изнутри веб-контейнера - PullRequest
1 голос
/ 15 октября 2019

Джанго 2.2.

docker 19.03.2

Я запускаю конвейер CI в gitlab. Этап выполняет несколько шагов:

Сначала я запускаю контейнер БД:

docker run --name db -p 5432:5432 \
        -e DJANGO_SETTINGS_MODULE=<myapp>.settings.postgres -d postgres:9.6

Обратите внимание, что я указываю файл настроек не по умолчанию (который содержит мои учетные данные БД)

Затем я проверяю, сработало ли это:

docker inspect db

true

Теперь я создаю веб-контейнер с Django 2.2 внутри и передаю ему учетные данные DB контейнера postgres:

docker build --pull -t test_image . \
    --build-arg DB_NAME=<mydbname> \
    --build-arg DB_HOST=db \
    --build-arg DB_USER=<mydbuser> \
    --build-arg DB_PASS=<mydbpassword>

Некоторые пояснения здесь: Dockerfile принимает переменные следующим образом:

...
ARG DB_NAME
ARG DB_HOST
ARG DB_PASSWORD
ARG DB_USER

ENV DB_NAME=$DB_NAME
ENV DB_HOST=$DB_HOST
ENV DB_PASS=$DB_PASS
ENV DB_USER=$DB_USER
....

Теперь docker build запускает Dockerfile последовательность из многих шагов и в какой-то момент приходит к миграции в Django DB:

RUN python manage.py migrate --settings <myapp>.settings.postgres

, которая неизменно задыхается от этой ошибки:

django.db.utils.OperationalError: не удалось подключиться к серверу: соединение отклонено Сервер работает на хосте "db"(127.0.0.1) и принимать соединения TCP / IP через порт 5432?

Что, я думаю, означает, что имя, которое я дал контейнеру postgres (" db ") при его запуске, не означаетчто-нибудь внутри этого (веб) контейнера.

Я проверил переменные db redentials перед этапом "migrate" (только что напечатанным с помощью echo) - все они сделали это нормально.

Я также провел несколько экспериментов, добавляя --add-host=db:127.0.0.1--add-host=db:localhost) к обоим docker run --name db ... и docker build .. командам и --expose=5432 к docker run --name db ..., и получил ту же ошибку.

Как мне правильно запустить "python manage.py migrate" изнутри сборки (Dockerfile) веб-контейнера ПРОТИВ БД В БД, КОНТЕЙНЕР, КОТОРЫЙ НАЧАЛСЯ ДО ЭТОГО?

ОБНОВЛЕНИЕ В конце я перепроектировал систему. Миграция выполняется из .gitlab_ci.yml, а не изнутри контейнера. Таким образом, мне нужно получить IP-адрес от "Docker Inspect -f ..."

1 Ответ

0 голосов
/ 15 октября 2019

вы можете попробовать создать сеть

docker network create test_network

и пропустить ее при запуске обоих контейнеров

docker run --name db -p 5432:5432 -e DJANGO_SETTINGS_MODULE=<myapp>.settings.postgres -d --network test_network postgres:9.6

Или вы можете просто создать файл docker-compose.yaml, подобный этому, исвязать оба контейнера

version: '3'

services:
  db:
    image: postgres:9.6
    environment:
      - POSTGRES_USER:'foo'
      - POSTGRES_PASSWORD:'foobar'
      - POSTGRES_DB:'foo'
    ports:
      - "5432:5432"
  web:
    image: test_image
    environment:
      DB_NAME: foo
      DB_USER: foo
      DB_PASS: foobar
    ports:
      - "8000:8000"
    depends_on:
      - db

и запустить его с

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