Docker Compose转Run 在线转换命令
Docker Compose转docker run:把compose.yml服务转为对应的docker run命令,保留端口、卷和环境变量,适合容器部署调试。
更新于 2026-08-16
相关工具
功能特性
- 即时转换:粘贴 docker-compose.yml,实时生成 docker run 命令
- 支持所有常用配置:ports、volumes、environment、restart、network_mode、container_name
- 处理卷挂载模式:绑定挂载、命名卷、只读(:ro)和读写
- 支持环境变量的列表和映射两种格式,统一转换为 -e 标志
- 保留重启策略:always、unless-stopped、on-failure、no
- 生成整洁的 docker run 命令,标志顺序规范,可直接复制执行
- 多服务 compose 文件:每个服务生成一条独立的 docker run 命令
- 默认添加 -d 标志,容器以后台模式运行
- 一键复制所有命令到剪贴板,或下载为 .sh 脚本文件
- 支持 compose v1、v2 和 v3 格式语法
- 状态栏显示检测到的服务数量和总命令长度
- 纯浏览器本地处理,compose 文件绝不上传到服务器
使用方法
- 1在输入区域粘贴 docker-compose.yml 内容,docker run 命令即时生成
- 2工具检测所有服务,为每个服务生成一条独立的 docker run 命令
- 3点击复制按钮将所有生成的命令复制到剪贴板
- 4使用保存按钮下载为 .sh shell 脚本文件,方便直接执行
- 5使用清除按钮重置输入和输出,开始新的转换
- 6点击输入框下方的示例按钮,查看常见转换场景
- 7compose 文件中的命名卷会提示,可能需要先用 docker volume create 创建
- 8工具默认添加 -d 标志,容器以后台模式运行
- 9如果 compose 文件使用 depends_on,请检查原文件并按依赖顺序运行命令
常见问题
什么是 docker compose 转 docker run 转换?
它将 docker-compose.yml 中的服务定义转换为独立的 docker run CLI 命令。compose 文件中的每个服务都会生成一条对应的 docker run 命令,所有选项(端口、卷、环境变量等)都会映射到相应的 CLI 标志。适用于需要在没有 compose 环境中运行单个服务、调试特定容器或在编排工具间迁移的场景。
支持哪些 compose 选项?
工具支持所有常用选项:image、container_name、ports、volumes(绑定挂载和命名卷,含 :ro/:rw 模式)、environment(列表和映射两种格式)、restart 策略(always、unless-stopped、on-failure、no)、network_mode(host、bridge、none)、command、working_dir 和 user。
命名卷怎么处理?
命名卷(如 pgdata:/var/lib/postgresql/data)会转换为 -v pgdata:/var/lib/postgresql/data 标志。工具还会为每个命名卷输出一条 docker volume create 命令,因为 docker run 不会像 docker compose 那样自动创建命名卷。
会自动添加 -d 标志吗?
是的,默认所有生成的命令都包含 -d 标志,让容器以后台模式运行,匹配 docker compose 的典型行为。这符合大多数用户从 compose 转换到 run 命令时的预期。
多个服务怎么处理?
compose 文件中的每个服务都会生成一条独立的 docker run 命令。命令按 compose 文件中的顺序输出。如果 compose 文件使用 depends_on,你应该按依赖顺序运行命令(例如,先启动数据库再启动应用)。
depends_on 怎么处理?
decomposerize 库目前不会在输出中保留 depends_on 信息。你应该手动检查 compose 文件中的 depends_on 指令,并按正确顺序运行命令,例如,先启动数据库再启动连接它的应用。docker compose 自动处理这个顺序,但使用 docker run 时需要手动管理。
支持网络配置吗?
支持。compose 文件中定义的自定义网络会被标注,使用 network_mode: host、bridge 或 none 的服务会转换为 --net 标志。对于自定义桥接网络,你可能需要先用 docker network create 创建。
转换后怎么进入容器或执行命令?
生成的 docker run 命令以后台方式(-d)启动容器,之后想打开 shell 用 docker exec -it <容器名> sh(有 bash 就用 bash)。如果保留 compose 文件,docker compose exec <服务名> sh 能达到同样效果且更省事。对原环境执行一次性命令(如跑迁移)两种方式都行。
支持 command 字段和一次性脚本吗?
支持。服务的 command 会附加到生成的 docker run 命令末尾,这正是运行一次性任务(如 Python 脚本)的方式:docker run --rm -v $(pwd):/app python:3.12 python script.py。多条命令的字符串会原样传递,粘贴时注意引号在 shell 中是否完好。
和 docker compose run 有什么区别?
docker compose run 是 compose 的子命令,用于从 compose 文件运行一次性命令。此工具将 compose 文件转换为独立的 docker run 命令,不需要安装 compose CLI。适用于需要在没有 compose 的环境中运行容器,或需要将容器启动嵌入脚本的场景。
支持 compose v2 和 v3 吗?
支持。工具处理 v1(含 version 字段)、v2 和 v3 格式的 compose 文件,也支持不包含 version 字段的现代「通用规范」格式。无论 compose 格式版本如何,转换逻辑都是相同的。
能在手机上使用吗?
可以在移动浏览器上使用。但为了获得最好体验(尤其是大型 compose 文件),推荐使用桌面浏览器,方便并排查看生成的命令和输入内容。
为什么生成的 docker run 命令会报错?
最常见的原因:引用其他变量的环境变量(compose 里的 ${VAR} 由工具用你当前 shell 的值展开,可能是空的)、命令字符串内的引号(嵌套引号粘贴到 shell 时需要仔细转义)、以及带空格或 Windows 盘符的卷路径(C:\path 在 Git Bash 中要写成 /c/path,PowerShell 中要正确加引号)。把生成的命令与 compose 文件逐行对比,映射是机械的,不一致通常意味着粘贴时的引号问题。
转换后应用容器按服务名连不上数据库容器,为什么?
docker run 命令不会加入 compose 的默认网络,所以 db、app 这类服务名根本解析不到。解决办法:建一个自定义网络(docker network create mynet),给每条生成的命令加 --network mynet,并用 --network-alias 带上原服务名(比如 docker run --network mynet --network-alias db postgres:16 ...),这样其他容器仍然能按旧名字解析。只访问宿主机的容器可以完全不挂网络。
healthcheck、logging 这类没转换的选项会怎样?
不支持的选项会以注释形式保留在生成的命令上方,不会悄悄丢失,但需要你自己补进命令里,比如 healthcheck 用 --health-cmd 和 --health-interval,日志用 --log-driver。生产环境运行前的稳妥习惯:把生成的命令和 compose 服务逐行比对,把工具保留成注释的内容手动加回去。