本文へスキップ

docker runをComposeに

docker run to Compose

docker runのコマンドラインをcomposeのサービス定義に直し、逆方向の変換もできます。

`docker run`のコマンドラインを、それに対応する`compose.yaml`のサービスに変換します。コマンドは本物のシェルのクォート規則で分解するので、`sh -c "…"`と書かれたエントリポイントも、空白とクォートをそのままに残します。

🔒 ブラウザの中だけで動きますdockercomposeconvertdevops

docker run コマンド

compose.yaml

注記

  • -d は docker run の呼び出し自体にしか効きません。Compose に対応するものがないので落としました。
コマンドは本物のシェルの引用規則で分解します。ですから sh -c "…" のようなエントリーポイントも空白ごと生き残ります。Compose に対応のないフラグ(--rm, -d)は理由を添えて落とします — ライフサイクルは Compose 自身が決めるからです。知らないフラグは黙って飲み込まず、必ず名前を挙げます。出力のポートを引用符で囲むのは、そうしないと YAML 1.1 が 8080:80 を 60 進数として読んでしまうからです。

使い方

  1. コマンドを貼り付けます

    行の継続、クォートされた値、イメージ名の後ろに続くコマンドも扱います。何も実行しません。文字が入って文字が出るだけです。

  2. 出力の下の注記を読みます

    Composeに対応する書き方が無いフラグは、黙って捨てずに一覧にします。知らないフラグは名前を挙げます。ファイルをコミットする前に確かめる値打ちがあるのは、その一覧です。

  3. composeファイルに貼り付けます

    出力はサービス1つ分です。すでにあるものと並べて`services:`の下に置き、コマンドに`--name`が無かったなら、好きな名前を付けてください。

よくある質問

ポートにクォートが付くのはなぜですか

YAML 1.1が`8080:80`を60進数として読むからです。誰も望まなかったのに、どのYAMLパーサも受け継いでしまった書き方です。クォートを付けて初めて、ポートの対応づけのまま残ります。Composeでいちばん有名な落とし穴です。

`--rm`と`-d`はどこへ行きましたか

注記を添えて落とします。ライフサイクルはCompose側の担当だからです。切り離すか付けたままにするかは`docker compose up`が決め、コンテナの削除は`docker compose down`が行います。サービスの水準に置き換えられる相手がありません。

composeファイル全体を書いてくれますか

書くのはサービスです。ネットワーク、最上位のボリューム、そして最近のComposeがもう求めない`version:`のキーは、自分で足すことになります。もっとも、たいていは必要ありません。

ここから渡せます

次の一手

このツールが出したものをそのまま受け取れる道具です。