こんにちは、こんばんは、おはようございます。
K.S.ロジャースの島袋です。
複数の開発を並行、もしくはスワップ処理的に行っていると下記のようなエラーに遭遇したことはありませんでしょうか?
Bind for 0.0.0.0:3000 failed: port is already allocated
そうです。別々のdockerコンテナが同じポートで競合して起動できない!って状態です。
同時進行案件数が2つ、3つであれば調査は簡単です。しかし、10件、20件(そんなにコンテナ立てないだろうけど…)とコンテナが増えるほど探すのが面倒になったりしませんか?
そこで、Mac限定でありますが、シェルスクリプトを できるだけ 書かずにコンテナを全部止めてくれるアプリケーションを作ろうと思います。
(コマンドで一発じゃん…ってツッコミはなしでお願いします)
Automater
Macには Automater
というアプリを作れるアプリがあります。
正確には名前のまんまあらゆることを自動化するためのアプリです。Windowsで言えばマクロにあたるものです。
今回はこれを使って作成します。
アプリの新規作成
まずはAutomaterを起動してアプリケーションを新規作成します。
実行中のコンテナ名を取得
アクションから シェルスクリプトを実行
を選びます。シェルは無難に bash
を選択し、下記のスクリプトを入力。dockerのディレクトリに関しては各自の環境に合わせてください。
/usr/local/bin/docker ps --format "{{.Names}}"
さっそくシェルスクリプトを書いちゃいましたが、気にせず次に行きましょう。
変数に格納
プログラミングがお仕事の人には当たり前ですが、直前の結果を変数に格納します。
アクションから 変数の値を設定
を選びましょう。直前のスクリプトの結果を格納できます。変数名はお好きにどうぞ。
確認ダイアログを出す
Automaterを使う最大の理由がこのアクションです。
JSのダイアログのように、コンテナ停止前にユーザーに確認をとります。もちろんここでキャンセルを押せば処理は止まります。
ここで 変数が空であるか
の条件分岐を行うのが理想ですが、 できるだけ シェルスクリプトを書かない方針なので文言表記で逃げます。
コンテナを停止
最後に停止させるための設定を行いましょう。アクションから シェルスクリプトを実行
を選びます。はい、シェルスクリプトを書きます。
CONTAINERS="$(/usr/local/bin/docker ps -q)"
if [ -n "$CONTAINERS" ]; then
/usr/local/bin/docker stop $CONTAINERS
fi
2個目のシェルスクリプトですが、 できるだけ 書かないという目標はほぼほぼ達成できたと考えましょう。
あとは任意の場所を指定して保存するとアプリケーションが作成されています。
実行
あとは他のアプリと同じようにランチャーで呼び出すなり、ダブルクリックなりで起動してしまえば下記のようなダイアログが出て、 停止
をクリックを押して起動中のコンテナを全て停止することができます。
まとめ
正直最後のコマンドをワンライナーにしてしまえば良いと言えば良いのですが、アプリケーションにする利点の一つに非エンジニアでも手軽に同じような結果を得られるところにあるかと思います。
例えば、デザイナーさんにdockerの環境を導入して上げたい場合にネックになるのが、コマンドによる起動・停止・再起動になります。そこで今回のようにそれぞれのアプリケーションを作成して渡してしまえば解決できます。
ちなみにワンライナーだとこうなります。
docker stop $(docker ps -q)
初めてAutomaterを使ってみましたが、Automaterはチーム全体の効率化に繋がるかもと思いました。今後機会があれば業務でも使ってみたいと思います。(Mac限定がネックですが…)
あとづけ
ちなみに弊社、Tech系以外にも会社ブログも掲載してますので、気になった方は是非どうぞ。
https://www.wantedly.com/companies/ks-rogers