start.sh
"사용자로부터 전달된 환경 변수를 가져오고 싶습니다"라는 스크립트를 호출하는 Dockerfile을 만들고 있습니다. docker-compose.yml
또는 docker run -e
지금 하고 싶은 작업은 이러한 변수 목록을 배열에 동적으로 정의하는 것입니다.
## Environment Variables
## Missing Vars off the hop SLACK_HOOK_URL
CONFIG_SETTINGS=(
AWS_ID
AWS_SECRET
BUCKET_REGION
BUCKET_NAME
DB_USER
DB_PASSWORD
DB_HOSTIP
DB_PORT
DB_NAME
)
이 배열에 정의된 위 변수의 하위 집합을 간단히 설정 해제했습니다.
CONFIG_SECRETS=(
AWS_ID
AWS_ID_STR
AWS_SECRET
AWS_SECRET_STR
BUCKET_NAME
BUCKET_NAME_STR
DB_USER
DB_USER_STR
DB_PASSWORD
DB_PASSWORD_STR
DB_HOSTIP
DB_HOSTIP_STR
DB_PORT
DB_PORT_STR
DB_NAME
DB_NAME_STR
)
내 문제는 다음 for 루프에 있습니다.
## Sanitization section
for i in "${!CONFIG_SECRETS[@]}"; do
## Nullify environment variables that contain secrets before launching.
# echo ${CONFIG_SECRETS[$i]}
eval $"${CONFIG_SECRETS[$i]}"=$""
unset $"${CONFIG_SECRETS[$i]}"
echo \$${CONFIG_SECRETS[$i]} is now to: $"${CONFIG_SECRETS[$i]}"
done
예를 들어, 아래는 이러한 변수를 반복하고 설정하기 위해 만든 for 루프입니다.
for i in "${!CONFIG_SETTINGS[@]}"; do
echo ${CONFIG_SETTINGS[$i]}"_KEY"
## Indirect references http://tldp.org/LDP/abs/html/ivr.html
eval FROM_STRING=\$"${CONFIG_SETTINGS[$i]}_STR"
eval VALUE_STRING=\$${CONFIG_SETTINGS[$i]}
eval KEY_STRING=\$"${CONFIG_SETTINGS[$i]}_KEY"
TO_STRING="$KEY_STRING$VALUE_STRING"
sed -i '' "s/$FROM_STRING/$TO_STRING/g" ./config.tmpl
done
그러면 다음 구성 파일이 수정됩니다.
{
"aws_id": "YOUR-AWS-ID",
"aws_secret": "YOUR-AWS-SECRET",
"bucket_region": "YOUR-BUCKET-REGION",
"bucket_name": "YOUR-BUCKET-NAME",
"db_conn": "USER:PASSWORD@tcp(localhost:3306)/DBNAME",
"slack_hook_url": ""
}
이 질문의 범위를 벗어나는 내용을 제외한 전체 상황별 스크립트입니다.
#!/bin/bash
## Launch service will tell prism-bin what mode to run in.
LAUNCHMODE="${MODE:-$1}"
## This variable will be what can override default launch args. I may modify this as I learn more about prism-bin
LAUNCHARGS="${CUSTOM_ARGS:-$2}"
## This is setup this way to handle any situations that might arise from the
## config being JSON and bash not being any good at JSON.
# ## Strings to replace.
AWS_ID_STR="YOUR-AWS-ID"
AWS_SECRET_STR="YOUR-AWS-SECRET"
BUCKET_REGION_STR="YOUR-BUCKET-REGION"
BUCKET_NAME_STR="YOUR-BUCKET-NAME"
DB_USER_STR="USER"
DB_PASSWORD_STR="PASSWORD"
DB_HOSTIP_STR="localhost"
DB_PORT_STR="3306"
DB_NAME_STR="DBNAME"
# Environment Variables/Defaults
## Json sucks in BASH/Shell so you need to add trailing commas intermittently.
## Just pay attention to this. Also at some point I'll need to make a fringe
## case for handling key/values that aren't included in the default config.
AWS_ID="${AWS_ID:-potato}"
AWS_SECRET="${AWS_SECRET:-potato}"
BUCKET_REGION="${BUCKET_REGION:-potato}"
BUCKET_NAME="${BUCKET_NAME:-potato}"
DB_USER="${DB_USER:-potato}"
DB_PASSWORD="${DB_PASSWORD:-potato}"
DB_HOSTIP="${DB_HOSTIP:-potato}"
DB_PORT="${DB_PORT:-potato}"
DB_NAME="${DB_NAME:-potato}"
## Environment Variables in Array
CONFIG_SETTINGS=(
AWS_ID
AWS_SECRET
BUCKET_REGION
BUCKET_NAME
DB_USER
DB_PASSWORD
DB_HOSTIP
DB_PORT
DB_NAME
)
CONFIG_SECRETS=(
AWS_ID
AWS_ID_STR
AWS_SECRET
AWS_SECRET_STR
BUCKET_NAME
BUCKET_NAME_STR
DB_USER
DB_USER_STR
DB_PASSWORD
DB_PASSWORD_STR
DB_HOSTIP
DB_HOSTIP_STR
DB_PORT
DB_PORT_STR
DB_NAME
DB_NAME_STR
)
## Sanitization section
# Awaiting someone smarter than me to suggest a method for this.
# https://unix.stackexchange.com/questions/474097/i-want-to-unset-a-list-of-bash-variables-that-have-their-variable-strings-stored
for i in "${CONFIG_SECRETS[@]}"; do
unset $i
eval echo \$"${CONFIG_SECRETS[$i]}"=\$${CONFIG_SETTINGS[$i]}
done
답변1
이것은 간단한 루프여야 합니다.
#!/bin/bash
UNSET=(a b c)
a=10 b=20 c=30 d=40 e=50
echo Before a=$a b=$b c=$c d=$d e=$e
for i in ${UNSET[@]}
do
unset $i
done
echo After a=$a b=$b c=$c d=$d e=$e
이로 인해
Before a=10 b=20 c=30 d=40 e=50
After a= b= c= d=40 e=50
답변2
다음을 사용하여 변수를 역참조할 수 있습니다 !
.
$ foo=bar
$ bar=1
$ echo ${!foo}
1
변수를 사용할 수 없습니다~에그러나 이와 같은 확장 기능을 사용하면 정말 보기 흉한 작업을 수행해야 할 수도 있습니다 eval
.
답변3
나는 당신이 원 안에 있다고 생각합니다. 배열을 반복하고 순환 참조의 매개 변수를 설정 해제하십시오.
AWS_SECRET='secret_here'
echo Before:
declare -p AWS_SECRET
set|grep AWS_SECRET
for secret in "${CONFIG_SECRETS[@]}"
do
unset $secret
done
echo After:
declare -p AWS_SECRET
set|grep AWS_SECRET