docker run 转 Compose
把调试用的 docker run 命令整理成可维护的 compose 配置,无法自动映射的参数会明确列出,不会静默丢弃。
docker run 命令
支持 sudo 前缀、docker container run 与反斜杠换行;当前解析到 12 个参数。
转换结果
服务名:
webservices:
web:
image: nginx:1.25
container_name: web
restart: unless-stopped
ports:
- "8080:80"
volumes:
- "/srv/www:/usr/share/nginx/html:ro"
补充说明
- -d 无需保留:docker compose up -d 已经让服务在后台运行。
- 设置了 container_name 后,该服务无法使用 docker compose up --scale 扩缩容。
- Compose V2 不再需要 version 字段,可直接使用。
- 启动:docker compose up -d;查看日志:docker compose logs -f web
转换在浏览器本地完成,不会执行命令也不会连接 Docker。生成的 YAML 请先用 docker compose config 校验后再使用。
常见参数映射关系
| docker run 参数 | compose 字段 | 说明 |
|---|---|---|
| -p / --publish | ports | 端口映射会保留为字符串,避免被解析成时间或数字。 |
| -v / --volume | volumes | 宿主路径与命名卷都可直接映射;匿名卷会额外提示残留数据风险。 |
| -e / --env | environment | KEY=VALUE 直接写入;只写 KEY 表示从宿主环境读取。 |
| --env-file | env_file | 文件路径会原样保留,注意 compose 中的相对路径基于 yml 所在目录。 |
| --name | container_name | 同时用于推导服务名;设置后该服务无法再用 --scale 扩缩容。 |
| --restart | restart | 重启策略一一对应,重启间隔需另外写入 RestartSec 语义的配置。 |
| --network | network_mode / networks | host、none 等使用 network_mode,自定义网络会额外生成 networks 段。 |
| --cap-add / --cap-drop | cap_add / cap_drop | 内核能力列表可直接映射。 |
| --health-* | healthcheck | 时间参数会放入 healthcheck,需要确认单位(如 30s)。 |
| --rm / --ulimit / --gpus | 无对应字段 | 这些参数会被列入待处理清单,并给出替代写法建议。 |
Compose V2 已不再需要顶层的 version 字段。若目标环境是 Swarm 或 Kubernetes,资源限制应改用 deploy.resources 或对应编排对象的资源配置。
迁移后的检查清单
- 先执行
docker compose config,确认变量替换和语法都没有问题。 - 对比容器名与网络:compose 默认创建独立网络,原来用
--link或127.0.0.1访问其他容器的写法大多需要改成服务名。 - 检查数据卷:匿名卷在 compose 中不易复用,建议显式声明命名卷,避免重建后旧数据残留或丢失。
- 核对 user、workdir 与挂载目录的属主权限,容器内外的 UID 不一致会导致写入失败。
- 把密钥改为通过 env_file 或外部 secret 注入,不要直接写在 yml 中提交到版本库。
常见问题
为什么有些参数没有出现在结果里?
无法可靠映射的参数(如 --rm、--ulimit、--gpus)会单独列在“无法自动映射的参数”表格中并附处理建议,避免生成一份看似完整却行为不同的配置。
服务名是怎么来的?
优先使用 --name 指定并转换成合法服务名(大写转小写,非法字符替换为连字符);没有 --name 时取镜像名的最后一段并去掉标签。
可以用来转换已有 compose 文件吗?
不能。本工具只解析 docker run 命令行。已有的 compose 文件请用 docker compose config 校验,或使用支持双向转换的专门工具。
生成的配置能直接上线吗?
建议先在测试环境验证。工具不会注入密钥管理、日志驱动、资源限制等生产环境必备配置,需要结合实际情况补充。