关于postgresql:Docker postgres不在docker-entrypoint-initdb.d中运行init文件

Docker postgres does not run init file in docker-entrypoint-initdb.d

基于Docker的Postgres文档,我可以在/docker-entrypoint-initdb.d中创建任何*.sql文件,并让它自动运行。

我有含有CREATE DATABASE ronda;init.sql

在我的电脑里,我有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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,

1
2
3
4
FROM library/postgres

RUN mkdir -p /docker-entrypoint-initdb.d
COPY init.sql /docker-entrypoint-initdb.d/

运行docker-compose builddocker-compose up工作正常,但没有创建数据库ronda


如果您的初始化要求只是创建ronda模式,那么您可以使用文档中描述的POSTGRES_DB环境变量。

那么,Postgres服务的docker-compose.yml文件的位将是:

1
2
3
4
5
6
7
8
9
postgres:
  restart: always
  build: ./postgres/
  volumes_from:
    - DATA
  ports:
    -"5432:5432"
  environment:
    POSTGRES_DB: ronda

另一方面,不要将restart: always用于您的data容器,因为此容器不运行任何服务(仅运行true命令)。这样做基本上就是告诉Docker在无限循环中运行true命令。


这就是我如何在项目中使用Postgres并预加载数据库。

文件:docker-compose.yml

1
2
3
4
5
6
7
8
9
  db:
    container_name: db_service
    build:
      context: .
      dockerfile: ./Dockerfile.postgres
    ports:
      -"5432:5432"
    volumes:
      - /var/lib/postgresql/DATA/

如果项目的根文件夹上存在名为pg_dump.backuppsql_dump.sql的文件,则此Dockerfile加载该文件。

文件:dockerfile.postgres

1
2
3
4
5
6
7
8
9
10
11
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/

如果需要重新加载转储,可以使用以下命令删除当前数据库:

1
docker-compose rm db

然后可以运行docker-compose up来重新尝试加载数据库。