Подождите, пока контейнер Docker будет готов с помощью команды в Docker-compose.yml - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть образ mysql-db и призмы в моем docker-compose.yml.Я хочу, чтобы Prisma ждала, пока БД будет готова, потому что в противном случае Prisma продолжает перезапускаться, и она вообще не будет работать.И из здесь я знаю, что могу использовать . / Wait-for-it , но мне не удалось соединить части после некоторого поиска.

version: '3'
services:
  prisma:
    image: prismagraphql/prisma:1.25
    restart: unless-stopped
    ports:
    - "4001:4466"
    depends_on:
    - db

    # I added this command
    command: ["./wait-for-it.sh", "db:33061", "--"] 

    environment:
      PRISMA_CONFIG: |
        managementApiSecret: server.secret.123
        port: 4466
        databases:
          default:
            connector: mysql
            active: true
            host: db
            port: 3306
            user: ***
            password: ***
  db:
    image: mysql:5.7
    restart: unless-stopped
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_USER: ***
      MYSQL_ROOT_PASSWORD: ***
    ports:
      - "33061:3306"
    volumes:
      - /docker/mysql:/var/lib/mysql

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

  1. Как я могу получить ./wait-for-it.sh в контейнер?
  2. И может ли это даже работать таким образом скоманда или это зависит от призмы-образа?
  3. В противном случае, как мне добиться ожидания?

У меня просто есть докерсоставь файл и хочешь сделать docker-compose up -d

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Теперь я узнал, как включить wait-for-it.sh в контейнер.

Я загрузил файл wait-for-it.sh в папку проекта, а затем создал файл с именем Dockerfile с содержимым:

FROM prismagraphql/prisma:1.25
COPY ./wait-for-it.sh /app/wait-for-it.sh
RUN chmod +x /app/wait-for-it.sh
ENTRYPOINT ["/bin/sh","-c","/app/wait-for-it.sh db:3306 -t 30 -- /app/start.sh"]

В моем докере-compose.yml Я заменил image: prismagraphql/prisma:1.25 на build: ., что вызывает новую сборку из Dockerfile в пути моего проекта.

Теперь новое изображение будет построено из образа призмы и его ожидания.sh будет скопирован в новое изображение.Затем ENTRYPOINT переопределяется, и призма будет ждать, пока БД не будет готова.

0 голосов
/ 15 февраля 2019

Вы путаете внутренние и внешние порты.База данных видна на порту 3306 внутри вашей сети, поэтому вам придется подождать на db:3306, а не на 33061.

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

Также убедитесь, что ENTRYPOINT для изображения prismagraphql/prisma:1.25.Если это не /bin/sh -c или другой тип оболочки, ваш command не будет выполнен.

UPD

Если вы получаете ENTRYPOINT в базовом изображении, отличном от /bin/sh -c, вы можете переопределить его.Предположим, у вас есть /bin/sh -c /app/start.sh, вы можете использовать следующую магию:

docker-compose.yml

...
services:
  prisma:
    entrypoint: ["/bin/sh", "-c", "'./wait-for-it.sh db:3306 && /app/start.sh'"] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...