簡體   English   中英

Bash 使用變量時使用 docker 執行腳本

[英]Bash scripting with docker exec when using variables

我正在嘗試創建一個基於變量的 Bash 腳本。 當我通過 docker 圖像使用 bash 命令行時,它運行良好:

#docker exec app_mysql mysqldump --login-path=localroot masterdb | gzip > 1111111.sql.gz 

當我嘗試使用變量通過 shell 腳本重現相同內容時,它什么也沒給我,只是執行時沒有任何錯誤:

#!/bin/bash

DOCKER="docker exec app_mysql bash -c"
CONF_LOCAL_MYSQL_ROOT="--login-path=localroot"
LOCALDBNAME="masterdb"

$DOCKER '(mysqldump '$CONF_LOCAL_MYSQL_ROOT' '$LOCALDBNAME' | gzip > '${LOCALDBNAME}'_local_'${DATE}'.sql.gz)'

我哪里錯了?

腳本中的引用不一致,這可能會導致一些問題。

我不會像您所展示的那樣嘗試擴展一個多詞變量。 相反,如果您想對docker exec命令進行某種抽象,我會使用shell function

dockerExec() {
  docker exec app_mysql "$@"
}

您原來的docker exec命令沒有sh -c包裝器,我也不會嘗試在此處強制使用; 它確實使報價變得更加復雜。

我也可以在一個簡單的變量中構造 output 文件名

OUTFILE="${LOCALDBNAME}_local_${DATE}.sql.gz"

請注意,整個字符串周圍有雙引號,以防止出現意外空格,但字符串中沒有額外的引號。

將所有這些放在一起,並刪除不必要的引號,您會得到如下內容:

#!/bin/sh

CONTAINER=app_mysql
CONF_LOCAL_MYSQL_ROOT="--login-path=localroot"
LOCALDBNAME="masterdb"
DATE="$(date +%Y%m%d)"
OUTFILE="${LOCALDBNAME}_local_${DATE}.sql.gz"

dockerExec() {
  docker exec "$CONTAINER" "$@"
}

dockerExec mysql "$CONF_LOCAL_MYSQL_ROOT" "$LOCALDBNAME" \
  | gzip \
  > "$OUTFILE"

進一步注意,我在這里展示的所有內容都是標准的 POSIX shell 語法,沒有 GNU bash 擴展,我使用了普通的#!/bin/sh “shebang”行; 即使在 bash 不可用或/bin/sh是不同的 shell 的最小 Debian 或 Alpine 環境中,這也可以工作。

Bash 變量沒有在單引號內展開。

$ foo=hello

$ echo '$foo'
$foo

$ echo "$foo"
hello

上面的配置看起來我試圖重新發明輪子。 無論如何,解決方案很簡單。 我剛剛從我的腳本中刪除了冗余數據。 所以現在它看起來像:

#!/bin/bash

DOCKER="docker exec app_mysql mysql"
CONF_LOCAL_MYSQL_ROOT="--login-path=localroot"
LOCALDBNAME="masterdb"

$DOCKER ${CONF_LOCAL_MYSQL_ROOT} ${LOCALDBNAME} | gzip > ${LOCALDBNAME}_local_${DATE}.sql.gz

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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