![다른 사용자로 유닛 파일에서 postgres 스크립트를 실행하려고 시도했지만 변수가 전달되지 않았습니다.](https://linux55.com/image/12300/%EB%8B%A4%EB%A5%B8%20%EC%82%AC%EC%9A%A9%EC%9E%90%EB%A1%9C%20%EC%9C%A0%EB%8B%9B%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20postgres%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%98%EB%A0%A4%EA%B3%A0%20%EC%8B%9C%EB%8F%84%ED%96%88%EC%A7%80%EB%A7%8C%20%EB%B3%80%EC%88%98%EA%B0%80%20%EC%A0%84%EB%8B%AC%EB%90%98%EC%A7%80%20%EC%95%8A%EC%95%98%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
나는 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