Мне нужно написать сценарии, которые создают сервисы на кластерах Docker Swarm. Пример сценария будет похож на это:
docker service create \
--name postgres \
--mode global \
--constraint "node.labels.postgres==master" \
--network my-network \
--env POSTGRES_USER="postgres" \
--env POSTGRES_PASSWORD="****" \
postgres:10
Переменные среды POSTGRES_USER и POSTGRES_PASSWORD должны поступать из секретов докеров. Например:
echo "example_password" | docker secret create postgres-password -
Я понимаю, что к секрету можно получить доступ как к файлу внутри работающего контейнера. Но в приведенном выше примере он должен быть передан команде "service create" как переменная среды. Он используется точкой входа контейнера, поэтому он должен быть представлен ДО того, как контейнер будет создан. Итак, как я могу передать секрет переключателю --env команды «docker service create»?
Как указано здесь https://github.com/docker-library/docs/blob/master/postgres/README.md вы можете использовать секреты роя в сервисе postgres, если вы добавите суффикс _FILE, например:
docker service create \ --name postgres \ --mode global \ --constraint "node.labels.postgres == master" \ --network my-network \ --secret "postgres-password" \ --env POSTGRES_USER = " postgres "\ --env POSTGRES_PASSWORD_FILE =" / run / secrets / postgres-password "\ postgres: 10
Если вы спросите об общем решении для какой-либо службы, это невозможно без создания контейнера или службы, которая предоставляет пароли в виде открытого текста (например, Nginx, который считывает пароли из файлов, которые являются секретными).