Docker Run → Compose

docker runコマンドをdocker-compose.ymlに即座に変換。ポート・ボリューム・環境変数・ネットワーク・再起動ポリシーなど対応。

  • ブラウザ内で処理
  • データはブラウザ外に出ません
  • 無料 · 登録不要
現在のコマンドを Compose YAML に変換します。未変換のオプションはステータス欄と 1 行目のコメントで確認します。Ctrl/⌘+Enter でも変換できます。
名前、ポート、バインドマウント、環境変数、再起動ポリシーを含む Nginx のサンプルで入力を置き換え、すぐに変換します。
コマンド、生成した YAML、ステータスを消去します。ツール内の Ctrl/⌘+L でも同じ内容を消去します。
docker run または docker container run コマンドを 1 つ入力します。バックスラッシュによる行継続に対応します。コマンドの実行やシェル変数の展開は行いません。
docker-compose.yml
未変換オプションのコメントを含む表示中の YAML 全文をコピーします。プロジェクトで docker-compose.yml として保存できます。空の出力はコピーしません。

docker run コマンドを入力するかサンプルを読み込むと、Compose YAML を生成します。

例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。

主な用途

  • 移行:都度実行のdocker runを再現可能なcomposeに変換。
  • ドキュメント化:READMEのrunコマンドをチーム用のcompose形式に変換。
  • マルチサービス:各サービスブロックを個別に生成して1つのcomposeに統合。
  • CI/CD:docker runのシェルスクリプトを宣言型composeファイルに置き換え。

例:PostgreSQL コンテナ

入力:

docker run -d \
  --name postgres \
  -e POSTGRES_DB=myapp \
  -e POSTGRES_USER=admin \
  -e POSTGRES_PASSWORD=secret \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  --restart unless-stopped \
  postgres:16-alpine

出力:

services:
  postgres:
    image: "postgres:16-alpine"
    ports:
      - "5432:5432"
    volumes:
      - "pgdata:/var/lib/postgresql/data"
    environment:
      - "POSTGRES_DB=myapp"
      - "POSTGRES_USER=admin"
      - "POSTGRES_PASSWORD=secret"
    restart: unless-stopped

volumes:
  pgdata:

pgdata は名前付きボリュームなので、トップレベルの volumes: に宣言します。この部分がないと Compose はファイルを受け付けず、docker compose config は service "postgres" refers to undefined volume pgdata と報告します。-d は docker compose up -d でデタッチするため省きます。--name はサービス名になります。正確なコンテナ名に依存するスクリプトがあれば container_name: を手で追加してください。

例:ポート、リソース制限、既存ネットワーク

docker run --rm -it --network app-net -p 127.0.0.1:8080:80/tcp \
  --restart on-failure:3 --memory 512m --cpus 1.5 --cap-add NET_ADMIN \
  ghcr.io/acme/web:1.2 npm start
services:
  acme_web:
    image: "ghcr.io/acme/web:1.2"
    ports:
      - "127.0.0.1:8080:80/tcp"
    networks:
      - app-net
    restart: "on-failure:3"
    cap_add:
      - NET_ADMIN
    stdin_open: true
    tty: true
    deploy:
      resources:
        limits:
          memory: 512m
          cpus: "1.5"
    command: ["npm", "start"]

networks:
  app-net:
    external: true

--name がないとき、サービス名はイメージから決まります(ghcr.io/acme/web:1.2 → acme_web)。-it は短いオプション -i と -t をまとめたもので、それぞれ stdin_open と tty になります。--rm は省きます。--network は外部ネットワークになるので、事前に作成しておく必要があります(docker network create app-net)。--network host、none、bridge、container:名前 は network_mode: になります。

例:Compose のキーがないオプション

docker run -d --name web --env-file .env --entrypoint /bin/sh -u 1000:1000 -w /app --gpus all nginx:1.27 -c "nginx -g 'daemon off;'"
# Not converted: --gpus all
services:
  web:
    image: "nginx:1.27"
    entrypoint: ["/bin/sh"]
    env_file:
      - .env
    user: "1000:1000"
    working_dir: /app
    command: ["-c", "nginx -g 'daemon off;'"]

docker run の --entrypoint は実行ファイルを 1 つだけ取るので、要素 1 つのリストになります。イメージの後ろの引数は command です。--gpus には 1 対 1 の Compose キーがない(GPU は deploy.resources.reservations.devices に書く)ため、値は読み取ってイメージ名を正しく保ち、1 行目のコメントとステータス欄に表示します。

上の出力はすべて docker compose config(Docker Compose 5.1)を通ります。ツールのテストで各例にこの確認を実行しています。

フラグの対応表

docker rundocker-compose.yml
-p, --publishports:
-v, --volumevolumes:; named volumes also in the top-level volumes:
-e, --env, --env-fileenvironment:, env_file:
--networknetworks: plus a top-level external: true network; host, none, bridge, container:… become network_mode:
--entrypointentrypoint: (one-item list)
-u, -w, -h, --domainnameuser:, working_dir:, hostname:, domainname:
--restart, --pull, --platformrestart:, pull_policy:, platform:
-l, --label, --annotationlabels:, annotations:
--add-host, --dns, --dns-option, --dns-search, --link, --exposeextra_hosts:, dns:, dns_opt:, dns_search:, links:, expose:
--cap-add, --cap-drop, --privileged, --security-opt, --devicecap_add:, cap_drop:, privileged:, security_opt:, devices:
--init, --read-only, -i, -tinit:, read_only:, stdin_open:, tty:
--tmpfs, --volumes-from, --shm-size, --sysctltmpfs:, volumes_from:, shm_size:, sysctls:
--memory, -m, --cpusdeploy.resources.limits
--memory-reservation, --memory-swap, --cpu-shares, --cpuset-cpus, --pids-limitmem_reservation:, memswap_limit:, cpu_shares:, cpuset:, pids_limit:
--pid, --ipc, --uts, --userns, --cgroupns, --stop-signalpid:, ipc:, uts:, userns_mode:, cgroup:, stop_signal:
--nameservice key
-d, --rm, -q, --detach-keysdropped
image and the arguments after itimage: and command: (JSON array)

オプションは --flag value、--flag=value、-p 80:80、-p80:80 のほか、まとめ書き(-dit、-dp 80:80)も Docker CLI と同じく使えます。

手で追加するオプション

次のオプションは読み取りますが変換しません。Compose のキーの形が異なるためです(services リファレンス):

docker runCompose key
--health-cmd "curl -f http://localhost/" and the other --health-*healthcheck: { test: ["CMD-SHELL", "curl -f http://localhost/"] }
--log-driver, --log-optlogging: { driver: …, options: { … } }
--network-alias api, --ipnetworks: { app-net: { aliases: [api], ipv4_address: … } }
--mountthe long syntax of volumes: (type, source, target)
--gpusdeploy.resources.reservations.devices
--ulimit nofile=1024:2048ulimits: { nofile: { soft: 1024, hard: 2048 } }
--stop-timeout 30stop_grace_period: 30s

制限

  • 1 回の変換で扱うのは docker run コマンド 1 つです。複数のコンテナは個別に変換し、サービスブロックを 1 つの services: の下にまとめてください。
  • docker run と docker container run を認識します。podman run は認識しません。
  • $(...)、$VAR、&& などのシェル構文は文字のまま残ります。変数は変換前に展開するか、結果で Compose の変数展開を使ってください。
  • ./data のような相対バインドパスは、Compose では compose ファイルのディレクトリ、docker run ではカレントディレクトリが基準です。

FAQ

対応しているdocker runフラグは?

docker run が受け付けるすべてのオプション(Docker CLI 29.4)を読み取ります。そのうち Compose のキーがある約 60 個を変換します:ports、volumes、environment、env_file、entrypoint、user、working_dir、networks、restart、labels、extra_hosts、cap_add、devices、tmpfs など(下の対応表を参照)。残りは「変換していない」と表示します。

生成されるComposeファイルのバージョンは?

version キーは出力しません。Compose Specification ではトップレベルの version は廃止扱いで、Docker Compose v2 は指定されていても警告を出すだけです。

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

--nameを指定した場合はその値がサービス名になります。未指定の場合は、イメージ名からレジストリプレフィックスとタグを除き、スラッシュをアンダースコアに置換した名前が使われます。

複数行のdocker runコマンドは使えますか?

はい。バックスラッシュで改行したコマンドを貼り付けると正しく処理されます。

Compose のキーがないオプションはどうなりますか?

値は読み取るので、イメージ名がずれることはありません。ステータス欄とファイル 1 行目のコメント(例:# Not converted: --gpus all)に表示されるので、対応する Compose の設定を手で追加してください。docker run が知らないオプションは、docker run と同じくエラーになります。

名前付きボリュームは宣言されますか?

はい。-v のソースが名前の場合(pgdata:/var/lib/postgresql/data など)、トップレベルの volumes: に追加します。/、.、~ で始まるパスはバインドマウントなので宣言しません。