我有一个docker-compose脚本,它启动了一个Postgres容器和一个像这样的应用容器。但是,postgres服务器处于基本无法使用的状态,因为它没有关于数据库,用户等设置的配置(默认设置除外)。看来,解决此问题的推荐方法是从postgres中创建自己的“ db映像”并运行一些shell脚本来处理事务(然后您的合成使用此映像),但是这对我来说似乎很棘手且令人困惑。

在基于docker-compose的系统中,有没有人能更好地设置具有已知配置的Postgres服务器?

#1 楼

首先,请尽可能使用高山图像。

其次,请使用ENV变量来准备数据库配置。更多信息。

第三,使用/docker-entrypoint-initdb.d目录扩展图像。更多信息。

具有开发环境的示例堆栈。

version: '3.2'
services:
  example:
    image: "${EXAMPLE_SERVICE}:${EXAMPLE_SERVICE__VERSION}-development"
    build:
      context: .
      dockerfile: Dockerfile.development
    networks:
      - net
    ports:
      - 5000:5000
    depends_on:
      - example__migrator
    stdin_open: true
    tty: true
    environment:
      POSTGRES_PASSWORD: example
      POSTGRES_DB: example
      POSTGRES_USER: example
      POSTGRES_HOST: pg.example_net
      POSTGRES_PORT: 5432
      FLASK_APP: app.py
      FLASK_DEBUG: 1
    volumes:
      - .:/home/example
  example__migrator:
    image: "${EXAMPLE_SERVICE}:${EXAMPLE_SERVICE__VERSION}-development"
    build:
      context: .
    command: sh -c './wait-for pg.example_net:5432 -- python manage.py db upgrade'
    networks:
      - net
    depends_on:
      - pg
    environment:
      POSTGRES_PASSWORD: example
      POSTGRES_DB: example
      POSTGRES_USER: example
      POSTGRES_HOST: pg.example_net
      POSTGRES_PORT: 5432
  pg:
    image: postgres:10.0-alpine
    networks:
      - net
    ports:
      - 5432:5432
    volumes:
      - pg_data:/var/lib/postgresql/data/pg_data
    environment:
      POSTGRES_PASSWORD: example
      POSTGRES_DB: example
      POSTGRES_USER: example
      POSTGRES_HOST: pg.example_net
      POSTGRES_PORT: 5432
      PGDATA: /var/lib/postgresql/data/pg_data
networks:
  net:
volumes:
  pg_data:


评论


为什么要使用Alpine?有什么好处?

–防晒
19年7月29日在3:48

首先,默认情况下为4-5 MB的轻量级。例如,postgres:9.6.14是84 MB,postgres:9.6.14-alpine是15 MB,具有相同的功能。其次,默认情况下,Alpine Linux附带一个强化的内核,并且所有用户空间二进制文件都已预编译了堆栈粉碎保护。

– AfsmNGhr
19年7月29日在17:53