У меня есть настройка с docker-compose, которая создает веб-контейнер с Django и контейнер postgresql с postgresql. Все работает нормально, и у меня нет оснований думать, что он не будет работать на производстве. Postgres - это недавнее дополнение, до того как sqlite3 работал внутри веб-контейнера.
Я застрял в тестах. У меня есть репозиторий gitlab, где я отправляю изменения, и каждое нажатие запускает тестовый конвейер, настроенный с помощью .gitlab_ci.yml. Я не могу понять, что именно мне нужно изменить в этом файле (и / или других задействованных файлах), чтобы в этой (TEST!) Среде веб и db общались друг с другом.
Независимо от того, что я делаю (включая исходные нетронутые версии), конвейер неизменно умирает с той же ошибкой:
django.db.utils.OperationalError: не удалось перевести имя хоста«db» для адреса: имя или служба неизвестна
Ошибка возникает при выполнении следующей директивы Dockerfile:
RUN python manage.py migrate
Мне не нужны тесты, если запускается postgresqlвнутри веб-контейнера или в другом контейнере, если они находят друг друга. Однако в производстве он будет работать на моей локальной машине: два контейнера, web и postgresql.
Мои файлы:
Оригинал .gitlab-ci.yml
image: docker:stable
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
CONTAINER_TEST_IMAGE: registry.gitlab.com/<my_repo>:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: registry.gitlab.com/<my_repo>:latest
CONTAINER_DEVELOP_IMAGE: registry.gitlab.com/<my_repo>:develop
services:
- docker:dind
stages:
- test
test:
stage: test
script:
- docker pull postgres:9.6
- docker run --name db -d postgres:9.6
- sleep 5
- docker build --pull -t test_image .
- docker run --net=host test_image /bin/bash -c "coverage run --source='.' manage.py test --verbosity 2 && coverage html && coverage report"
artifacts:
paths:
- htmlcov/
expire_in: 5 days
Модифицированный .gitlab-ci.yml
image: docker:stable
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
CONTAINER_TEST_IMAGE: registry.gitlab.com/<my_repo>:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: registry.gitlab.com/<my_repo>:latest
CONTAINER_DEVELOP_IMAGE: registry.gitlab.com/<my_repo>:develop
POSTGRES_DB:<my_db_name>
POSTGRES_USER:<my_user>
POSTGRES_PASSWORD: <my_password>
services:
- docker:dind
- postgres:9.6
stages:
- test
test:
stage: test
script:
- docker pull postgres:9.6
- docker run --name db -d postgres:9.6
- sleep 5
- docker build --pull -t test_image .
#here in DB_HOST I also tried 'db', '<my_db_name>' and couple of other options instead of 'localhost', the error is the same
- docker run --net=host -e DB_HOST=localhost test_image /bin/bash -c "coverage run --source='.' manage.py test --verbosity 2 && coverage html && coverage report"
artifacts:
paths:
- htmlcov/
expire_in: 5 days
Мои settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': '<my_db_name>',
'USER': '<my_user>',
'PASSWORD': '<my_password>',
'HOST': 'db',
'PORT': '',
#yes, I tried port 5432 and 5432:5432, makes no difference
}
}
Dockerfile
# Dockerfile
FROM python:3.6
MAINTAINER me
# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONUNBUFFERED 1
# install nginx
RUN apt-get update
RUN apt-get -y install nginx gettext-base libsasl2-dev libldap2-dev libssl-dev
#overwrite configuration files
COPY helper_functions/nginx_docker.template.conf /etc/nginx/nginx.template.conf
COPY helper_functions/nginx_docker.conf /etc/nginx/nginx.conf
WORKDIR /usr/src/app/
COPY requirements.txt /usr/src/app/
COPY . /usr/src/app
RUN pip install -r requirements.txt
RUN python setup.py install
RUN python manage.py collectstatic
#THIS LINE (MIGRATE) produces that "could not translate host name "db" to address" error!!!
RUN python manage.py migrate
# COPY startup script into known file location in container
COPY start_gunicorn.sh /start_gunicorn.sh
# EXPOSE port 8080 to allow communication to/from server
EXPOSE 8080
# CMD specifies the command to execute to start the server running.
CMD ["/start_gunicorn.sh"]
Опять же, все это работает с отдельными контейнерами докеров локально, и я верю в другом месте. Я думаю, что только тестовый конвейер с его gitalb-cy.yml нуждается в некоторых корректировках.
ОБНОВЛЕНИЕ В конце система была переработана таким образом, что все связанные с БД вещи (миграции, в основном) выполняются непосредственно из .gitlab-ci.yml
вместо o из Dockerfile
во время сборки,Это избавило от необходимости перетаскивать несколько переменных среды для БД, а другой файл настроек можно настроить только для тестов, проще из .gitlab-ci.yml
.