Как запустить контейнер базы данных 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
Причина, по которой база данных перезапускается во время запуска, хорошо объяснена в комментариях.