本文へスキップ
App Museum
English

docker run → Docker Compose 変換ツール(compose.yaml 作成)

docker run のコマンドを貼るだけで compose.yaml に変換。ポート・環境変数・ボリューム・ネットワーク・ヘルスチェック・GPU など docker run の全オプションを読み取り、複数のコマンドを1つのファイルにまとめます。$(pwd) や $ の書き換え、Compose に無いオプションも知らせます。

複数のコマンドは改行で区切ります(行末の \ ・ ` ・ ^ で続く行も読めます)。docker network create と docker volume create も読み取ります。

変換の設定

外すと Compose が「プロジェクト名-サービス名-1」の名前を付けます。docker compose up --scale で台数を増やすときは外します。docker run で作った同じ名前のコンテナが残っていると起動できないので、先に docker rm で消してください。

名前付きボリューム(-v 名前:/パス)の扱い

今あるボリュームのデータをそのまま使えます。無ければ作られます。

Compose はボリュームを作りません。無いと起動に失敗します。

新しい空のボリュームになり、docker run のときのデータは引き継がれません。

compose.yaml

docker run のコマンドを入力すると、ここに compose.yaml が表示されます。

使い方

  1. 「docker run のコマンド」に、変換したい docker run のコマンドを貼り付けます。README や手順書のコマンドを、行末の \ ごとそのまま貼ってかまいません
  2. 下の「compose.yaml」に変換結果がその場で表示されます。「コピー」か「compose.yaml を保存」で取り出します
  3. 「確認してほしいこと」に、Compose に書けなかったオプションや、書き換えた箇所の説明が出ます。目を通してから使ってください
  4. compose.yaml をコマンドを実行していたフォルダに置き、docker compose up -d で起動します

複数のコマンドは改行で区切って貼ると、1つの compose.yaml の別々のサービスになります。docker network create と docker volume create の行も読み取り、ネットワークとボリュームの定義に入れます。docker pull や cd などほかのコマンドは飛ばして、飛ばしたことを知らせます。

「例を入れる」を押すと、PostgreSQL と nginx を同じネットワークで動かす例が入ります。入力したコマンドはブラウザの外へ送信されず、保存もされません。

具体例

次の3つのコマンドを貼ると、

docker network create app-net

docker run -d --name db --network app-net \
  -e POSTGRES_PASSWORD=example \
  -v pgdata:/var/lib/postgresql/data \
  --health-cmd "pg_isready -U postgres" --health-interval 10s \
  --restart unless-stopped postgres:17

docker run -d --name web --network app-net -p 8080:80 \
  -v "$(pwd)/html:/usr/share/nginx/html:ro" \
  --restart unless-stopped nginx:1.27

次の compose.yaml になります。

services:
  db:
    image: postgres:17
    container_name: db
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - app-net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: "10s"
  web:
    image: nginx:1.27
    container_name: web
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - "./html:/usr/share/nginx/html:ro"
    networks:
      - app-net
volumes:
  pgdata:
    name: pgdata
networks:
  app-net: {}
  • $(pwd)/html は、compose.yaml の場所から数えた ./html になります
  • pgdata には name: pgdata が付きます。これが無いと、Compose は「プロジェクト名_pgdata」という別のボリュームを作るので、docker run のときのデータベースが空に見えます
  • docker network create で作っていた app-net は、Compose が作るネットワークとして定義します
  • -d は compose.yaml には書かず、docker compose up -d で指定することを「確認してほしいこと」で知らせます

対応しているオプション

docker run の全オプション(隠しオプションの --net・--net-alias・--dns-opt を含む)を読み取ります。主な対応は次のとおりです。

  • ポート・環境: -p → ports、--expose → expose、-e → environment、--env-file → env_file、-l → labels、--label-file → label_file、--annotation → annotations
  • 実行するもの: イメージの後ろの引数 → command、--entrypoint → entrypoint、-u → user、-w → working_dir、--platform → platform、--pull → pull_policy
  • 起動のしかた: --restart → restart、--init → init、-t → tty、-i → stdin_open、--privileged、--read-only → read_only、--stop-signal → stop_signal、--stop-timeout 30 → stop_grace_period: "30s"
  • 保存場所: -v → volumes(短い書き方)、--mount → volumes(長い書き方)、--tmpfs → tmpfs、--volumes-from → volumes_from、--shm-size → shm_size、--storage-opt → storage_opt
  • ネットワーク: --network → networks か network_mode(host・none・bridge・container:名前)、--network-alias・--ip・--ip6・--link-local-ip・--mac-address → ネットワークごとの設定、--add-host → extra_hosts、--dns・--dns-search・--dns-option、--link → links、-h → hostname
  • ヘルスチェック: --health-cmd → test: ["CMD-SHELL", ...]、--health-interval・--health-timeout・--health-retries・--health-start-period・--health-start-interval、--no-healthcheck → disable: true
  • 資源の制限: -m → mem_limit、--memory-reservation、--memory-swap → memswap_limit、--cpus、-c → cpu_shares、--cpuset-cpus → cpuset、--pids-limit、--ulimit nofile=1024:65536 → soft と hard、--blkio-weight と --device-read-bps など → blkio_config、--gpus → deploy.resources.reservations.devices
  • 権限・名前空間: --cap-add・--cap-drop・--security-opt・--device・--group-add・--sysctl・--ipc・--pid・--uts・--userns → userns_mode・--cgroupns → cgroup、--log-driver・--log-opt → logging

値の形が決まっているオプション(--restart、-p、--ulimit、メモリの大きさ、ヘルスチェックの時間など)は、書き方がおかしいと「注意」を出します。

$ と変数の書き換え

Compose は compose.yaml の中の $ を変数として読むので、変換のときに書き換えます。

  • 'a$b' のように一重引用符で囲んだ $ は、コンテナにそのまま渡る文字なので $$ にします。sh -c 'echo $HOME' は ["sh", "-c", "echo $$HOME"] になり、コンテナの中では echo $HOME として実行されます
  • "$HOME" や ${PORT:-8080} のようにシェルが展開していた変数は、${HOME}・${PORT:-8080} のまま残します。docker compose を実行したときの環境変数か、同じフォルダの .env ファイルの値が入ります
  • $(pwd)・$PWD・`pwd`(bash)、${PWD}(PowerShell)、%cd%(コマンドプロンプト)でパスが始まるときは、. に置き換えます
  • $(date) のように、シェルでしか計算できない書き方はそのまま残し、「注意」で書き換えを促します

コマンドの書き方は、行末の ` や $env: があれば PowerShell、行末の ^ や %cd%・%USERPROFILE% があればコマンドプロンプト、行末が \ なら bash、C:\Users のような Windows のパスがあれば PowerShell、それ以外は bash として自動で判定します。判定が違うときは「コマンドの書き方」で選び直してください。PowerShell とコマンドプロンプトでは、Windows のパスの \ をそのまま読みます。

Compose に書けないオプション

次のオプションは compose.yaml に当たる設定が無いので、書き出さずに理由を知らせます。

  • -d: docker compose up -d で指定します
  • --rm: docker compose down でコンテナは削除されます。1回だけ動かすなら docker compose run --rm サービス名 を使います
  • -P: 公開するポートを ports に1つずつ書きます
  • --cidfile、--umask、--cpuset-mems、--volume-driver、--kernel-memory(廃止)、Windows 専用の --io-maxbandwidth・--io-maxiops
  • -a、--sig-proxy、--detach-keys、-q などの端末や表示に関するオプション

FAQ

サービス名はどう決まりますか?

--name があればその名前(小文字にし、使えない文字は - にします)、無ければイメージ名の最後の部分です。ghcr.io/acme/api-server:2.1 なら api-server です。同じ名前が続くときは nginx-2 のように番号を付けます。

version: "3.8" は書かないのですか?

書きません。今の Docker Compose では version は使われておらず、書くと「obsolete」という警告が出ます。

ほかのコンテナを参照するオプションはどうなりますか?

--network container:db、--volumes-from db、--link db、--pid container:db、--ipc container:db の db が、同じ入力の中で --name db を付けたコンテナなら、サービス名での参照(network_mode: service:db など)に書き換えます。入力の外のコンテナなら、container:db のまま残します。

docker network create を貼らなかったネットワークはどうなりますか?

docker run --network 名前 は、作成済みのネットワークにしかつなげません。そのため、入力の中で作っていないネットワークは external: true(作成済みのネットワークを使う)にします。Compose に作らせたいときは external: true の行を消してください。

--env-file のファイルはそのまま使えますか?

たいていは使えますが、Compose の env_file は値の引用符を外し、${...} を展開します。docker run --env-file はどちらもしません。値に引用符や $ があるときは、env_file を - path: ./app.env と format: raw の形で書くと、docker run と同じに読まれます。

変換した compose.yaml はそのまま動きますか?

docker run のときと同じ設定になるように変換していますが、相対パスの起点や名前付きボリュームの名前など、環境によって違う点があります。「確認してほしいこと」に目を通し、docker compose config で読み込めることを確かめてから起動してください。

入力したコマンドは保存されますか?

いいえ。変換はすべてブラウザ内で行い、入力したコマンドを送信したり保存したりしません。パスワードなどを含むコマンドでも外には出ませんが、compose.yaml を共有するときは値を確かめてください。ページを再読み込みすると消えます。

種別
ユーティリティ
カテゴリ
開発者向け
タグ
docker
docker-compose
compose
yaml
container
converter
developer
  • カラーコード変換ツール

    HEX・RGB・HSL のカラーコードを相互に変換し、HSV・CMYK・OKLCH の表記も表示。カラーピッカーやプレビューで確認でき、白・黒や指定した文字色とのコントラスト比(WCAG)も分かります。

    ユーティリティ開発者向けcolorhexrgbhslhsvcmykoklchcontrastcontrast-checkerwcagconverterdeveloper
  • Markdown表作成ツール

    ExcelやスプレッドシートのセルをコピーしてMarkdownの表に変換します。表の上でセルを編集し、列の左・中央・右揃え、行や列の追加・入れ替え・並べ替えができます。全角文字の幅を数えて縦線をそろえ、既存のMarkdownの表の整形や、Excelへの貼り戻しにも使えます。

    ユーティリティ開発者向けmarkdowntableexceltsvcsvconverterdevelopergithub
  • CSV⇔JSON変換ツール

    CSV(カンマ区切り)やTSV(タブ区切り)とJSONを相互に変換します。Excelやスプレッドシートの表をJSONにしたり、JSONの配列を表に戻したりできます。入れ子のJSONは address.city のような列に展開します。結果は、Excelで文字化けしないCSVファイルとしてダウンロードできます。

    ユーティリティ開発者向けcsvjsontsvconverterdeveloper