Как можно сделать построение сервиса Docker Compose зависимым от другого сервиса? - PullRequest
0 голосов
/ 13 октября 2018

Вот что я имею в виду.Как я могу написать файл docker-compose.yaml, чтобы при создании одной из служб сначала запускалась другая служба?

Я постараюсь быть еще более конкретным.Я пытаюсь создать приложение Java, используя библиотеку базы данных JOOQ, которая хочет подключиться к базе данных во время сборки, чтобы генерировать классы Java, которые соответствуют таблицам базы данных.Я хотел бы получить некоторую комбинацию Dockerfile (s) и файла docker-compose.yaml, чтобы следующее происходило примерно в следующем порядке:

  1. Запущена служба «базы данных» (в моем случае,используя образ postgres).
  2. База данных инициализируется с помощью сценариев SQL в моем репозитории разработки.
  3. Запускается фаза сборки моего "веб-сервиса", который использует Dockerfile в том же репо,которая вызывает сборку Gradle, которая сообщает JOOQ для подключения к службе базы данных, запущенной на шаге 1. Она генерирует файлы Java, компилирует их и делает все остальное для построения контейнера.
  4. Запущена веб-службаподключение к службе базы данных началось на шаге 1.

Вот файл docker-compose.yaml, с которым я работаю

version: '3.7' 
services:
  postgres:
    image: postgres:10.5-alpine
    restart: always
    ports:
      - "6432:5432"
    environment:
      POSTGRES_DB: flashtools
      POSTGRES_USER: flashtools
      POSTGRES_PASSWORD: flashtools
    volumes:
      - ./src/main/scripts/01_init.sql:/docker-entrypoint- 
initdb.d/01_init.sql
  web:
    build: .
    network_mode: host
    depends_on:
      - postgres
    ports:
      - "8080:8080"

Я уточню это с помощью большего количествадетали, но, надеюсь, то, что я спрашиваю, довольно просто.

1 Ответ

0 голосов
/ 30 мая 2019

У меня была такая же проблема, и я решил ее хакерским способом ...

В моем случае веб-сервисом является Haskell, который строит с помощью команды stack build, а затем выполняет с stack exec APP_NAME.Есть также сокращение, например stack build --exec APP_NAME.

. Также есть возможность создавать только зависимости с stack build --only-dependencies, поэтому сборка Docker их кэширует.

Поэтому я изменил свой Dockerfile следующим образом:

COPY ./package.yaml /app/package.yaml        # Copying the package file
RUN stack build --only-dependencies          # Build dependencies only

COPY . /app                                  # Copying the rest of the files

EXPOSE 3000

CMD ["stack", "build", "--exec", "APP_NAME"] # Build the application itself

, поэтому окончательная сборка запускается только при запуске службы.

Я не знаю достаточно Java, но я думаю, что там тоже должна быть похожая опция.

Также необходим некоторый взлом для части depen_on: https://docs.docker.com/compose/startup-order/

...