Docker Run → Compose
docker runコマンドをdocker-compose.ymlに即座に変換。ポート・ボリューム・環境変数・ネットワーク・再起動ポリシーなど対応。
- ブラウザ内で処理
- データはブラウザ外に出ません
- 無料 · 登録不要
WeChat でスキャンしてシェア
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。
主な用途
- 移行:都度実行の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 run | docker-compose.yml |
|---|---|
-p, --publish | ports: |
-v, --volume | volumes:; named volumes also in the top-level volumes: |
-e, --env, --env-file | environment:, env_file: |
--network | networks: plus a top-level external: true network; host, none, bridge, container:… become network_mode: |
--entrypoint | entrypoint: (one-item list) |
-u, -w, -h, --domainname | user:, working_dir:, hostname:, domainname: |
--restart, --pull, --platform | restart:, pull_policy:, platform: |
-l, --label, --annotation | labels:, annotations: |
--add-host, --dns, --dns-option, --dns-search, --link, --expose | extra_hosts:, dns:, dns_opt:, dns_search:, links:, expose: |
--cap-add, --cap-drop, --privileged, --security-opt, --device | cap_add:, cap_drop:, privileged:, security_opt:, devices: |
--init, --read-only, -i, -t | init:, read_only:, stdin_open:, tty: |
--tmpfs, --volumes-from, --shm-size, --sysctl | tmpfs:, volumes_from:, shm_size:, sysctls: |
--memory, -m, --cpus | deploy.resources.limits |
--memory-reservation, --memory-swap, --cpu-shares, --cpuset-cpus, --pids-limit | mem_reservation:, memswap_limit:, cpu_shares:, cpuset:, pids_limit: |
--pid, --ipc, --uts, --userns, --cgroupns, --stop-signal | pid:, ipc:, uts:, userns_mode:, cgroup:, stop_signal: |
--name | service key |
-d, --rm, -q, --detach-keys | dropped |
| image and the arguments after it | image: and command: (JSON array) |
オプションは --flag value、--flag=value、-p 80:80、-p80:80 のほか、まとめ書き(-dit、-dp 80:80)も Docker CLI と同じく使えます。
手で追加するオプション
次のオプションは読み取りますが変換しません。Compose のキーの形が異なるためです(services リファレンス):
| docker run | Compose key |
|---|---|
--health-cmd "curl -f http://localhost/" and the other --health-* | healthcheck: { test: ["CMD-SHELL", "curl -f http://localhost/"] } |
--log-driver, --log-opt | logging: { driver: …, options: { … } } |
--network-alias api, --ip | networks: { app-net: { aliases: [api], ipv4_address: … } } |
--mount | the long syntax of volumes: (type, source, target) |
--gpus | deploy.resources.reservations.devices |
--ulimit nofile=1024:2048 | ulimits: { nofile: { soft: 1024, hard: 2048 } } |
--stop-timeout 30 | stop_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: に追加します。/、.、~ で始まるパスはバインドマウントなので宣言しません。