small is beautiful

be the worst

Docker: PostgreSQL9.6のcontainerを立てる

locale設定で僅かに躓きました。

Dockerfile

FROM postgres:9.6

RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja  
ENV LC_ALL ja_JP.UTF-8   
ENV POSTGRES_USER postgres
ENV POSTGRES_DB postgres
ENV PGDATA /var/lib/postgresql/data/pgdata
ENV POSTGRES_INITDB_ARGS --data-checksums --encoding=UTF-8

Environment Variablesの説明

name default discription
POSTGRES_USER postgres superuserの権限を持つuser name, 且つこの設定したnameのdatabaseが作られる.
POSTGRES_DB same as username database name. user nameと同じにする.
PGDATA /var/lib/postgresql/data dataの格納先. subdirectoryが望ましい.
POSTGRES_INITDB_ARGS initdb の際に渡される引数.

build

docker build --no-cache=false --rm=true --force-rm=false --tag=postgres:9.6 --file=./Dockerfile .

run

passwordの取扱

As an alternative to passing sensitive information via environment variables, _FILE may be appended to some of the previously listed environment variables, causing the initialization script to load the values for those variables from files present in the container. In particular, this can be used to load passwords from Docker secrets stored in /run/secrets/<secret_name> files. For example:

とのことで, 変数で指定せず、外部ファイル化する。

touch postgres-passwd # write password
docker run --name postgres -t -e POSTGRES_PASSWORD_FILE=/postgres-passwd -v "$PWD/postgres-passwd:/postgres-passwd" -d postgres:9.6

接続

psql client用postgres containerを起動し、container内からlinkした先ほどのcontainerへ接続する。

# required password.
docker run -it --rm --link postgres:localpsql postgres:9.6 psql -h localpsql -U postgres

若しくは現在起動中のcontainerへ接続し、psqlでログインする。

# not required password.
docker exec -it postgres psql -U postgres

trouble shooting

docker run時に、containerが即時exitする。

docker ps -a
CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS                         PORTS                      NAMES
041d1fe593df        postgres:9.6                          "docker-entrypoint.s…"   23 seconds ago      Exited (1) 21 seconds ago                                 postgres

docker logs 041d1fe593df
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

initdb: invalid locale settings; check LANG and LC_* environment variables

initdb: invalid locale settings; check LANG and LC_* environment variables

localeの変数指定が良くない。

最初は以下のようにLANGを指定していたが

ENV LANG ja_JP.utf8

以下のように変更した。

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja  
ENV LC_ALL ja_JP.UTF-8   

docker runしようとしたらcontainer nameがconflict

docker run --name postgres -t -e POSTGRES_PASSWORD_FILE=...
docker: Error response from daemon: Conflict. The container name "/postgres" is already in use by container
docker stop postgres
docker rm postgres

既存のcontaierを消す (だけ)。

参考