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を消す (だけ)。