나는 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