@p-oleg

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

Мой docker-compose.yml (Windows 10)
version: '3'

services:
  db:
    image: postgres:9.5.23
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=my_db
      - POSTGRES_USER=my_user
      - POSTGRES_PASSWORD=my_password
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
volumes:
  postgres-data:


$docker-compose up ругается на вот эту строку:
./init.sql:/docker-entrypoint-initdb.d/init.sql

db_1  | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
db_1  | psql:/docker-entrypoint-initdb.d/init.sql:0: could not read from input file: Is a directory


Запускаю из текущей директории, файл init.sql присутствует.
Почему-то пишет что это не файл а директория.
Без этой строки все работает и база создается, но разумеется пустая.
  • Вопрос задан
  • 3494 просмотра
Решения вопроса 1
@p-oleg Автор вопроса
Решил проблему через Dockerfile:
FROM postgres:9.5.23
ADD ./sqls/init.sql /docker-entrypoint-initdb.d/


И docker-compose.yml теперь:
version: '3'

services:
  db:
    build: .
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=my_db
      - POSTGRES_USER=my_user
      - POSTGRES_PASSWORD=my_password
    volumes:
      - postgres-data:/var/lib/postgresql/data
volumes:
  postgres-data:


Все завелось и заработало.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@vitaly_il1
DevOps Consulting
1) то, что init.sql действительно файл вы уже проверяли?
2) попробуйте смаппировать так:
- в директорию sqls скопируйте init.sql
- sqls:/docker-entrypoint-initdb.d
Ответ написан
@EmachinesDIMA
junior DevOps
особенности объявления томов (volumes) в docker:
----------------------------------------------------------------------------------------
a)
``` .gitlab-ci.yml
job_name:
script:
- mkdir -p __workdir__
artifacts:
paths:
- __workdir__/
expire_in: 1h
when: on_success
```
На что обращаю внимание:
1. сперва создай рабочую папку !!! С тегом "-p" она создаст рекурсивно и там где надо. Простая команда "mkdir" работает только в локальной папке.
2. Артифакты. Для пути добавь в конце "/".
---------------------------------------------------------------------------------------------
b)
``` docker-compose.yml
---
version: '3.7'

services:
app_name:
build:
dockerfile: Dockerfile
context: ../../
volumes:
- "upload_react_volumes:__workdir__:rw"
# - __workdir__:/home/node

volumes:
upload_react_volumes: {}
```
На что обращаю внимание:
1. Сборка ведётся из Dockerfile
2. Прописать "__путь_к_папке_на_хосте__:__путь_в_контейнере__" - не сработает, поэтому
3. поэтому объяви имя тома в отдельном блоке `volumes` , а в структуре app_name в volumes объяви ее указав путь к рабочей папке на хосте и права доступа.
-------------------------------------------------------------------------------------------------
c) - неоднозначен. Может быть излишен и ошибочен. Но пусть будет, авось пригодится.
``` Dockerfile
FROM image:latest
ADD __workdir__/ /home/node/
```
На что обращаю внимание:
1. Определи эту директорию в Dockerfile.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы