Shell-Script

嘗試從 Unit 文件以另一個使用者身份執行 postgres 腳本,但未傳遞變數

  • December 20, 2019

我有一個 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

引用自:https://unix.stackexchange.com/questions/558105