Поочередный вызов сервисов из одного docker-compose файла

247
18 апреля 2018, 09:13

Подскажите пожалуйста, у меня имеется один docker-compose файл. В нём есть 2 тестовых сервиса и 2 рабочих. И есть скрипт. Мне надо сделать поочередный вызов: т.е. вначале когда я сделаю docker-compose up должны подняться 2 тестовых сервиса (post-service-test и rabb-service-test), затем должен выполниться скрипт (он делает билд приложения на основе этих запущенных тестовых сервисов), затем мне надо остановить и удалить эти тестовые сервисы и только потом я должен поднять 2 рабочих сервиса (post-service и rabb-service). Подскажите пожалуйста, как мне это сделать, имея вот такой docker-compose файл:

    version: '3'
services:
  postgres:
    container_name: post-service
    image: postgres:9-alpine
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - ${PWD}/db_migration/cdp_dump.sql:/home/postgres/cdp_dump.sql
    ports:
      - "5432:5432"
    networks:
      - work_network
    labels:
      container_group: work_env

  rabbitmq:
    container_name: rabb-service
    image: rabbitmq:3-management-alpine
    environment:
      - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER}
      - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS}
      - RABBITMQ_DEFAULT_VHOST=${RABBITMQ_DEFAULT_VHOST}
    ports:
      - "15672:15672"
      - "5672:5672"
    depends_on:
      - postgres
    networks:
      - work_network
    labels:
      container_group: work_env

  postgres_test:
      container_name: post-service-test
      image: postgres:9-alpine
      environment:
        - POSTGRES_USER=${POSTGRES_USER}
        - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
        - POSTGRES_DB=${POSTGRES_DB}
      networks:
        - test_network
      labels:
        container_group: test_env

  rabbitmq_test:
      container_name: rabb-service-test
      image: rabbitmq:3-management-alpine
      environment:
        - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER}
        - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS}
      depends_on:
        - postgres_test
      networks:
        - test_network
      labels:
        container_group: test_env

networks:
    work_network:
    test_network:

  application:
    container_name: build
    image: openjdk:8-jdk
    environment:
      - POSTGRES_HOST=${POSTGRES_HOST}
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - RABBITMQ_HOST=${RABBITMQ_HOST}
      - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER}
      - RABBITMQ_DEFAULT_PASSWORD=${RABBITMQ_DEFAULT_PASS}
    volumes:
      - ${project_home}:/root
    command:
    /bin/bash < build_script

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

    docker run --name build -i --net test-network \
-v ${project_home}:/root \
-e POSTGRES_HOST=${POSTGRES_HOST} \
-e POSTGRES_DB=${POSTGRES_DB} \
-e POSTGRES_USER=${POSTGRES_USER} \
-e POSTGRES_PASSWORD=${POSTGRES_PASSWORD} \
-e RABBITMQ_HOST=${RABBITMQ_HOST} \
-e RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER} \
-e RABBITMQ_DEFAULT_PASSWORD=${RABBITMQ_DEFAULT_PASS} \
openjdk:8-jdk /bin/bash < build_script

И ещё вопрос: могу ли я такие команды, как docker stop post-service-test, docker rm post-service-test, docker stop rabb-service-test, docker rm rabb-service-test (остановка и удаление тестовых сервисов) не выполнять отдельно, а также поместить в docker-compose или это невозможно ?

Заранее спасибо !

Answer 1

По поводу 1-го вопроса:
В самом docker-compose Вы не сможете сделать так как вы задумали. Т.е. сначала создать образы тест, выполнить их, после удалить а потом запускать прод сервисы. Для таких вещей Вам стоит посмотреть в сторону CI/CD технологий. Такие как Jenkins, Dron.io, Gitlab CI/CD и т.д.
В docker-compose можно управлять последовательность запусков сервисов сторонними скриптами такие как wait-for-it.sh

По 2-му вопросу:
Да docker-compose умеет такие вещи. Вы можете почитать об этом в самом мануале.
Надеюсь смог как нибудь ответить на Ваши вопросы.

READ ALSO
Как создать динамический массив fragment -ов?

Как создать динамический массив fragment -ов?

Делаю Navigation drawer внутри него RecyclerView необходимо по клику по item-y RcyclerView открывать новый фрагмент

197
Spring MVC Передать данные в другой контроллер

Spring MVC Передать данные в другой контроллер

Есть часть кода в UserController, которая обрабатывает данные из формы:

205
Rest API - Internal Server Error

Rest API - Internal Server Error

Веб-сервис был разработан в среде IntelliJ IDEA на win7Использовался сервер GlassFish 4

209