Help us understand the problem. What is going on with this article?

psql コマンドは Docker コンテナとして実行しよう

ターミナルから psql コマンドを使って外部の PostgreSQL サーバに接続したいが、 psql コマンドを使うためには作業マシンに PostgreSQL をインストールしなければならない。

作業マシンに PostgreSQL をインストールすると何が起きるかというと、 createuser のような「PostgreSQL っぽくない名前のコマンド1」がインストールされてしまう。これがあまり好きではなく、この理由のため自分は作業マシンに PostgreSQL をインストールしたくない。

しかし、外部の PostgreSQL サーバと接続するために psql コマンドだけは使いたい。

こういうときは、Docker の出番である。

~/.bashrc
alias psql="docker run --rm -it --net=host postgres psql"

psql コマンドは Docker コンテナの中で動かすことにして、シェルの alias で普通の psql コマンドとして使えるようにしている。

--net=host はなくても構わないのだけど、これがあると同じ端末内の別の Docker コンテナで PostgreSQL サーバが動いていてポートがマッピングされている場合に「ホスト名 localhost」としてアクセスできるようになる。

コンテナ内に環境を閉じ込めることで psql 以外のコマンドはホスト側に露出することがなくなり、いい感じなった。

AWS CLI もそう 2 だけど、コマンドを Docker コンテナの中に閉じ込めて実行するというスタイルは当たり前になっていくのかもしれない。

[追記] pg_dumppg_restore が欲しくなった場合

pg_dumppg_restore が欲しくなった場合も同様に alias を追加すれば良い。

$ alias pg_dump='docker run --rm -it -v $(pwd):/tmp -w /tmp --net=host postgres pg_dump'
$ alias pg_restore='docker run --rm -it -v $(pwd):/tmp -w /tmp --net=host postgres pg_restore'

使うときはこう。

$ pg_dump -Fc --no-acl --no-owner -U <username> -h <host> <database> -f data.dump
$ pg_restore -Fc -U <username> -h <host> -d <database> data.dump

ただし注意点として、 pg_dump を Docker コンテナで動かす場合は標準出力を使わずに -f オプションでファイルに書き出す必要がある。どうやら -t オプションでコンテナに擬似 TTY を割り当てた状態で標準出力でホストに直接ファイルを書き出すと改行コード周りがおかしくなってしまうらしく、リストア時に pg_restore: error: could not read from input file: end of file というエラーが出てしまう。かといって -t を外すと今度はパスワードプロンプトに入力することができなくなってしまう。

hoto17296
ゆとりデータ分析マン
https://hoto.me/
churadata
沖縄で データ分析 / 機械学習 / Deep Learning をやっている会社です
https://churadata.okinawa/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした