问题描述
在使用Docker Compose时,遇到了设置具有已知配置的PostgreSQL服务器的问题。他已经有了一个Docker Compose脚本,其中启动了一个PostgreSQL容器和一个应用程序容器。虽然应用程序能够与数据库进行通信,但是PostgreSQL服务器处于基本上无法使用的状态,因为它没有关于数据库、用户等设置的配置(除了默认配置)。用户想知道有没有更好的方法在基于Docker Compose的系统中设置带有已知配置的PostgreSQL服务器。
解决方案
最佳实践:使用Alpine镜像、环境变量和扩展镜像
为了在Docker Compose中设置带有已知配置的PostgreSQL服务器,我们可以采取以下步骤:
-
使用Alpine镜像:使用Alpine版本的PostgreSQL镜像可以减小容器的大小并提高性能。Alpine是一个轻量级的Linux发行版,它的镜像尺寸通常较小,这有助于减少资源消耗和启动时间。
-
使用环境变量:PostgreSQL镜像支持使用环境变量来配置数据库,用户等设置。通过设置环境变量,我们可以在容器启动时自动完成配置。
-
使用
/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