私は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シェルに正しく渡すには?
答え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