![](/img/trans.png)
[英]How to pass travis environment variables to docker run in script
[英]How to pass a target argument in a sh script to run Docker build for a specific environment
我正在構建一個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 function 時,它有自己的參數列表。 POSIX shell 規范表明:
命令的操作數在復合命令執行期間臨時成為位置參數
因此,如果您定義並調用 shell function
print_two_things() {
echo "dollars one is $1"
echo "dollars two is $2"
}
print_two_things foo bar
print_two_things
$1
和$2
是 arguments 到function ,而不是腳本。
在您的腳本中, run
function 有兩個錯誤
run() {
if [ $2 = $DEV ]; then :; fi
}
在這里, $2
是function的第二個參數,而不是腳本; 因為您調用它只是run
,所以它是一個空字符串。 其次,您不引用這些變量中的任何一個,因此空字符串會被刪除。 這擴展到了無意義的[ = dev ]
,它會產生您看到的錯誤。
您需要在頂層捕獲變量中的位置參數,或者將它們傳遞給 shell function。 后一種方法的一個例子可能是:
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 腳本中的環境變量。 如果可能的話,通常也認為在 dev、test 和 prod 中運行相同的圖像是一種最佳實踐。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.