跳到正文

docker run 转 Compose

docker run to Compose

把一行 docker run 命令变成 compose 服务定义,也能反着转回去。

把一条 `docker run` 命令行转换成对应的 `compose.yaml` 服务。命令按真正的 shell 引用规则拆分,所以写成 `sh -c "…"` 的入口点连同空格和引号完好地保留下来。

🔒 完全在你的浏览器里运行dockercomposeconvertdevops

docker run 命令

compose.yaml

说明

  • -d 只影响 docker run 这一次调用本身;Compose 里没有对应项,所以丢掉了。
命令是按真正的 shell 引用规则拆开的,所以像 sh -c "…" 这样的入口点连空格一起保住了。Compose 里没有对应项的标志(--rm, -d)会带一条说明丢掉——生命周期由 Compose 自己决定——不认识的标志一定会点名,绝不悄悄吃掉。输出里的端口加了引号,否则 YAML 1.1 会把 8080:80 读成一个 60 进制的数。

怎么用

  1. 粘贴命令

    续行符、带引号的值,以及镜像后面跟的命令都能处理。什么都不会执行——文本进,文本出。

  2. 读输出下方的说明

    没有 Compose 对应项的标志会列出来而不是悄悄丢掉,不认识的标志会点名。提交文件之前值得检查的正是这个列表。

  3. 复制进你的 compose 文件

    输出是一个服务。把它放在 `services:` 下面、和你已有的并列,如果命令没有 `--name`,给它起个你想要的名字。

常见问题

为什么端口加了引号?

因为 YAML 1.1 把 `8080:80` 读成六十进制数——没人想要、却被每个 YAML 解析器继承下来的六十进制语法。加引号才能让它保持为端口映射。这是 Compose 的经典坑。

`--rm` 和 `-d` 去哪了?

丢弃了,并附说明,因为生命周期归 Compose 管。`docker compose up` 决定前台还是后台,`docker compose down` 删除容器,所以这些标志在服务层面没有可以翻译成的对应项。

它会写一整份 compose 文件吗?

它写的是服务。网络、顶层的卷,以及 `version:` 键(现代 Compose 已经不要它了)由你来加——而且大多数情况下你不需要它们。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。