Làm cách nào để sao chép các biến môi trường từ shell cục bộ sang kết nối ssh từ xa bên trong shellscript?


0

Tôi hiện đang làm việc trên một tập lệnh shell được sử dụng để xây dựng hình ảnh docker và khởi động lại các container đang chạy trên máy chủ từ xa. dưới đây là phiên bản rút gọn của mã.

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

Tôi đang cố gắng làm cho tập lệnh này được khái quát hóa để nó có thể được sử dụng với các dự án khác nhau bằng cách chạy tập lệnh với các chi tiết của một dự án (URL kho lưu trữ, hình ảnh docker), nhưng khi tôi cố chạy tập lệnh thì tôi gặp lỗi với docker các lệnh do các giá trị của các biến môi trường DOCKER_IMAGECONTAINERbị trống trên các máy chủ từ xa.


Lưu ý: ssh -yestương đương ssh -y -e -svà không liên quan gì đến từ "có". Nhận xét này dành cho những người dùng (như tôi) tự hỏi "có" trong bối cảnh là gì ssh.
Kamil Maciorowski

Câu trả lời:


1

Đối với tập lệnh đơn giản này, sử dụng dấu ngoặc kép thay vì dấu ngoặc đơn sẽ điền vào các biến từ vỏ cha.

Tất nhiên, nếu tập lệnh của bạn chứa các chuỗi hoặc các biểu thức khác không được nội suy bởi trình bao cha mẹ trên máy chủ nơi bạn bắt đầu tập lệnh này, thì các tập lệnh này cần phải được thoát hoặc bị vô hiệu hóa. Nhưng dường như bạn không có ai trong số họ ở đây.

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"

Cũng có thể xem xét việc sử dụng tài liệu ở đây (vì vậy bạn có thể sử dụng cả dấu ngoặc đơn và dấu ngoặc kép trong tập lệnh nhúng) và có thể hiểu khi nào cần trích dẫn nội dung. Điều này sẽ hoạt động tốt miễn là các biến của bạn không chứa các khoảng trắng hoặc ký tự đại diện bất thường, nhưng đó là điều kỳ lạ.


Ví dụ về pha trộn dấu ngoặc đơn và dấu ngoặc kép mà không có tài liệu ở đây, thoát dấu ngoặc kép, v.v.
Kamil Maciorowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.