Как запустить контейнер базы данных Postgresql вместе с образом Ubuntu Docker?

Как использовать docker-compose для запуска PostgreSQL в одном контейнере и обеспечения доступа к нему контейнера Ubuntu 22?

Моя docker-compose.yml выглядит так:

version: "3.6"
services:
  db:
    image: postgres:14-alpine
    environment:
      - POSTGRES_USER=test
      - POSTGRES_PASSWORD=test
      - POSTGRES_DB=test
    command: -c fsync=off -c synchronous_commit=off -c full_page_writes=off --max-connections=200 --shared-buffers=4GB --work-mem=20MB
    tmpfs:
      - /var/lib/postgresql
  app_test:
    build:
      context: ..
      dockerfile: Dockerfile
      shm_size: '2gb'
    volumes:
      - /dev/shm:/dev/shm

Мой Dockerfile только что запустил набор тестов Django unittest, который подключается к базе данных PostgreSQL, используя те же учетные данные. Однако, похоже, что база данных периодически падает или останавливается и запускается, разрывая связь с тестами.

Когда я запускаю:

docker-compose -f docker-compose.yml -p myproject up --build --exit-code-from myproject_app

Я получаю вывод типа:

Почему он читает shutting down и database system was shut down, подразумевая, что база данных перезапускается несколько раз? Почему Django не может получить к ней доступ для инициализации схемы?

При работе с базами данных в docker-compose вам всегда нужно ждать, пока они полностью запустятся. Либо ваша программа должна пинговать и ждать (не разрушаясь после первой неудачной попытки подключения к базе данных, которая, вероятно, все еще запускается), либо вы можете использовать известный теперь скрипт wait-for-it.sh.

Ниже приведен пример второго подхода.

Dockerfile:

FROM debian:stable

WORKDIR /scripts

RUN apt-get update && apt-get install -y curl telnet

# there are many versions on the internet, I just picked one
RUN curl -sO https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh && chmod a+x *.sh

ENTRYPOINT ["/scripts/wait-for-it.sh"]

он готовит изображение только с помощью скрипта wait-for-it.sh и telnet (для проверки соединения с базой данных)

docker-compose.yml

version: "3.6"

services:
  db:
    image: postgres:14-alpine
    environment:
      - POSTGRES_USER=test
      - POSTGRES_PASSWORD=test
      - POSTGRES_DB=test
    command: -c fsync=off -c synchronous_commit=off -c full_page_writes=off --max-connections=200 --shared-buffers=4GB --work-mem=20MB
    tmpfs:
      - /var/lib/postgresql

  test:
    build:
      context: .
    command: db:5432 -t 3000 -- telnet db 5432

Служба test будет ждать, пока база данных будет доступна, прежде чем запустить свой основной процесс.

Лучший способ проверки:

Запуск одного терминала:

docker-compose up test

Во втором терминале:

# make the operation even longer
docker rmi postgres:14-alpine

# start database
docker-compose up db

Причина, по которой база данных перезапускается во время запуска, хорошо объяснена в комментариях.

Вернуться на верх