基于Docker的Postgres留档,我可以在/docker-entrypoint-initdb. d
中创建任何*.sql
文件并让它自动运行。
我有包含CREATE DATABASE ronda的
init. sql
;
在我的docker-compe. 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-composbuild
和docker-composup
工作正常,但未创建数据库ronda
。
这就是我在项目中使用postgres并预加载数据库的方式。
文件:docker-comment. yml
db:
container_name: db_service
build:
context: .
dockerfile: ./Dockerfile.postgres
ports:
- "5432:5432"
volumes:
- /var/lib/postgresql/data/
此Dockerfile
加载名为的文件pg_dump. backup
(二进制转储)或psql_dump.sql
(纯文本转储),如果存在于项目的根文件夹中。
文件: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-composup
来重试加载数据库。
如果您的初始化要求只是创建ronda
模式,那么您可以使用POSTGRES_DB
环境变量,如留档中所述。
postgres服务的docker-comup. yml文件的位将是:
postgres:
restart: always
build: ./postgres/
volumes_from:
- data
ports:
- "5432:5432"
environment:
POSTGRES_DB: ronda
另外,不要使用restart:始终为您的
,因为该容器不运行任何服务(只是data
容器使用true
命令)。这样做基本上是告诉Docker在无限循环中运行true
命令。
postgres 11也有同样的问题。
对我有帮助的几点:
docker-comort rm
docker-composbuild
docker-comort up
在将步骤docker-comort rm
添加到混合中后,它终于起作用了。