提问者:小点点

docker postgres不会在docker-entrypoint-initdb. d中运行初始化文件


基于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-composbuilddocker-composup工作正常,但未创建数据库ronda


共3个答案

匿名用户

这就是我在项目中使用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添加到混合中后,它终于起作用了。