You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在docker-compose.yml中配置顺序执行多个shell脚本

问题原因

你之前的配置写法错误主要有两点:

  1. YAML折叠符>会将多行内容拼接为单行,但你额外加了双引号包裹每段命令,导致整串内容被识别为单个可执行文件名,系统找不到对应文件自然无法运行
  2. 多命令串联需要显式通过shell解析执行,不能直接将多个命令作为参数传递给容器入口

可行配置方案

写法1:单行文内拼接

直接用sh -c包裹所有需要顺序执行的命令即可,&&表示前一条命令执行成功(退出码为0)才会执行后一条:

migrations:
    image: "node:14.17.5-alpine3.14"
    volumes:
      - "../migrations/scripts:/tmp"
      - "../../api:/tmp/api"
    links:
      - database
    command: sh -c "sh /tmp/migration_test.sh postgresql://user:password@host.docker.internal:35432/pg_database && sh /tmp/migration_test2.sh postgresql://user:password@host.docker.internal:35432/pg_database"
    depends_on:
      - "api"
      - "database"

写法2:多行字面量块(命令较长时更易读)

用YAML的|字面量块,无需额外引号和转义,换行自然分隔命令,默认按顺序执行:

migrations:
    image: "node:14.17.5-alpine3.14"
    volumes:
      - "../migrations/scripts:/tmp"
      - "../../api:/tmp/api"
    links:
      - database
    command: |
      sh /tmp/migration_test.sh postgresql://user:password@host.docker.internal:35432/pg_database
      sh /tmp/migration_test2.sh postgresql://user:password@host.docker.internal:35432/pg_database
    depends_on:
      - "api"
      - "database"

补充说明

  • 如果需要忽略前一个脚本的执行结果,始终执行第二个脚本,把&&替换为;即可
  • 如果后续需要执行的脚本更多,建议单独封装一个总入口脚本(比如/tmp/run_migrations.sh),直接在command中执行该入口脚本即可,维护成本更低
  • 你所用的alpine版node镜像默认携带的ash解析器完全支持上述shell语法,无需额外安装依赖

内容的提问来源于stack exchange,提问作者C. Yee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:27:03