Одной из возможных причин невыполнения 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 будет пропускать этот шаг, так как база данных уже будет существовать.