rmdir.cn
← 运维工具

docker run 转 Compose

把调试用的 docker run 命令整理成可维护的 compose 配置,无法自动映射的参数会明确列出,不会静默丢弃。

docker run 命令

支持 sudo 前缀、docker container run 与反斜杠换行;当前解析到 12 个参数。

转换结果

服务名:web
services:
  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 字段对应关系
docker run 参数compose 字段说明
-p / --publishports端口映射会保留为字符串,避免被解析成时间或数字。
-v / --volumevolumes宿主路径与命名卷都可直接映射;匿名卷会额外提示残留数据风险。
-e / --envenvironmentKEY=VALUE 直接写入;只写 KEY 表示从宿主环境读取。
--env-fileenv_file文件路径会原样保留,注意 compose 中的相对路径基于 yml 所在目录。
--namecontainer_name同时用于推导服务名;设置后该服务无法再用 --scale 扩缩容。
--restartrestart重启策略一一对应,重启间隔需另外写入 RestartSec 语义的配置。
--networknetwork_mode / networkshost、none 等使用 network_mode,自定义网络会额外生成 networks 段。
--cap-add / --cap-dropcap_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 校验,或使用支持双向转换的专门工具。

生成的配置能直接上线吗?

建议先在测试环境验证。工具不会注入密钥管理、日志驱动、资源限制等生产环境必备配置,需要结合实际情况补充。