尝试以其他用户身份从 Unit 文件运行 postgres 脚本,但未传递变量

尝试以其他用户身份从 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?

答案1

当您尝试以其他用户身份运行脚本时,似乎无法将环境变量与单元文件一起使用。单元文件权限为 root:root,脚本作为 postgres:postgres 运行。

我什至尝试在单元文件中使用环境文件,这在容器中也失败了。可能是因为我正在使用 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

相关内容