пружинный загрузочный контейнер не работает из-за зависимости от контейнера postgres - PullRequest
0 голосов
/ 29 октября 2019

У меня есть один контейнер postgres и один контейнер с пружинной загрузкой. Я запускаю их обоих с помощью docker-compose.

Ниже приведен файл docker-compose.yml:

version: '3'
services:
  backend:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "8080:8080"
    depends_on:
      - postgres-db
    restart: always
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-db:5432/testDb
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root
  postgres-db:
    working_dir: /home/models
    image: postgres:11.3-alpine
    restart: always
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB=testDb
    ports:
      - "5432:5432"
    volumes:
      - ./pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

Вот Dockerfile.dev

FROM maven:3-jdk-8

ENV HOME=/home/usr/app

RUN mkdir -p $HOME

WORKDIR $HOME

ADD pom.xml $HOME

RUN ["/usr/local/bin/mvn-entrypoint.sh", "mvn", "dependency:go-offline"]

ADD . $HOME

RUN ["mvn", "package"]

CMD ["java","-jar","/usr/app/testApp-1.0.0-SNAPSHOT.jar"]

и вотapplication.properties файл

spring.datasource.url=jdbc:postgresql://postgres-db:5432/testDb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=validate

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

Редактировать: Я добавил следующий db-check.sh файл для проверки состояния db

#!/bin/sh
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$@"

until PGPASSWORD="password" psql -h "$host" -U "root" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done


>&2 echo "Postgres is up - executing command"
exec $cmd

, и новый Dockerfile.dev выглядит так:

FROM maven:3-jdk-8

ENV HOME=/home/usr/app

RUN mkdir -p $HOME

WORKDIR $HOME

ADD db-check.sh $HOME

RUN chmod +x db-check.sh

RUN ["./db-check.sh", "postgres-db:5432", "/usr/local/bin/mvn-entrypoint.sh", "mvn", "dependency:go-offline"]

ADD . $HOME

RUN ["mvn", "package"]

CMD ["java","-jar","/usr/app/testApp-1.0.0-SNAPSHOT.jar"]

, но для этого скриптадля успешной работы мне нужно установить psql в бэкэнд-контейнер. Есть ли другой способ проверить это, потому что если вы чувствуете, что я помещаю много вещей в этот единственный внутренний контейнер ради простой проверки состояния контейнера postgres.

1 Ответ

0 голосов
/ 29 октября 2019

Как уже говорили другие, вероятно, контейнер postgres-db еще не готов, потому что он должен быть инициализирован при первом запуске.

В качестве дешевого обходного пути вы можете сделать это:

  1. Запустите только контейнер postgres-db: $ docker-compose up -d postgres-db
  2. Подождите немного (скажем, 10-20 секунд)
  3. $ docker-compose up -d --build

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...