在Docker Compose中设置带有已知配置的PostgreSQL服务器

74次阅读
没有评论

问题描述

在使用Docker Compose时,遇到了设置具有已知配置的PostgreSQL服务器的问题。他已经有了一个Docker Compose脚本,其中启动了一个PostgreSQL容器和一个应用程序容器。虽然应用程序能够与数据库进行通信,但是PostgreSQL服务器处于基本上无法使用的状态,因为它没有关于数据库、用户等设置的配置(除了默认配置)。用户想知道有没有更好的方法在基于Docker Compose的系统中设置带有已知配置的PostgreSQL服务器。

解决方案

最佳实践:使用Alpine镜像、环境变量和扩展镜像

为了在Docker Compose中设置带有已知配置的PostgreSQL服务器,我们可以采取以下步骤:

  1. 使用Alpine镜像:使用Alpine版本的PostgreSQL镜像可以减小容器的大小并提高性能。Alpine是一个轻量级的Linux发行版,它的镜像尺寸通常较小,这有助于减少资源消耗和启动时间。

  2. 使用环境变量:PostgreSQL镜像支持使用环境变量来配置数据库,用户等设置。通过设置环境变量,我们可以在容器启动时自动完成配置。

  3. 使用 /docker-entrypoint-initdb.d 目录扩展镜像:在Alpine版本的PostgreSQL镜像中,我们可以将初始化数据库的SQL脚本放置在 /docker-entrypoint-initdb.d 目录中,这些脚本将在容器启动时自动执行。

以下是一个示例的Docker Compose配置,用于在开发环境中设置带有已知配置的PostgreSQL服务器:

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:

在这个示例中,我们首先定义了三个服务:example(应用程序容器)、example__migrator(应用程序数据库迁移容器)和pg(PostgreSQL容器)。通过设置各个容器的配置,我们实现了以下操作:

  • 使用Alpine版本的PostgreSQL镜像(postgres:10.0-alpine)。
  • 通过环境变量配置PostgreSQL数据库,用户等信息。
  • 将数据库初始化脚本放置在/docker-entrypoint-initdb.d 目录中,以便在容器启动时自动执行。

请注意,以上示例中的Dockerfile.development和其他变量需要根据实际情况进行修改。

为什么使用Alpine镜像?

使用Alpine镜像的优势在于它具有轻量级的特性。与其他常见Linux发行版相比,Alpine镜像的大小更小,因此能够减少磁盘空间的占用以及容器的启动时间。此外,Alpine Linux默认提供了一个经过加固的内核,以及已经启用了堆栈保护的用户空间二进制文件。

总结起来,通过使用Alpine镜像、环境变量配置和扩展镜像,我们可以在Docker Compose中实现带有已知配置的PostgreSQL服务器。这将使服务器的设置更加方便和可维护,同时还能减小容器的大小和资源消耗。

【评论】
1. 为什么使用Alpine镜像?有什么优势?
使用Alpine镜像的优势主要在于其轻量级的特性。Alpine Linux是一个轻量级的Linux发行版,其镜像尺寸通常较小,这有助于减少磁盘空间的占用和容器的启动时间。例如,Alpine版本的PostgreSQL镜像相较于其他版本的PostgreSQL镜像,其大小更小,但功能相同。另外,Alpine Linux默认提供了一个经过加固的内核,以及已经启用了堆栈保护的用户空间二进制文件,从而增强了容器的安全性。

【参考链接】
Alpine Linux – Why Alpine?
PostgreSQL Docker Official Images – Environment Variables
PostgreSQL Docker Official Images – How to Extend This Image

正文完