다른 사용자로 유닛 파일에서 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

관련 정보