|
#!/usr/bin/env bash |
|
|
|
tearDown () { |
|
echo "= cleanup test remnants" |
|
rm -rf ./generated |
|
echo "= remove stack" |
|
docker stack rm my_stack || true |
|
echo "= remove secrets" |
|
docker secret rm $(docker secret ls -f name=my_stack_my_secret_name -q) || true |
|
} |
|
|
|
waitForStack () { |
|
stack=$1 |
|
echo "= waiting for stack: $service_container" |
|
until $(docker stack ls | grep "^$stack\s" > /dev/null); do |
|
printf '.' |
|
sleep 1 |
|
done |
|
echo "" |
|
} |
|
|
|
getServiceContainer () { |
|
stack_service=$1 |
|
echo -n "$stack_service.1.$(docker service ps -f name=$stack_service.1 $stack_service -q --no-trunc | head -n1)" |
|
} |
|
|
|
execInService () { |
|
stack_service=$1 |
|
cmd=$2 |
|
service_container=$(getServiceContainer "$stack_service") |
|
docker exec -ti "$service_container" $cmd |
|
} |
|
|
|
waitForServiceContainer () { |
|
service=$1 |
|
container=$(getServiceContainer "$service") |
|
echo "= waiting for container: $container" |
|
until $(docker ps --format '{{.Names}}' | grep "$container" > /dev/null); do |
|
printf '.' |
|
sleep 1 |
|
done |
|
echo "" |
|
} |
|
|
|
getSecretValueInService () { |
|
service=$1 |
|
secret_name=$2 |
|
waitForServiceContainer "$service" > /dev/null |
|
echo -n $(execInService $service "cat /run/secrets/$secret_name") |
|
} |
|
|
|
tearDown |
|
|
|
echo "= setup test" |
|
mkdir ./generated |
|
chmod a+x ./docker_secret_update.sh |
|
|
|
echo "= create secret file" |
|
echo -n "old_secret_value" > ./generated/my_secret_file |
|
|
|
echo "= generate docker-compose.yml" |
|
cat > ./generated/docker-compose.yml <<EOF |
|
--- |
|
version: '3.6' |
|
services: |
|
|
|
my_service: |
|
image: nginx |
|
secrets: |
|
- my_secret_name |
|
# my_service_2: |
|
# image: nginx |
|
# secrets: |
|
# - my_secret_name |
|
secrets: |
|
my_secret_name: |
|
file: ./my_secret_file |
|
EOF |
|
|
|
echo "= deploy stack" |
|
docker stack deploy -c ./generated/docker-compose.yml my_stack |
|
|
|
echo "= waiting for stack" |
|
waitForStack "my_stack" |
|
echo "= waiting for container" |
|
waitForServiceContainer "my_stack_my_service" |
|
|
|
echo "= secret's value in service is: $(getSecretValueInService my_stack_my_service my_secret_name)" |
|
|
|
echo "= update secret file value" |
|
echo -n "new secret value" > ./generated/my_secret_file |
|
|
|
echo "= (known to be failing) attempt at secret update" |
|
docker stack deploy -c ./generated/docker-compose.yml my_stack || true |
|
|
|
echo "= trying JJ's solution" |
|
./docker_secret_update.sh --stack=my_stack --service=my_service \ |
|
--secret=my_secret_name --value="new_secret_value" |
|
|
|
echo "= secret's value in service is: $(getSecretValueInService my_stack_my_service my_secret_name)" |
|
|
|
echo "= (successful) attempt at secret update" |
|
docker stack deploy -c ./generated/docker-compose.yml my_stack |
|
|
|
echo "= secret's value in service is: $(getSecretValueInService my_stack_my_service my_secret_name)" |
|
|
|
tearDown |
Hi, thanks for this. But I can't figure out how to make the comparison (line 71 in docker_secret_update) go with the beginning of the config name. Example, my File.Name is " conf_name_1", and my secret_name is "conf_na", how if eq File.Name is startwith "conf_na"?