Shell-Script
嘗試從 Unit 文件以另一個使用者身份執行 postgres 腳本,但未傳遞變數
我有一個 docker 容器,並
-e DEV_ENV
使用 docker run 命令定義,這是我為執行腳本而建構的單元文件……[Unit] Description=Script that creates environement users and databases. After=postgresql.service [Service] Type=simple User=root Group=root ExecStart=/usr/bin/su - postgres -c 'export DEV_ENV=$0; /usr/local/bin/psql.sh' "$DEV_ENV" TimeoutStartSec=100 [Install] WantedBy=default.target
我正在嘗試執行以下腳本…
#!/bin/bash while [[ $(systemctl status postgresql.service | awk '/Active/sub("\\(","") { print $3 }' | awk 'sub("\\)","")' ) != "running" ]] do echo "Waiting on service to come up.";done for i in ${DEV_ENV[*]};do EX=$(psql -lt | cut -d\| -f1 | grep ${i,,}) echo "Creating ${i}" if [[ ! ${EX} ]];then psql -c "CREATE DATABASE ${i};" psql -c "CREATE USER $i WITH PASSWORD '${i}'; GRANT ALL PRIVILEGES ON DATABASE $i TO ${i};" fi;done
我知道腳本執行,我在腳本的開頭和結尾進行了檢查。不幸的是,單元文件失敗,因為
$DEV_ENV
沒有傳遞變數。我可以手動執行以下命令並且可以正常工作。
/usr/bin/su - postgres -c 'export DEV_ENV=$0; /usr/local/bin/psql.sh' "$DEV_ENV"
如何正確地將環境變數傳遞給 postgres shell?
當您嘗試以其他使用者身份執行腳本時,似乎無法將環境變數與 Unit 文件一起使用。單元文件權限為 root:root 並且腳本作為 postgres:postgres 執行。
我什至嘗試在 Unit 文件中使用 EnvironmentFile,這在容器中也失敗了。可能是因為我正在使用 gdraheim/docker-systemctl-replacement 的 SystemD 替換。也許是別的東西,無論哪種方式服務都失敗了。
[Service] EnvironmentFile=-/etc/sysconfig/dockerenv
最後,我在 postgresql.service 文件中添加了一個 ExecStartPost 行。
ExecStartPost=/bin/bash -c /usr/local/bin/psql.sh
dockerenv 文件是在啟動時使用以下啟動腳本創建的…
#Create EnvironmentFile for postgres user when running psql.sh echo "DEV_ENV=\"${DEV_ENV}\" PUID=${PUID} GUID=${GUID}" > /etc/sysconfig/dockerenv
然後 psql.sh 腳本在執行時檢索其中的變數值。
#!/bin/bash date POS_ENV=$(cat /etc/sysconfig/dockerenv | awk -F= '/DEV_ENV/ { print $2 }' | awk 'gsub("\"","")') while [[ $(systemctl status postgresql.service | awk '/Active/sub("\\(","") { print $3 }' | awk 'sub("\\)","")' ) != "running" ]] do echo "Waiting on service to come up.";done for i in ${POS_ENV[*]};do EX=$(psql -lt | cut -d\| -f1 | grep ${i,,}) echo "Creating ${i}" if [[ ! ${EX} ]];then psql -c "CREATE DATABASE ${i};" psql -c "CREATE USER $i WITH PASSWORD '${i}'; GRANT ALL PRIVILEGES ON DATABASE $i TO ${i};" fi;done