簡體   English   中英

如何在 sh 腳本中傳遞目標參數以針對特定環境運行 Docker 構建

[英]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
}

在這里, $2function的第二個參數,而不是腳本; 因為您調用它只是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM