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 builddocker-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一个目录。