Compose ↔ docker run
Web処理はすべてブラウザ内で完結します。データは送信されません
双方向に対応します:compose の `services:` 部分を貼れば `docker run` コマンドが出て、`docker run` コマンドを貼れば compose の断片が出ます(種別は自動判定)。 ⚠️ ただし 2 つの形式は表現力が等しくなく、完全な変換はありえません。 使う前に知っておくべき最重要の点です: · `depends_on`・`deploy`(レプリカ数・リソース制限)・`profiles`・`extends` —— compose にはあり、`docker run` には対応物がありません。特にレプリカ数:`docker run` はコンテナを 1 つ起動するだけで、「3 レプリカ」という概念が単一コマンドには存在しません。 · `${VAR}` 展開、`env_file` と `.env` のマージ順、相対パスの基準ディレクトリ(compose はファイルのあるディレクトリ、`docker run` はカレントディレクトリ)—— 変換後に意味が変わります。しかも結果はごく自然に見えます。 そこでここでは、1 対 1 で対応するものは変換し、対応しないものは理由付きで列挙します。`deploy` を黙って捨てれば、そのコマンドが元のサービスと等価だと誤解され、実際に配備して初めて不足に気づくことになります。 ⚠️ もうひとつの落とし穴は `docker run` の引数の位置です。イメージの後にある `-` で始まる語は docker のオプションではなく、コンテナ内で実行するコマンドの引数です(`docker run nginx -g "daemon off;"` の `-g` は nginx のものです)。位置で切り分けるため、コマンドはそのまま残ります。すべてブラウザー内で完結します。 Docker のアドレスプールとサブネット(`daemon.json` の `default-address-pools` / `bip`)を計画したい場合は別のツールです:「Docker サブネット設計」。
機能
- 双方向を自動判定:compose の services 部分 ↔ 完全な docker run コマンド
- image・container_name・ports・volumes・environment・env_file・command・entrypoint・restart・network_mode・working_dir・user・hostname
- スイッチ系:privileged・read_only・tty・stdin_open
- healthcheck の test 配列を --health-cmd に変換。interval / timeout / retries も
- ポートは短縮形と長形式(target / published / protocol)の両方に対応。tcp 以外は接尾辞付き
- ボリュームの長形式(source / target / read_only)を `-v src:dst:ro` に
- ⚠️ depends_on・deploy・profiles・extends は個別に列挙し、対応物がない理由を説明します
- ⚠️ build・複数ネットワーク・名前付きボリューム・空の `KEY=` は意味が変わる箇所として明示します
- ⚠️ 解釈できない docker オプションは正直に報告し、結果に紛れ込ませません
- ⚠️ 行末の継続記号に対応 —— `docker ps` やドキュメントからコピーしたコマンドには必ず付いています
- ⚠️ イメージ以降の引数はコマンドとして切り分け、`-g` などを docker オプションとして捨てません
- すべてブラウザー内で完結します
使い方
- compose の services 部分、または docker run コマンドを貼り付けます
- 必要ならオプションで変換するサービスを 1 つ指定します
- コマンドまたは断片を確認し、次に「引き継げなかったもの」と「意味が変わる点」を確認します
よくある質問
- 一部の設定が引き継がれないのはなぜですか?
- `docker run` に対応物がないからです。最も分かりやすいのは `deploy` で、これはレプリカ数・リソース制限・ローリング更新の方針を設定するもので、オーケストレーション層に属します。一方 `docker run` はコンテナを 1 つ起動するだけなので、「3 レプリカ」は単一コマンドに存在しません(`docker service` やオーケストレーターが必要です)。`depends_on`(起動順)と `profiles`(切り替え)も同じです。表現できないものを黙って捨てると、そのコマンドが元のサービスと等価だと誤解され、配備して初めて気づくことになります。
- 変換後に相対パスが狂うことがあるのはなぜですか?
- 基準ディレクトリが異なるからです。compose の相対パスはcompose ファイルのあるディレクトリを基準に解決され、`docker run` の引数はカレントディレクトリを基準に解決されます。`./site:/usr/share/nginx/html` は、compose ファイルが `/srv/app/docker-compose.yml` にあるときは `/srv/app/site` を指しますが、変換したコマンドを別の場所で実行すればそのときいるディレクトリを指します。コマンドは同じに見えて、別の場所をマウントします。
- `-d` と `--rm` が消えるのはなぜですか?
- compose では service 定義の一部ではないからです。`-d`(バックグラウンド実行)は `docker compose up -d` というコマンドレベルのスイッチで、個々のサービスに書く意味はありませんし、`--rm` にも対応する compose のキーがありません。消えるのは正しい動作で、compose の意味論ではそもそも書くべきものではありません。
- イメージの後の `-g` が捨てられないのはなぜですか?
- docker の文法が `docker run [オプション] イメージ [コマンド]` であり、イメージ以降はすべてコンテナ内で実行するコマンドだからです。`docker run nginx -g "daemon off;"` の `-g` は nginx の引数で、docker のスイッチではありません。位置で切り分けることでコマンドにそのまま残ります。切り分けなければ、未知の docker オプションとして捨てられ、compose ファイルは完全に見えたままになります。
- Podman や Kubernetes に変換できますか?
- できません。ここで扱うのは compose と `docker run` だけです。Kubernetes への変換は桁が違います:Deployment を Service・ConfigMap・Secret にどう分割するかはクラスターの構成次第で、1 対 1 の対応ではありません。無理に作った YAML は動きますが、保守しにくいものになります。
- daemon.json のアドレスプール設計はどこですか?
- 別のツール「Docker サブネット設計」です。こちらは compose と `docker run` の相互変換だけを行います:片方はサービス編成ファイル、もう片方は単一の実行コマンドです。アドレスプール(`default-address-pools`)と docker0 の `bip` は daemon レベルの設定で、コンテナの起動コマンドには対応物がありません。そのため別のツールに分け、1 ページで 2 つの事柄を混同しないようにしています。
関連ツール
Docker サブネット設計
WebDocker の default-address-pools と bip を設計。コンテナ数からプレフィックスを自動選択し、各サブネットの使用可能アドレスと既定範囲との重複も確認。
JSON 整形
整形JSON をブラウザ内で整形・圧縮・検証。折りたたみ可能なツリーで表示し、キーと値の検索、行番号とハイライト付きの編集、Python dict への変換にも対応。
YAML 変換
整形YAML と JSON を双方向に変換します。複数ドキュメント、アンカーと別名、マージキーにも対応し、大きな整数も桁を失いません。エラーは行と列で示します。
パス変換
WebWindows・スラッシュ区切り・WSL(/mnt/c)・Git Bash(/c)の 4 つの表記を一度に出力します。末尾のスラッシュもそのまま保持。すべてブラウザ内で処理します。
URL 解析
WebURL を解析し、スキーム・ホスト・ポート・パス・クエリパラメータ・アンカーに分解します。パラメータは元の値とデコード値を並記。すべてブラウザ内で処理します。
UA 解析
WebUser-Agent を解析し、ブラウザ・バージョン・OS・デバイス種別・エンジンを判定します。判定はパターン照合による概算です。すべてブラウザ内で処理します。