Не удалось разрешить Docker-контейнер во время процесса сборки другого контейнера - PullRequest
0 голосов
/ 12 октября 2019

У меня есть два файла Docker, один для базы данных и один для веб-сервера. Dockerfile веб-сервера имеет оператор RUN, который требует подключения к контейнеру базы данных. Веб-сервер не может разрешить IP-адрес базы данных, а затем выдает ошибки. Но если я закомментирую строку RUN, а затем вручную выполню ее внутри контейнера, она успешно разрешит базу данных. Должен ли веб-сервер обрабатывать базу данных в процессе сборки?

# Web server
FROM tomcat:9.0.26-jdk13-openjdk-oracle

# The database container cannot be resolved when myscript runs.  "Unable to connect to the database." is thrown.
RUN myscript

CMD catalina.sh run
# But if I comment out the RUN line then connect to web server container and run myscript, the database container is resolved
docker exec ... bash

# This works
./myscript

1 Ответ

2 голосов
/ 12 октября 2019

Я столкнулся с той же проблемой при миграции базы данных и NuGet нажимает . Возможно, вы захотите запустить нечто похожее на вашей базе данных, например, миграции, начальные / тестовые данные и так далее. Это может быть решено двумя способами:

  1. Переместите ваши операции с БД на ENTRYPOINT, чтобы они выполнялись во время выполнения (когда контейнер БД работает и доступен).

  2. Создайте свое изображение, используя docker build вместо чего-то вроде docker-compose up --build, потому что docker build имеет переключатель под названием --network. Таким образом, вы можете создать сеть в своем файле компоновки, вызвать БД с помощью docker-compose up -d db-container, а затем обращаться к ним во время сборки с помощью docker build --network db-container-network -t your-image .

Я бы предпочел # 1, а не #2, если возможно, потому что

  • проще: сеть присутствует только в файле docker-compose, а не в нескольких местах
  • вы можете указать отношения usind зависимость_on иубедитесь, что они соблюдаются должным образом, не заботясь об этом вручную

Но в зависимости от действия, которое вы хотите выполнить, вы должны позаботиться о том, чтобы оно не выполнялось несколько раз, потому что оно выполняется на каждый запуск, а не только во время сборки (когда кэш очищался от изменений файла).

Тем не менее, в любом случае, я бы посчитал это наилучшей практикой при выполнении таких автоматизированных операций с БД, чтобы ожидать, что они могут выполнить более одного, и в любом случае должен создать ожидаемый результат (например, проверяя, является ли версия или изменение миграциинастоящее время).

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