別のユーザーとしてユニットファイルからpostgresスクリプトを実行しようとしましたが、変数は渡されませんでした。

別のユーザーとしてユニットファイルからpostgresスクリプトを実行しようとしましたが、変数は渡されませんでした。

私はdockerコンテナを持っていて、-e DEV_ENVdocker 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シェルに正しく渡すには?

答え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

関連情報