Задержка запуска службы Docker до тех пор, пока MongoDB не запустится без модификации Dockerfile - PullRequest
0 голосов
/ 08 мая 2020

В моем docker-compose.yml две услуги. Почтовый сервис, который использует MailHog и MongoDB для хранения.

Проблема в том, что сервис MongoDB должен быть запущен до MailHog. В противном случае MailHog выполнит откат и будет использовать свое хранилище в памяти.

Простого depends_on недостаточно, потому что службе MongoDB требуется некоторое время для запуска.

Я знаю скрипты типа wait-for-it et c. но все они требуют изменения Dockerfile, где в моем случае я использую неизмененный Docker образ MailHog.

Есть ли какой-либо «встроенный» механизм или обходной путь, как я могу отложить почтовую службу пока MongoDB не будет готов?

mail:
  image: mailhog/mailhog:v1.0.0
  deploy:
    restart_policy:
      condition: on-failure
      delay: 10s
      max_attempts: 3
      window: 60s

mail-db:
  image: mongo:4.2.6
  environment:
    MONGO_INITDB_DATABASE: mailhog
    MONGO_INITDB_ROOT_USERNAME: root
    MONGO_INITDB_ROOT_PASSWORD: root
  ports:
    - 27017
  deploy:
    restart_policy:
      condition: on-failure
    resources:
      limits:
        cpus: "0.5"
        memory: 500M

Ответы [ 2 ]

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

Нет, нет. Однако нет необходимости изменять исходный файл Dockerfile. Вы можете расширить его с помощью jwilder / dockerize , инструмента, разработанного для этой c цели (среди прочего).

FROM mailhog/mailhog:v1.0.0

# If required, you can change MONGOURL via docker -e [...]
ENV MONGOURL mail-db:27017

# The dockerize version used. You can set a different version with
# docker build --build-arg DOCKERIZE_VERSION=[...]
ARG DOCKERIZE_VERSION=v0.6.1

# Change to root to be able to install dockerize
USER root

# 1: Ensure the image is up to date, while we are at it
RUN apk update && apk upgrade \
# 2: Install curl and its dependencies as the virtual package ".deps"
&& apk add --virtual .deps curl \
# 3: Get dockerize
&& curl -L -O https://github.com/jwilder/dockerize/releases/download/${DOCKERIZE_VERSION}/dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz \
# 4: Unpack it and put it to the appropriate location as per FHS
&& tar -C /usr/local/bin -xzvf dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz \
# 5: Remove the tarball
&& rm dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz \
# 6: Cleanup
&& rm -rf /var/cache/apk/* \
# 7: Remove the virtual package ".deps"
&& apk del .deps

# Switch back to the user mailhog is supposed to run under
USER mailhog

# Run dockerize, which will start mailhog as soon as it was able to connect to $MONGOURL
ENTRYPOINT ["/bin/sh","-c","/usr/local/bin/dockerize -wait tcp://$MONGOURL MailHog"]

Примечание: подсветка синтаксиса не работает должным образом в Dockerfile по какой-либо причине

Протестировано с помощью следующего docker -compose.yaml (части deploy явно игнорируются docker -compose) :

version: "3"
services:
  mail:
    image: robertstauch/mailhog:v1.0.0-dockerized-v0.6.1
    build: .
    ports:
      - "8025:8025"
      - "1025:1025"
    deploy:
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 60s

  mail-db:
    image: mongo:4.2.6
    environment:
      MONGO_INITDB_DATABASE: mailhog
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    deploy:
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.5"
          memory: 500M
1 голос
/ 08 мая 2020

Один из способов - предоставить свой собственный entrypoint скрипт, который вы можете добавить в контейнер с помощью volumes. В сценарии дождитесь успешного подключения к MongoDB, а затем exe c исходная точка входа.

Стек:

volumes:
  - /path/to/entrypoint.sh:/tmp/entrypoint.sh
entrypoint: /bin/bash
command: /tmp/entrypoint.sh

точка входа. sh:

# Wait for service or whatever
exec /path/to/original/entrypoint
...