Доступ к работающему контейнеру во время сборки нового контейнера docker - PullRequest
0 голосов
/ 26 мая 2020

Как получить доступ к запущенным контейнерам во время сборки нового контейнера docker?

Требуется доступ к контейнеру базы данных во время сборки контейнера приложения

docker -compose

version: '3'

services:
  db:
    build: ./db
    ports:
      - 1433:1433
    networks:
      - mynetwork
  app:
    build: ./app
    ports:
      - 8080:8080
    depends_on:
      - db
    networks:
      - mynetwork

networks:
  mynetwork: {}

Пытался поднять базу данных перед сборкой контейнера приложения, но не работает:

  • docker -compose build db
  • docker -compose up -d db
  • docker -составить приложение сборки

1 Ответ

1 голос
/ 26 мая 2020

Вы не можете, и это плохая идея. Например, если вы запустите:

docker-compose build
docker-compose down -v
docker-compose up

Шаг down удалит все контейнеры и их базовое хранилище (включая содержимое базы данных); затем шаг up создаст все новые контейнеры из существующих образов без повторного запуска Dockerfile. Даже если вы добавили параметр --build, кэширование слоев Docker приведет к заключению, что выходные данные файловой системы вашей команды настройки базы данных не изменились, и пропустит повторный запуск этого шага.

Вы можете столкнетесь с аналогичной проблемой, если вы docker push построите образ в некоторый реестр и запустите его на другом хосте: поскольку образ можно использовать повторно, команды из его файла Docker не будут запускаться повторно, но это не та же база данных, поэтому настройка не будет завершена.

В зависимости от того, какую настройку вы пытаетесь выполнить, вероятно, лучший подход - настроить изображение с помощью сценария точки входа, который запускает миграции базы данных вашего приложения, а затем exec "$@" запускает главную команду контейнера. Также можно поместить команды установки в каталог /docker-entrypoint-initdb.d базы данных, хотя они не будут запускаться повторно, если схема базы данных вашего приложения изменится.

На техническом уровне это не работает, потому что Среда docker build не входит в какую-либо конкретную сеть Docker, ни mynetwork, который вы указываете вручную, ни default сеть, которую Compose создает самостоятельно. Последовательность сборки запускается отдельно от запуска результирующего образа и игнорирует большинство настроек Docker Compose.

...