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