返回

Docker run 转 Compose

开发工具

正在载入

正在加载工具

工具代码会在打开时按需载入,请稍候。

本工具的全部运算都发生在你的浏览器中,输入内容不会发送到任何服务器。

关于这个工具

粘贴一条使用字面量的 docker run 或 docker container run 命令,即可生成单服务 Compose YAML 草稿。预览随输入即时更新,复制和下载均使用相同内容。默认隐藏所有环境变量值;修改命令会取消原值显示并恢复脱敏。整个过程在浏览器内完成,不执行命令、不连接 Docker、不读取文件,也不保存输入历史。使用结果前,请检查警告和部署设置。

常见用途

  • 将简单且受支持的 Docker run 示例整理为可审查的 Compose 文件,减少手工改写端口和挂载。
  • 核对显式入口、命令参数、工作目录、用户、TTY 和标准输入选项的映射。
  • 先隐藏环境变量值,准备排查示例,再检查参数、路径和其他可见字段后分享。

使用方法

  1. 1.粘贴单条 POSIX 风格的 Docker run 命令,使用字面量和有效镜像。含空格的值须加引号,跨行时使用反斜杠紧接换行。
  2. 2.检查当前 YAML、错误和警告。修正不支持的选项,不要假定它们会被静默忽略。除非确实需要原值,否则保持环境变量脱敏。
  3. 3.复制 YAML 或下载 compose.yaml。以安全方式替换占位符,检查其他字段,再使用自己的 Compose 环境验证配置后部署。

Docker 转换实例

发布端口的 Web 服务

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

YAML 中服务键为 app,--name 映射为 container_name。带引号的端口映射区分宿主 8080 和容器 80。重启策略被保留,-d 提示为运行时选择,默认桥接网络也被显式写出。

环境变量脱敏、命名卷与外部网络

docker run --name database -e POSTGRES_PASSWORD=demo-only -e APP_MODE=first -e APP_MODE=final -v pgdata:/var/lib/postgresql/data --network app-net postgres:16
services:
  app:
    container_name: "database"
    networks:
      - "network_1"
    image: "postgres:16"
    volumes:
      - type: "volume"
        target: "/var/lib/postgresql/data"
        read_only: false
        source: "volume_1"
    environment:
      POSTGRES_PASSWORD: "[REDACTED]"
      APP_MODE: "[REDACTED]"
volumes:
  volume_1:
    name: "pgdata"
networks:
  network_1:
    name: "app-net"
    external: true

两个环境变量值均隐藏;显示原值时,APP_MODE 取最后一次赋值。卷保留 Docker 名称 pgdata,app-net 网络作为外部网络须事先存在。转换不会检查数据库数据,也不验证此镜像的存储要求。

只读绑定挂载与字面量 shell 参数

docker container run -it --mount type=bind,src=/srv/project,target=/app,readonly -w /app -u 1000:1000 --entrypoint /bin/sh alpine:3.20 -c 'printf %s "$HOME"'
services:
  app:
    stdin_open: true
    tty: true
    working_dir: "/app"
    user: "1000:1000"
    entrypoint:
      - "/bin/sh"
    image: "alpine:3.20"
    command:
      - "-c"
      - "printf %s \"$$HOME\""
    volumes:
      - type: "bind"
        target: "/app"
        read_only: true
        source: "/srv/project"
        bind:
          create_host_path: false
    network_mode: "bridge"

--mount 绑定不会要求创建不存在的宿主目录。用户、工作目录、交互标准输入和 TTY 都明确保留。外层单引号使 $HOME 在解析时保持字面量;Compose 接收到 $$HOME,避免在容器 shell 读取之前发生插值。

常见转换问题

  • 使用 -e NAME 或 --env-file:工具无法读取 shell 环境或本地文件,请在受支持的命令中明确赋予字面量值。
  • 粘贴 --rm、--privileged、资源限制或其他未列出的选项:转换会整体报错,不会悄悄丢弃选项。
  • 将 ./data:/data 或 C:\data:/data 当作可移植绑定挂载:请使用受支持的 Linux 绝对源路径,并自行检查目标主机。
  • 直接运行包含 [REDACTED] 的配置或未经检查分享原值导出:请安全替换占位符,也要检查环境变量之外的敏感信息。
  • 认为解析成功就代表可以部署:请另行验证镜像、网络、卷、宿主路径、权限和 Compose 兼容性。

限制与说明

  • 输入上限为 100,000 个字符和 2,000 个 shell 词元。解析器仅支持保守的 POSIX 字面量子集,不是完整 shell。不接受 sudo 前缀、shell 展开、命令替换、未转义的命令分隔符、重定向、管道或 PowerShell/CMD 语法。带引号的字面量美元符号会为 Compose 转义。
  • 支持 --name、-p/--publish、-v/--volume、bind/volume 类型的 --mount、显式 KEY=VALUE 的 -e/--env、--restart、--network/--net、-w/--workdir、-u/--user、--entrypoint、-d/--detach、-i/--interactive 和 -t/--tty。不支持未知选项、--rm、--env-file、读取宿主环境变量或带重试次数的重启策略。镜像之后的选项按容器命令参数处理。
  • 端口范围为 1–65535,可指定 tcp、udp、sctp、IPv4 地址,以及等长的宿主与容器端口范围;也接受仅写容器端口。不支持 IPv6、端口 0 或空宿主端口格式。host 或 none 网络不能同时发布端口。
  • 绑定源必须是 Linux 绝对路径,不支持相对路径或 Windows 盘符路径。命名卷至少需要两个受支持的字符,也支持匿名卷。容器挂载目标须为绝对路径且不能是 /。--mount 只接受 type、source/src、target/dst/destination 和 readonly/ro,不解析 CSV 引号内的逗号或高级挂载选项。 未指定网络时,输出显式使用 network_mode: bridge。命名网络声明为外部网络;命名卷保留原始 Docker 名称,不附加 Compose 项目前缀。文本转换无法确认 Docker 资源、镜像默认设置、运行权限或平台兼容性。
  • 脱敏覆盖预览和导出中的所有环境变量值,包括空值,但不会隐藏原始输入、变量名、命令参数、镜像名、挂载路径或其他字段。这不是完整的敏感信息检测;隐藏值的草稿不能直接用于部署。

常见问题

为什么 YAML 中显式写了 bridge 网络?

未指定网络时,Docker run 使用默认桥接网络,而 Compose 通常创建项目网络。转换器写入 network_mode: bridge 以保留原选择。如果需要按服务名发现其他服务或使用项目专用网络,请有意识地调整。

重复环境变量和敏感值如何处理?

同名变量多次赋值时保留最后一个值,并提示警告。默认 YAML 隐藏所有环境变量值。启用原值显示后,预览、复制和下载都会包含原值;修改命令会恢复脱敏。其他字段中的敏感信息仍需人工检查。

现有卷和网络会被改名或创建吗?

命名卷使用生成的 Compose 键,并通过 name 属性保留原始 Docker 卷名。Compose 可能创建不存在的命名卷;工具不会检查现有数据。命名网络声明为 external,须事先存在。绑定挂载保留原始 -v 或 --mount 形式是否允许创建缺失宿主目录的区别。 这些卷由 Compose 管理而非 external 卷,因此 docker compose down -v 可能删除它们。请备份数据并检查生命周期命令。

为什么 -d 和入口命令需要特别处理?

后台运行属于执行命令的选项,因此 -d 只生成提示,不写为服务属性。显式 entrypoint 输出为列表;没有额外命令时会清空镜像默认 CMD。镜像之后的命令参数也保留为列表,包括空参数。

相关工具