『Docker』通过docker-compose获取开发用的PostgreSQL(版本01)

1. 目标

因为我想要一个可以进行详细设置的PostgreSQL的docker-compose,所以我想尝试一下Docker官方镜像。

由于我对Docker和PostgreSQL都是初学者,所以如果您有更好的方法,请教教我,不胜感激m(_ _)m

在引入Docker之前,请参考以下链接:
https://qiita.com/tsnb/items/d10d2770c08abc60b500

建立版本01

根据公式说明进行撰写。
https://docs.docker.com/samples/library/postgres/#environment-variables

希望在ver.01版本中完成的事项:

    • (A).ロケールを日本語に変更する

 

    • (B).初期化時にユーザとデータベースを作成する

 

    • (C).postgresql.confを設定する

 

    • とりあえず、shared_buffers=256MBにしてみる

 

    (D).pgdataデータの永続化
|--Dockerfile
|--conf
|  |--my-postgresql-10.1.conf(shared_buffers=256MBに変更したもの)
|  |--postgresql-10.1.conf(オリジナルファイル、一旦docker runしてコピーしたもの)
|--data
|--01postgre.yml
|--work
|  |--init-user-db.sh(initdb時に行いたい処理を書く)

[主持者]是在主机上执行的命令。

# 適当なディレクトリを作成
[host]$ mkdir -p ~/test/{work,data,conf}
[host]$ chown 1000 ~/test/{work,data,conf} #要らないか?

# ディレクトリに入る
[host]$ cd ~/test

# ~/testディレクトリ以下に、01postgre.ymlとDockerfileを置く。
# ~/test/workディレクトリ以下に、init-user-db.shを置く。

# postgres:10.1のコンテナを立ち上げて、ホストへ設定ファイルを持ってくる
[host]$ docker run --name temp -d postgres:10.1 /bin/bash
[host]$ docker cp temp:/usr/share/postgresql/ ./temp/
[host]$ cp ./temp/postgresql.conf.sample ./conf/postgresql-10.1.conf
[host]$ cat ./conf/postgresql-10.1.conf |sed "s/^#shared_buffers = 32/shared_buffers = 256/g" > ./conf/my-postgresql-10.1.conf

# tempディレクトリとコンテナは要らなければ削除しておく。

# 起動
[host]$ docker-compose -f ./01postgre.yml up -d --build

# コンテナ確認
[host]$ docker ps -a
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                  PORTS                              NAMES
5b8947145ece        test_postgres-ha                     "docker-entrypoint..."   14 minutes ago      Up 14 minutes           0.0.0.0:15432->5432/tcp            test_postgres-ha_1

# 出来たコンテナの名前を指定してコンテナに入る
# postgreでログイン出来ることがわかる
[host]$ docker exec -it test_postgres-ha_1 /bin/bash
postgres@5b8947145ece:/$ 

# (A)の確認:psqlでロケールがデフォルトからja_JP.UTF-8に変わっていることを確認。
# (B)の確認:dockerというユーザが出来ている。
$ psql -l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 docker    | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | docker=CTc/postgres
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

# (C)の確認:256MBの設定がホストからコピー出来ていることを確認。
$ cat /etc/postgresql/postgresql.conf |grep ^shared_buffers
shared_buffers = 256MB          # min 128kB

# (D)の確認:色々データがホスト上のディレクトリ内に出来ていることを確認。
[host]$ ls data/pgdata/
PG_VERSION  global        pg_dynshmem  pg_ident.conf  pg_multixact  pg_replslot  pg_snapshots  pg_stat_tmp  pg_tblspc    pg_wal   postgresql.auto.conf  postmaster.opts
base        pg_commit_ts  pg_hba.conf  pg_logical     pg_notify     pg_serial    pg_stat       pg_subtrans  pg_twophase  pg_xact  postgresql.conf       postmaster.pid

# listen_address
# 他のコンテナがポストグルにアクセスできるようにlisten_addresses = '*'を設定する
[host]$ cat conf/my-postgresql-10.1.conf |grep listen_address
listen_addresses = '*'

version: '3'
services:
  postgres-ha:
    # Dockerfileでbuildしたものを実行
    # ロケールを変更するためにbuildを行う
    build:
      context: .

    environment:
      # ディレクトリの場所を指定
      PGDATA: /var/lib/postgresql/data/pgdata

      # この環境変数は、su権限を持つ指定されたユーザーと同じ名前のデータベースを作成
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "changeme"

      # エンコーディングを指定しておく
      # initdbで指定できる内容はここで指定可能
      # https://www.postgresql.org/docs/10/static/app-initdb.html を参照。
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=ja_JP.UTF-8"

    # ttyをtrueに設定しておくと、コンテナが起動し続ける
    tty: true
    restart: always

    # loginユーザを指定
    user: root

    # 追加の初期化を行う場合は、/docker-entrypoint-initdb.dに* .sql、* .sql.gz、* .shスクリプトを1つ以上追加する。
    # エントリポイントがinitdbを呼び出してデフォルトのpostgresユーザとデータベースを作成した後、
    # * .sqlファイルが実行され、そのディレクトリにある* .shスクリプトがすべてソースされ、
    # サービスを開始する前にさらに初期化が行われる。
    volumes:
      - ./work:/docker-entrypoint-initdb.d/

      # pgdataをホストに置く。データ永続化。
      - ./data/:/var/lib/postgresql/data/

    stdin_open: true
    ports:
      - "15432:5432"
    networks:
      - postgres-ha

networks:
  postgres-ha:
    driver: bridge
# postgres:10.1を使用
FROM postgres:10.1

# ロケール設定
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8

# 作成した設定ファイルを/etc/postgresql以下にコピー
COPY ./conf/my-postgresql-10.1.conf /etc/postgresql/postgresql.conf

# config_fileを/etc/postgresql/postgresql.confに指定
CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]
#!/bin/bash
set -e

# initdbでdockerというユーザとデータベースを作成する
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

结束

广告
将在 10 秒后关闭
bannerAds