docker-compose.ymlをまとめて実行するpdrというコマンドを作った

課題

現在所属しているGMOペパボのあるサービスの開発環境が下記のような構成になっていました。

いくつかのリポジトリをまたいでサービスが構築されており、それぞれのリポジトリに docker-compose.yml ファイルがあります。そしてそれらの docker-compose.yml はネットワークを共有しており、相互にコンテナがアクセス可能な状態です。例えばDBサーバや、APIサーバを共用しているようなイメージですね。こういった構成を取るときに、RepoAのコンテナだけ再起動したいとか、コンテナの状態をみたいとか、または再作成したいというときにいちいちリポジトリのディレクトリに移動して、コマンドを実行するのが非常に面倒であったので、コマンドを一つ書くことにしました。類似実装のようなものもあるのですが、少々やりたいことに対して重い実装だったので自分でサクッと書いたパターンです。

pdrコマンドでできること

pdr up (-i) で対話的にdocker-compose upを実行(down,rm)

$ pdr up -i

このように打つと、pecoが内部で実行されて、定義ファイルに定義されたリポジトリを選択できるので、エンターを押すと、そのリポジトリで docker-compose up -d が実行されます。これらの操作は down , rm コマンドも対応しています。

pdr psコマンドでコンテナの起動状況を確認

定義されているリポジトリに対して docker-compose ps を発行して、一覧表示できます。

pdr loginコマンドで起動しているコンテナに対話的にログイン

よくpecoを利用して実行するようなオペレーションですが、 pdr login と打つとpecoが起動して、起動しているコンテンを選択できるので選択すると /bin/bash でログインします。また起動シェルはオプションで指定できます。

pdr logコマンドで起動しているコンテナのログを見る

これもloginコマンドと似ていますが、起動しているコンテナを対話的に選択し、ログを見ることができます。先述のloginコマンドと、logコマンドは定義ファイルを必要としないので、これだけでも便利かもしれません。

インストール方法

現状はOSXでのインストール方法のみ準備しています。

$ brew tap pyama86/homebrew-ptools
$ brew install pdr

定義ファイル

定義ファイルは ~/.pdr に配置してください。

repos:
  proxy:
    path: /path/to/proxy
    depends:
      - api
  api:
    path: /path/to/api
    depends:
      - db
  db:
    path: /path/to/db

形式としては名前の下に、パスと依存関係がぶら下がる形式です。パスはdocker-compose.ymlが存在するパスを指定してください。 depends は文字通り依存なのですが、例えば api を起動する前に、 db を起動したいならば上記のように api の依存に db を書いておくと、 api の起動前に自動で db を起動してくれます。

最後に

お察しかと思いますが、pdrは pyama docker revolution の略です。実装も小さく、似たような課題をお持ちの方がいればシュッと利用できると思うので是非試してみてください!