如何在docker-compose.yml中配置顺序执行多个shell脚本
问题原因
你之前的配置写法错误主要有两点:
- YAML折叠符
>会将多行内容拼接为单行,但你额外加了双引号包裹每段命令,导致整串内容被识别为单个可执行文件名,系统找不到对应文件自然无法运行 - 多命令串联需要显式通过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
相关产品推荐
相关产品推荐

