Docker postgres不会在docker-entrypoint-initdb.d中运行init文件
基于Docker的Postgres 文档 ,我可以在/docker-entrypoint-initdb.d
创build任何*.sql
文件并自动运行。
我有init.sql
包含CREATE DATABASE ronda;
在我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
没有创build。
如果初始化需求只是创buildronda
模式,那么您可以使用文档中描述的POSTGRES_DB
环境variables。
那么postgres服务的docker-compose.yml文件的位就是:
postgres: restart: always build: ./postgres/ volumes_from: - data ports: - "5432:5432" environment: POSTGRES_DB: ronda
请注意,不要使用restart: always
为您的data
容器,因为此容器不运行任何服务(只是true
命令)。 这样做基本上是让Docker在无限循环中运行true
命令。
这是我如何在我的项目中使用postgres并预加载数据库。
file: docker-compose.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-compose up
来重新加载数据库。
您只需要Add
文件如下:
FROM library/postgres ADD init.sql /docker-entrypoint-initdb.d/
请注意,该文件应该在Dockerfile所在的文件夹中,而且不需要使用mkdir命令创build一个目录。