docker run 转 Docker Compose(双向转换)

把 docker run 命令转换成 docker-compose.yml 服务,或把 Compose 服务转回 docker run 命令。

示例:
支持使用 \ 续行的多行命令、引号以及 --flag=value 形式。
docker-compose.yml
services:
  db:
    image: postgres:16
    container_name: db
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: change-me
      POSTGRES_DB: app
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "127.0.0.1:5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5
volumes:
  pgdata:
    name: pgdata
说明
  • 已移除 -d / --detach:请使用 "docker compose up -d" 在后台运行。
  • 命名卷保留其确切名称("name:"),这样 Compose 会复用 docker run 创建的卷,而不是新建一个空的 "<project>_<volume>" 卷。

完全在你的浏览器中运行。命令和 Compose 文件(包括其中的任何密码)都不会被发送到任何地方。 浏览全部免费工具.

发现问题,或者觉得哪里可以更好?每条消息我们都会阅读,并尽快修复。

这款 docker run 转 Docker Compose 工具,可以把 docker run 命令(就是你从项目 README 里复制的那种)转换为 docker-compose.yml 中的一个服务:端口、卷、环境变量、网络、重启策略、健康检查、capabilities、设备、GPU 访问以及几十种其他选项。它也能反向转换,把 Compose 文件中的每个服务变成等效的 docker run 命令,方便快速测试或在没有 Compose 的系统上使用。

转换会特别留意那些会让实际部署出错的细节。端口会加上引号,因为 YAML 1.1 会把不带引号的 22:22 当作六十进制数。命名卷保留确切名称,这样 Compose 会复用 docker run 创建的数据,而不是新建一个空的“<project>_<volume>”。$(pwd) 会变成相对路径。-d、--rm 这类只影响命令行会话的参数会被去掉并附上说明;没有 Compose 对应项的内容会作为警告列出,而不是悄悄丢失。

使用方法

  1. 把 docker run 命令粘贴到左侧框中,或点击一个示例。带反斜杠的多行命令也没问题。
  2. 查看右侧生成的 docker-compose.yml,并检查下方的说明和警告。
  3. 复制 YAML 或下载为 docker-compose.yml,放到项目目录中,然后运行 docker compose up -d。
  4. 要反向转换,切换到“Compose → docker run”,粘贴 Compose 文件,然后复制每个服务的命令。

常见问题

docker run 和 docker compose 有什么区别?

docker run 根据命令行上的选项启动一个容器。Docker Compose 则在 YAML 文件中描述一个或多个容器及其网络和卷,并用 docker compose up 一起启动。Compose 更便于纳入版本控制、审查和原样重复运行,而且同一 Compose 项目中的服务可以通过服务名互相访问。

docker-compose.yml 中还需要 version: 这一行吗?

不需要。在 Docker Compose v2 使用的 Compose 规范中,顶层的 version 键已被废弃,当前版本会打印警告说明它被忽略。本转换器不会输出它。现在文件通常命名为 compose.yaml,不过 docker-compose.yml 仍然会被读取。

为什么切换到 Compose 后卷里的数据不见了?

Compose 会给命名卷加上项目名前缀,所以名为 pgdata 的卷会变成 myproject_pgdata,这是一个全新的空卷。要复用 docker run 创建的卷,需要在顶层用 name: pgdata 声明它(本转换器会这样做),或者把它标记为 external: true。绑定挂载(以 / 或 ./ 开头的路径)不受影响。

-d、-it 和 --rm 会怎么处理?

-d 属于启动容器的方式,所以请使用 docker compose up -d。-i 和 -t 会变成 stdin_open: true 和 tty: true。--rm 在单个服务层面没有对应项:docker compose down 会删除容器,而一次性命令可以使用 docker compose run --rm。

GPU 选项是如何转换的?

--gpus all 会变成 deploy.resources.reservations.devices 下的设备预留,带有 driver: nvidia、count: all 和 capabilities: [gpu],这是 Docker Compose 文档中规定的写法。指定 GPU(--gpus '"device=0,1"')会变成 device_ids。主机上仍需安装 NVIDIA Container Toolkit。

我的命令会被发送到服务器吗?

不会。解析和转换都在你的浏览器中完成,所以命令中的环境变量、密码和内部主机名都不会离开你的电脑。不过,含有密钥的 Compose 文件仍应像密码文件一样对待:把密钥移到一个已列入 .gitignore 的 env_file 中。

docker run 参数与对应的 Compose 键

• -p 8080:80 → ports: ["8080:80"] · --expose → expose

• -v /host:/ctr 或 -v name:/ctr → volumes · --mount → 长语法 volumes · --tmpfs → tmpfs

• -e KEY=value → environment · --env-file → env_file · -l / --label → labels

• --name → container_name · -h → hostname · -u → user · -w → working_dir

• --restart → restart · --network → networks 或 network_mode(host、none、container:…)· --network-alias、--ip → 各网络下的 aliases 和 ipv4_address

• --entrypoint → entrypoint · 镜像名之后的参数 → command

• --health-cmd/-interval/-timeout/-retries/-start-period → healthcheck · --no-healthcheck → healthcheck.disable

• --cap-add/--cap-drop → cap_add/cap_drop · --device → devices · --privileged、--read-only、--init → 同名键

• -m / --memory → mem_limit · --cpus → cpus · --shm-size → shm_size · --ulimit → ulimits · --sysctl → sysctls

• --log-driver/--log-opt → logging · --add-host → extra_hosts · --dns → dns · --gpus → deploy.resources.reservations.devices

转换之后:把它变成真正的 Compose 项目

一对一的转换只是起点。当一个文件里有多个容器时,应把 --link 和写死的容器 IP 换成服务名(应用通过 db:5432 访问数据库),添加带 condition: service_healthy 的 depends_on,让应用等待数据库的健康检查通过;除非 Compose 之外有东西需要固定名称,否则去掉 container_name,因为它会妨碍服务扩容。把密码从 environment 移到 .env 文件或 Compose secrets 中,并且不要把该文件提交到 Git。

相关免费工具

  • 子网计算器 — 计算任意 CIDR 的网络地址、广播地址、主机范围和掩码;用 VLSM 划分网络,展开 IPv6 地址,查找重叠的地址段。
  • Chmod 计算器 — 勾选读、写、执行复选框,得到八进制权限值和 chmod 命令,或解读 755、644 和 rwxr-xr-x。
  • .gitignore 生成器 — 把语言、框架、编辑器和操作系统的 .gitignore 模板合并成一个干净的文件。
  • JSON 格式化 — 格式化、压缩和校验 JSON,解析错误精确到行和列。在浏览器中运行,无需上传。
  • Cron 表达式生成器 — 用下拉菜单生成 cron 定时计划,或粘贴现有表达式,用通俗语言解读,并查看接下来 10 次运行时间(本地时区和 UTC)。免费,在浏览器中运行。