docker run 转 docker-compose
把 docker run 命令转成 docker-compose.yml:解析端口、卷、环境变量、网络、重启策略、cap-add、健康检查与启动命令,无法转换的选项以注释列出。
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
支持 -p/--publish、-v/--volume、-e/--env、--name、--network、--restart、--cap-add、--health-*、--entrypoint 与镜像后的启动命令;-d 与 --rm 会在注释里说明等价用法。
docker-compose.yml
这个工具能做什么
- 把从文档或同事那里抄来的 docker run 命令转成 docker-compose.yml,不用逐项查 compose 的字段名。
- 把一次性容器固化成可维护的服务定义:端口、卷、环境变量、重启策略、cap-add、健康检查都会落到对应字段。
- 排查「compose 里怎么写等价配置」:拿不准的选项会被列成注释并说明等价用法,比如 --rm 要用 docker compose run --rm。
- 对照 compose 文件里各字段的实际取值:统计区会给出端口、卷、环境变量和 cap-add 的数量。
示例
输入
docker run -d --name web -p 8080:80 -v /srv/html:/usr/share/nginx/html:ro -e NODE_ENV=production --network appnet --restart unless-stopped nginx:alpine nginx -g 'daemon off;'
输出
# 无法自动转换的选项(notes / unsupported):
# - -d / --detach → compose 默认后台运行,用 `docker compose up -d`
version: '3.8'
services:
web:
image: nginx:alpine
container_name: web
restart: unless-stopped
ports:
- 8080:80
environment:
- NODE_ENV=production
volumes:
- /srv/html:/usr/share/nginx/html:ro
networks:
- appnet
command:
- nginx
- -g
- daemon off;
networks:
appnet: {}镜像后的内容会原样作为 command 数组;--network 里用到的自定义网络会自动补到顶层 networks 下。
常见问题
哪些选项能自动转换?
-p/--publish、-v/--volume、-e/--env、--name、--network、--restart、--cap-add、--health-*、--entrypoint、--hostname,以及镜像名之后的启动命令。其余选项不会静默丢弃,会以注释形式列在文件开头。
-d 和 --rm 为什么不直接写进 YAML?
因为 compose 里没有对应的字段:服务默认就是后台运行(用 docker compose up -d),而临时容器要用 docker compose run --rm <service>。工具把这两点写成注释,避免你以为已经生效了。
卷挂载里的路径会被改写吗?
不会。挂载字符串(含 :ro / :rw 后缀)原样保留,只有「非绝对路径」的来源会被识别为具名卷并补到顶层 volumes 里,例如 -v data:/var/lib/data 会生成 volumes: { data: {} }。Windows 盘符路径也能正确识别。
--network host 会怎么处理?
host、none、bridge 这三种内置网络会转成 network_mode,不会在顶层新建网络;其它名字(如 appnet)视为自定义网络,加到服务的 networks 列表并在顶层 networks 里声明。
命令会上传到服务器吗?
不会。解析和 YAML 生成都在浏览器里完成,页面不发任何网络请求,包含内部地址或密码的命令可以放心粘贴。
关键词:docker rundocker composedocker-compose.ymlcompose容器转换containeryamldevops