如何在sh脚本中传递目标参数,以便为特定环境运行Docker构建



我正在构建一个sh脚本,以便能够同时运行Docker容器。通过这种方式,我不需要每次都运行单个容器。我现在需要添加的是一种运行docker-compose up --build -target=<ENV>的方法——ENV将是DEV或PROD。这样,我就可以在Docker设置中运行正确的环境。

此时,我的脚本看起来如下,但当我试图通过$2 = $DEV时,会出现[: =: unary operator expected的错误,我不知道什么是正确的修复方法

#!/bin/bash
CLEAN="clean"
RUN="run"
STOP="stop"
DEV="dev"
PROD="prod"
if [ "$#" -eq 0 ] || [ $1 = "-h" ] || [ $1 = "--help" ]; then
echo "Usage: ./myapp [OPTIONS] COMMAND [arg...]"
echo "       ./myapp [ -h | --help ]"
echo ""
echo "Options:"
echo "  -h, --help    Prints usage."
echo ""
echo "Commands:"
echo "  $CLEAN      - Stop and Remove containers."
echo "  $RUN        - Build and Run containers."
echo "  $STOP       - Stop containers."
exit
fi
clean() {
stop_existing
remove_stopped_containers
remove_unused_volumes
}
run() {
echo "Cleaning..."
clean
echo "Running docker..."
if [ $2 = $DEV ]; then
echo "$DEV - Running in - $DEV - environment"
docker-compose up --build -target=$DEV
fi
}
stop_existing() {
MYAPP="$(docker ps --all --quiet --filter=name=wetaxitask_api_dev)"
REDIS="$(docker ps --all --quiet --filter=name=wetaxitask_redis)"
MONGO="$(docker ps --all --quiet --filter=name=wetaxitask_mongodb)"
if [ -n "$MYAPP" ]; then
docker stop $MYAPP
fi
if [ -n "$REDIS" ]; then
docker stop $REDIS
fi
if [ -n "$MONGO" ]; then
docker stop $MONGO
fi
}
remove_stopped_containers() {
CONTAINERS="$(docker ps -a -f status=exited -q)"
if [ ${#CONTAINERS} -gt 0 ]; then
echo "Removing all stopped containers."
docker rm $CONTAINERS
else
echo "There are no stopped containers to be removed."
fi
}
remove_unused_volumes() {
CONTAINERS="$(docker volume ls -qf dangling=true)"
if [ ${#CONTAINERS} -gt 0 ]; then
echo "Removing all unused volumes."
docker volume rm $CONTAINERS
else
echo "There are no unused volumes to be removed."
fi
}
if [ $1 = $CLEAN ]; then
echo "Cleaning..."
clean
exit
fi
if [ $1 = $RUN ]; then
run
exit
fi
if [ $1 = $STOP ]; then
stop_existing
exit
fi

我想实现的是,有可能按照运行我的sh

./script.sh run dev or prod

调用shell函数时,它有自己的参数列表。POSIX外壳规范表明:

在执行复合命令期间,命令的操作数应临时成为位置参数

因此,如果您定义并调用shell函数

print_two_things() {
echo "dollars one is $1"
echo "dollars two is $2"
}
print_two_things foo bar
print_two_things

$1$2函数的参数,而不是脚本。

在您的脚本中,run函数中有两个错误

run() {
if [ $2 = $DEV ]; then :; fi
}

这里,$2函数的第二个参数,而不是脚本;由于您只将其作为run调用,没有任何参数,因此它是一个空字符串。其次,您不引用这两个变量中的任何一个,所以空字符串会被丢弃。这会扩展到无意义的[ = dev ],它会产生您看到的错误。

您需要在顶级的变量中捕获位置参数,或者将它们传递给shell函数。后一种方法的例子可以是:

run() {
environment="$1"  # first parameter _to this function_
clean
if [ "$environment" = "$DEV" ]; then :; fi
}
# at the top level; parameters _to the script_
if [ "$1" = "$RUN" ]; then
run "$2"
exit 0
fi

在Docker上下文中,您可能会发现将其作为环境变量传递更容易。使用docker run -e选项或类似设置设置的任何内容都将直接用作shell脚本中的环境变量。如果可能的话,在开发、测试和生产中运行相同的映像通常也被认为是最佳实践。

最新更新