手把手教 | Docker Compose快速启动Postgres

5,790 阅读2分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

借助于容器技术,我们能够方便的创建运行测试环境,今天这篇文章手把手教你们使用Docker Compose快速启动Postgres。

一、创建Docker Compose文件

首先创建一个文件夹来存储我们的文件:

mkdir ~/postgres-demo && cd ~/postgres-demo

然后创建一个 docker-compose. yml 文件:

touch docker-compose.yml

在文件中添加以下内容:

version: '3'

services:
  postgres:
    image: postgres:13.1
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
      timeout: 45s
      interval: 10s
      retries: 10
    restart: always
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=password
      - APP_DB_USER=docker
      - APP_DB_PASS=docker
      - APP_DB_NAME=docker
    volumes:
      - ./db:/docker-entrypoint-initdb.d/
    ports:
      - 5432:5432
  • image,指定使用何种 Docker 映像,包括版本号
  • healthcheck,用于确保 Postgres 正在运行,然后依赖于它的其他服务才能运行
  • restart,重新启动总是确保 DB 在系统启动时启动

下面的环境变量用于分配 Postgres 主数据库的用户名和密码:

  • POSTGRES_USER 用户
  • POSTGRES_PASSWORD 密码

init 脚本使用以下环境变量创建数据库用户和数据库供应用程序使用:

  • APP_DB_USER 应用程序数据库
  • APP_DB_PASS 应用程序数据库通过
  • APP_DB_NAME 应用程序数据库名

对于volume选项,我们将在/docker-entrypoint-initdb.d/中将名为db的本地文件夹映射到容器中的文件夹,这是我们将在下一步中放置数据库init脚本的地方。

我们还通过将Postgres端口分配给端口选项,将端口暴露于我们的服务器,这将允许我们从本地机器连接到数据库。

二、创建数据库init脚本

创建一个名为 db 的文件夹来存储 init 脚本。

mkdir db

创建一个名为01-init.sh 的脚本。

touch db/01-init.sh

添加以下内容:

#!/bin/bash
set -e
export PGPASSWORD=$POSTGRES_PASSWORD;
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
  CREATE USER $APP_DB_USER WITH PASSWORD '$APP_DB_PASS';
  CREATE DATABASE $APP_DB_NAME;
  GRANT ALL PRIVILEGES ON DATABASE $APP_DB_NAME TO $APP_DB_USER;
  \connect $APP_DB_NAME $APP_DB_USER
  BEGIN;
    CREATE TABLE IF NOT EXISTS event (
	  id CHAR(26) NOT NULL CHECK (CHAR_LENGTH(id) = 26) PRIMARY KEY,
	  aggregate_id CHAR(26) NOT NULL CHECK (CHAR_LENGTH(aggregate_id) = 26),
	  event_data JSON NOT NULL,
	  version INT,
	  UNIQUE(aggregate_id, version)
	);
	CREATE INDEX idx_event_aggregate_id ON event (aggregate_id);
  COMMIT;
EOSQL

这个脚本将:

  • 创建一个新用户,其名称分配给 app_db_user,密码分配给 app_db_pass
  • 用分配给 APP_db_name 的任何名称创建一个数据库
  • 为数据库上的用户授予所有权限
  • 连接到数据库并创建一个名为 event 的表

三、docker-compose up

运行 docker compose 以启动 Postgres 数据库并运行数据库 init 脚本。

docker-compose up

少年,没看够?点击石头的主页,随便点点看看,说不定有惊喜呢?欢迎支持点赞/关注/评论,有你们的支持是我更文最大的动力,多谢啦!