Почему при запуске Docker Postgres не выполняется SQL команда?

Как настроить docker compose, чтобы при первом запуске создавалась БД и выполнялись все остальные команды из файла setup.sql, а при последующих запусках подтягивались данные, которые были созданы во время предыдущих запусков?

version: '3.5'

services:
  postgres:
    container_name: postgres_container
    image: postgres
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      PGDATA: /data/postgres
    volumes:
      - .docker/setup.sql:/docker-entrypoint-initdb.d/setup.sql
      - postgres:/data/postgres
    ports:
      - "5400:5432"
    networks:
      - postgres
    restart: unless-stopped

volumes:
    postgres:

Как настроить конфигурацию, чтобы при запуске docker compose up не получилось так, что sql скрипт для создания БД не выполняется?
Изображение к вопросу
  • 22 декабря 2023 г. 14:47
Ответы на вопрос 2
Одной из возможных причин невыполнения SQL команды при запуске Docker Postgres может быть проблема с правами доступа к файлу setup.sql. Убедитесь, что файл setup.sql имеет правильные разрешения для чтения в контейнере.

Чтобы настроить Docker Compose таким образом, чтобы при первом запуске создавалась БД и выполнялись все остальные команды из файла setup.sql, а при последующих запусках подтягивались данные из предыдущих запусков, можно использовать механизм инициализации базы данных в Docker.

Создайте скрипт инициализации, например, с названием init.sh, в котором будет содержаться логика создания базы данных и выполнения SQL команд из файла setup.sql:

```shell
#!/bin/bash

set -e

# Проверяем, создана ли уже база данных
psql -h postgres -U postgres -c '\l' | grep -q "dbname"

if [ $? -eq 1 ]; then
    # Создаем базу данных
    psql -h postgres -U postgres -c "CREATE DATABASE dbname"
    # Импортируем SQL команды из файла setup.sql
    psql -h postgres -U postgres -d dbname < /docker-entrypoint-initdb.d/setup.sql
else
    echo "База данных уже существует, пропускаем инициализацию."
fi

exec "$@"
```

Обновите конфигурацию Docker Compose следующим образом, чтобы использовать новый скрипт инициализации:

```yaml
version: '3.5'

services:
  postgres:
    container_name: postgres_container
    image: postgres
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      PGDATA: /data/postgres
    volumes:
      - .docker/setup.sql:/docker-entrypoint-initdb.d/setup.sql
      - .docker/init.sh:/docker-entrypoint-initdb.d/init.sh
      - postgres:/data/postgres
    ports:
      - "5400:5432"
    networks:
      - postgres
    restart: unless-stopped

volumes:
    postgres:
```

Теперь при первом запуске Docker Compose будет создана база данных и выполнены SQL команды из файла setup.sql. При последующих запусках Docker Compose будет пропускать этот шаг, так как база данных уже будет существовать.
Попробуй 
Похожие вопросы