![](/img/trans.png)
[英]Docker-Compose + Postgres: /docker-entrypoint-initdb.d/init.sql: Permission denied
[英]Docker postgres does not run init file in docker-entrypoint-initdb.d
根據 Docker 的 Postgres文檔,我可以在/docker-entrypoint-initdb.d
中創建任何*.sql
文件並讓它自動運行。
我有包含CREATE DATABASE ronda;
init.sql
在我docker-compose.yaml
中,我有
web:
restart: always
build: ./web
expose:
- "8000"
links:
- postgres:postgres
volumes:
- /usr/src/app/static
env_file: .env
command: /usr/local/bin/gunicorn ronda.wsgi:application -w 2 -b :8000
nginx:
restart: always
build: ./nginx/
ports:
- "80:80"
volumes:
- /www/static
volumes_from:
- web
links:
- web:web
postgres:
restart: always
build: ./postgres/
volumes_from:
- data
ports:
- "5432:5432"
data:
restart: always
build: ./postgres/
volumes:
- /var/lib/postgresql
command: "true"
和我的 postgres Dockerfile,
FROM library/postgres
RUN mkdir -p /docker-entrypoint-initdb.d
COPY init.sql /docker-entrypoint-initdb.d/
運行docker-compose build
和docker-compose up
工作正常,但未創建數據庫ronda
。
如果您的初始化要求只是創建ronda
模式,那么您可以按照文檔中所述使用POSTGRES_DB
環境變量。
postgres 服務的 docker-compose.yml文件的一部分將是:
postgres:
restart: always
build: ./postgres/
volumes_from:
- data
ports:
- "5432:5432"
environment:
POSTGRES_DB: ronda
附帶一提,不要對你的data
容器使用restart: always
因為這個容器不運行任何服務(只是true
的命令)。 這樣做基本上是告訴 Docker 在無限循環中運行true
命令。
這就是我在我的項目中使用postgres並預加載數據庫的方式。
文件: docker-compose.yml
db:
container_name: db_service
build:
context: .
dockerfile: ./Dockerfile.postgres
ports:
- "5432:5432"
volumes:
- /var/lib/postgresql/data/
如果項目的根文件夾中存在名為pg_dump.backup
(二進制轉儲)或psql_dump.sql
(純文本轉儲)的文件,則此Dockerfile
加載該文件。
文件: Dockerfile.postgres
FROM postgres:9.6-alpine
ENV POSTGRES_DB DatabaseName
COPY pg_dump.backup .
COPY pg_dump.sql .
RUN [[ -e "pg_dump.backup" ]] && pg_restore pg_dump.backup > pg_dump.sql
# Preload database on init
RUN [[ -e "pg_dump.sql" ]] && cp pg_dump.sql /docker-entrypoint-initdb.d/
如果需要重試轉儲的加載,您可以使用以下命令刪除當前數據庫:
docker-compose rm db
然后你可以運行docker-compose up
來重試加載數據庫。
與 postgres 11 有同樣的問題。
對我有幫助的一些要點:
docker-compose rm
docker-compose build
docker-compose up
在將步驟docker-compose rm
添加到混合后,它終於起作用了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.