Docker Compose是否有类似npm scripts的功能,可按需执行容器命令?
实现Docker Compose自定义快捷命令的方案
方法1:编写本地bash脚本(最直接)
在项目根目录创建名为docker-do的可执行脚本,内容如下:
#!/bin/bash COMMAND=$1 case $COMMAND in testmystuff) docker exec -it php-container ../vendor/phpunit/phpunit/phpunit tests/ ;; render-something) docker exec -it php-container ./mycontainerscript render more-args-here ;; bash-php) docker exec -it php-container bash ;; *) echo "未知命令:$COMMAND,可用命令:testmystuff、render-something、bash-php" exit 1 ;; esac
给脚本添加执行权限:
chmod +x docker-do
之后即可通过以下方式执行命令:
./docker-do testmystuff
如果想简化为全局调用,可将脚本移动到/usr/local/bin目录,或者在shell配置文件(如~/.bashrc或~/.zshrc)中添加别名:
alias docker-do='/your/project/path/docker-do'
执行source ~/.bashrc刷新配置后,就能直接用docker-do testmystuff调用。
方法2:使用Makefile(适合多命令场景)
在项目根目录创建Makefile:
.PHONY: testmystuff render-something bash-php testmystuff: docker exec -it php-container ../vendor/phpunit/phpunit/phpunit tests/ render-something: docker exec -it php-container ./mycontainerscript render more-args-here bash-php: docker exec -it php-container bash
执行命令时只需输入:
make testmystuff
方法3:Docker Compose扩展字段+解析脚本(贴近你的yml定义设想)
在docker-compose.yml中用x-开头的自定义扩展字段存储命令(Docker Compose原生支持这类自定义字段):
services: php: container_name: php-container # 你的其他容器配置... x-usercommands: php-container: testmystuff: "../vendor/phpunit/phpunit/phpunit tests/" render-something: "./mycontainerscript render more-args-here" bash-php: "bash"
编写解析该字段的docker-do脚本:
#!/bin/bash COMMAND=$1 # 从docker-compose.yml读取对应命令 TARGET_CMD=$(docker-compose config --format json | jq -r ".\"x-usercommands\".\"php-container\".\"$COMMAND\"") if [ -z "$TARGET_CMD" ] || [ "$TARGET_CMD" = "null" ]; then echo "未知命令:$COMMAND,可用命令:$(docker-compose config --format json | jq -r ".\"x-usercommands\".\"php-container\" | keys[]")" exit 1 fi docker exec -it php-container $TARGET_CMD
给脚本加执行权限后,就能用./docker-do testmystuff执行命令,好处是所有自定义命令都集中在docker-compose.yml中,和你最初的设想一致。
注意:该方法需要安装jq工具来解析JSON,可通过apt install jq(Debian/Ubuntu)或brew install jq(Mac)安装。
内容的提问来源于stack exchange,提问作者Taylor Vance
相关产品推荐
相关产品推荐

