Como copiar variáveis de ambiente do shell local para uma conexão ssh remota dentro de um shellscript?

0

Atualmente, estou trabalhando em um script de shell que é usado para criar imagens do docker e reiniciar contêineres em execução no host remoto. abaixo está a versão simplificada do código.

#!/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

Estou tentando tornar esse script generalizado para que possa ser usado com projetos diferentes executando o script com detalhes de um projeto (URL do repositório, imagem docker). Mas quando tentei executar o script, estou recebendo um erro com os comandos do docker devido aos valores das variáveis de ambiente DOCKER_IMAGE e CONTAINER estarem vazios nos hosts remotos.

    
por Manvendra Singh 19.04.2018 / 04:38

1 resposta

1

Para esse script simples, usar aspas duplas em vez de single preencherá as variáveis do shell pai.

É claro que, se o seu script contiver strings ou outras expressões que não devem ser interpoladas pelo shell pai no host em que você inicia este script, elas precisam ser evitadas ou neutralizadas. Mas você não parece ter nenhum desses aqui.

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"

Talvez também procure usar um documento aqui (assim você pode usar aspas simples e duplas no script incorporado) e talvez entender quando citar as coisas. Isso funcionará bem, desde que suas variáveis não contenham espaços em branco irregulares ou caracteres curinga, mas é estranho.

    
por 19.04.2018 / 06:19