docker run ↔ compose 互转

docker run 命令与 docker-compose.yml 双向转换,覆盖 40+ 常用参数,纯本地运行不上传。

# 在上方粘贴 docker run 命令,自动生成 compose 配置

❓ 常见问题

支持哪些 docker run 参数?

覆盖 40+ 常用参数:-p、-v、-e、--name、--restart、--network、-w、-u、--hostname、--entrypoint、-l、--cap-add/drop、--health-* 、--cpus、--memory 等。不认识的参数会跳过并在下方提示。

有些参数为什么给了"需注意"提示?

--rm、--gpus、-P、--mount 等参数在 docker run 和 compose 之间没有一一对应,工具会列出这些参数提醒你手动确认,而不是悄悄丢掉。

compose 转 run 时 build、depends_on 怎么处理?

遇到 build: 会用 image 占位并提示;depends_on 无等价物,会提示手动保证启动顺序。其余字段逐项还原。

数据会上传吗?

不会。全部在浏览器本地完成,不发起任何网络请求。

docker run 与 docker-compose 互转:进阶指南

上面的工具能帮你快速完成日常转换,但有些场景需要更深入的理解才能避坑。 这篇补充内容覆盖反向转换实战、Compose 版本差异、以及工具不会自动处理的边界情况。

compose → docker run 反向转换实战

反向转换比正向更容易出错,因为 compose 文件表达的不仅是"怎么启动一个容器", 还包含服务间关系、构建逻辑、健康依赖等 docker run 无法描述的信息。

以一个典型的多服务 compose 文件为例:

services:
  web:
    build: ./app
    ports: ["8080:80"]
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://user:pass@db:5432/mydb
  db:
    image: postgres:16
    volumes: ["pgdata:/var/lib/postgresql/data"]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user"]
      interval: 5s
      retries: 5

volumes:
  pgdata:

转换后会得到两条 docker run 命令,但你需要手动处理三个问题: 先启动 db 再启动 web(depends_on 无法转换)、 build 上下文需要先 docker build -t myapp . 构建(docker run 不能直接 build)、 以及 named volume pgdata 需要先 docker volume create pgdata。 工具会把这些提示列出来,但不会替你执行。

Compose 版本差异对转换的影响

version 字段在 Compose Specification(2020 年后)中已废弃, 但大量旧项目仍在用 version: "3"version: "2"。 转换时需要注意:

特性v2.xv3.xCompose Spec(当前)
resource limitsmem_limit / cpusdeploy.resources两者都支持
depends_on condition✅ 支持❌ 3.x 不支持✅ 恢复支持
named volumes 简写
profiles✅ 新增
devices (GPU)deploy.resources.devicesdeploy.resources.reservations.devices

工具按 Compose Specification 处理,如果你用的是 v3.x 且依赖 depends_on.condition, 转换结果中这部分会被标记为需注意。

docker run 参数无法自动转换的边界情况

  • --rm:Compose 没有"运行完即删"的语义,docker compose down 是手动清理,不是等价物
  • --gpus all:需改写为 deploy.resources.reservations.devices,且仅 Compose Spec 支持
  • -P(随机端口映射):Compose 要求显式声明 ports,无法自动推断随机端口
  • --mount type=bind/tmpfs--mount 语法比 -v 更灵活但也更复杂,工具优先用 -v 处理,--mount 的非常规用法需手动补
  • --pull always:对应 pull_policy: always,但旧版 Compose 不支持该字段

环境变量文件的处理差异

docker run --env-file .env 和 Compose 的 env_file 看起来等价,行为有细微差异: docker run--env-file 直接注入到容器环境,而 Compose 的 env_file 也是注入环境变量,但 Compose 还有一个隐式的 .env 文件机制——项目根目录的 .env 会自动用于变量插值(${VAR}),这和 env_file 是两回事。 转换时工具会把 --env-file 映射为 env_file,但不会自动创建 .env 文件, 需要你手动处理变量插值的依赖。

网络模式的转换陷阱

docker run --network host 对应 network_mode: host,看起来简单, 但如果 compose 文件中同时定义了 networksnetwork_mode, Compose 会报错——两者互斥。工具在转换时会优先使用 networks, 如果原命令用的是 hostnone 模式,会映射为 network_mode, 此时你需要确保 compose 文件中没有同服务的 networks 定义。

从 Composerize 迁移

Composerize 是同类工具中最知名的开源项目,仅支持 docker run → compose 单向转换。 本工具相比 Composerize 的主要差异:支持 compose → docker run 反向转换、 对无等价物的参数给出明确提示而非静默丢弃、纯浏览器本地运行不依赖 npm 安装。 如果你之前用 Composerize 的 CLI(npm install -g composerize), 切换到本工具时转换结果格式基本一致,但 YAML 缩进和字段排序可能略有不同。