从临时命令到可复用配置

Docker Run转Compose

把终端里的长命令整理成可维护的Compose配置。粘贴docker run命令,即时生成YAML;复制前还能核对数据卷、网络和启动方式。

docker runcompose.yaml
浏览器本地转换
01

一次粘贴一条命令,支持引号和反斜杠续行,输入后自动转换。

02

compose.yaml

services:
  web:
    image: "nginx:alpine"
    container_name: "web"
    ports:
      - "8080:80"
    volumes:
      - "./html:/usr/share/nginx/html:ro"
    restart: "unless-stopped"
    network_mode: "bridge"

已解析5个参数 · 1个服务YAML

启动前核对

  • 后台运行是启动选项,请使用docker compose up -d启动服务。
  • 相对挂载路径以compose.yaml所在目录为基准,请核对文件位置或使用绝对路径。
  • network_mode: bridge保留docker run的默认网络。如果希望由Compose创建项目网络,请移除此字段。
在本机检查配置docker compose config

无需注册,不执行命令;输入内容留在当前浏览器。

为什么要把docker run改成Compose?

部署文档里的一长串命令,隔一段时间再看,往往很难分清端口、目录和环境变量。改成compose.yaml后,每项配置都有明确的位置,便于代码审查、备份部署方案和迁移服务器。

这个在线转换器从一条命令生成一个服务定义,不会扫描正在运行的容器,也不会自动拼出多个服务的依赖关系。已有容器不会因转换而被修改。

从命令到配置文件,怎么操作?

粘贴以docker rundocker container run开头的命令。需要换行时,在行尾保留反斜杠;带空格的参数值要用引号括起来。可选服务名只修改services下的键,显式指定的--name仍保留为container_name

复制或下载配置后,先核对下方转换说明,把相关目录和环境变量文件放在正确位置,再运行docker compose config。长期运行的服务可用docker compose up -d启动;如果原命令包含--rm,应按一次性任务的方式处理。

Nginx示例:端口映射和重启策略

下面把主机8080端口映射到容器80端口,并保留unless-stopped重启策略。-d控制启动时是否后台运行,不是Compose服务中的配置字段。

docker run -d --name web -p 8080:80 \
  --restart unless-stopped nginx:alpine
services:
  web:
    image: "nginx:alpine"
    container_name: "web"
    ports:
      - "8080:80"
    restart: "unless-stopped"
    network_mode: "bridge"

迁移时,先确认数据卷和网络

-v data:/data引用命名数据卷,输出会用原名声明并设置external: true,避免误用带项目名前缀的新卷。该卷必须已经存在;全新部署可先建卷,或移除external: true。这只保留引用关系,不会复制数据。

相对挂载路径以Compose文件所在目录为基准;移动文件后要重新核对路径。自定义网络同样按已有外部网络处理。未指定网络时保留network_mode: bridge;如果希望使用Compose项目网络和服务名发现,可主动移除这个字段。

哪些命令需要先手动整理?

支持POSIX风格引号、转义和续行,不支持PowerShell、CMD、管道、多条命令或Docker全局选项。浏览器不能展开$(pwd)或读取本机Shell变量,应先替换为实际值。字面量美元符号要加单引号或转义,生成时会用$$保留其含义。

--env-file转换为format: raw,需要Docker Compose 2.30.0及以上版本。转换器不读取文件、检查镜像或探测端口占用;语法校验通过也不代表应用一定能启动。

Docker命令参数与Compose配置对照

命令参数Compose字段含义
IMAGEimage镜像和标签保持不变
--namecontainer_name容器名与服务名分别处理
-p, --publishports主机端口到容器端口的映射
-e, --envenvironment环境变量键值;省略值时由部署环境提供
-v, --volume / --mountvolumes挂载目录、命名卷或匿名卷
--networknetworks / network_mode网络名称或网络模式
--restartrestart容器重启策略
IMAGE [COMMAND] [ARG…]command容器内的启动参数按数组保留

转换时常见的问题

为什么没有version字段?

输出采用Compose Specification,以services为顶层入口,不添加旧式version字段。请使用现代docker compose命令检查配置。

--rm应该怎么迁移?

一次性任务用docker compose run --rm --service-ports SERVICE,把SERVICE换成实际服务名。--service-ports让该启动方式应用配置中的端口映射。

为什么--gpus不能直接转换?

GPU、旧式链接和部分高级挂载参数需要手动配置。遇到不支持的参数会停止输出,不会把参数悄悄丢掉。

可以把多个容器合并成一个Compose文件吗?

请逐条转换,再合并服务定义,同时检查共享数据卷和网络。服务依赖及启动顺序需要自行补充。

密码会发送到服务器吗?

转换逻辑在浏览器内运行,不上传输入命令,也不连接Docker守护进程。下载文件可能包含命令中的密码,保存和提交代码前请检查内容。

原来的容器还能继续运行吗?

生成配置不会操作容器。但启动Compose时,已有容器名或已占用端口可能产生冲突,需要先处理。

Docker官方文档: docker run · Compose · $$