В настоящее время я работаю над сценарием оболочки, который используется для создания образов докера и перезапуска контейнеров, запущенных на удаленном хосте. ниже приведена сокращенная версия кода.

#!/bin/bash -xe
# usages: ./deploy.sh [PROJECT_REPO] [DOCKER_IMAGE] [TARGET_HOST] [KEYPAIR_PATH]
PROJECT_REPO=$1
DOCKER_IMAGE=$2
TARGET_HOST=$3
KEYPAIR_PATH=$4
PROJECT_DIR=$(echo $PROJECT_REPO | cut -d'/' -f 2 | cut -d '.' -f 1)
CONTAINER=$PROJECT_DIR
USER="ubuntu"
git clone $PROJECT_REPO
cd $PROJECT_DIR

if docker build -t $DOCKER_IMAGE .; then
        docker push $DOCKER_IMAGE
        if ssh -o StrictHostKeyChecking=no -i $KEYPAIR_PATH  $USER@$TARGET_HOST -yes DOCKER_IMAGE=$DOCKER_IMAGE CONTAINER=$CONTAINER '\
        docker pull $DOCKER_IMAGE && \
        docker stop $CONTAINER
        docker rm $CONTAINER
        docker run -d --name=$CONTAINER  $DOCKER_IMAGE'; then
                echo "success"
        else
                echo "Failure"  
                exit 1
        fi
else
        echo "Error during building image"
        exit 1
fi

Я пытаюсь сделать этот сценарий обобщенным, чтобы его можно было использовать с различными проектами, запустив сценарий с подробными сведениями о проекте (URL-адрес хранилища, образ докера), но когда я попытался запустить сценарий, я получаю сообщение об ошибке с докером команды из-за пустых значений переменных окружения DOCKER_IMAGE и CONTAINER на удаленных хостах.

1 ответ1

1

Для этого простого сценария использование двойных кавычек вместо одинарных заполняет переменные из родительской оболочки.

Конечно, если ваш скрипт содержит строки или другие выражения, которые не должны быть интерполированы родительской оболочкой на хосте, где вы запускаете этот скрипт, их необходимо экранировать или иным образом нейтрализовать. Но у вас, похоже, нет ни одного из них здесь.

if ssh -o StrictHostKeyChecking=no -i $KEYPAIR_PATH  $USER@$TARGET_HOST -yes "\
        docker pull $DOCKER_IMAGE && \
        docker stop $CONTAINER
        docker rm $CONTAINER
        docker run -d --name=$CONTAINER  $DOCKER_IMAGE"; then
                echo "success"

Возможно, вы также захотите использовать документ здесь (чтобы вы могли использовать одинарные и двойные кавычки во встроенном скрипте) и, возможно, понять, когда нужно что-то цитировать. Это будет хорошо работать, пока ваши переменные не содержат нерегулярные пробелы или символы подстановки, но это странно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .