带有 Spring Boot 应用程序的 docker secret 在 docker swarm 模式 /run/secrets 下不起作用
Posted
技术标签:
【中文标题】带有 Spring Boot 应用程序的 docker secret 在 docker swarm 模式 /run/secrets 下不起作用【英文标题】:docker secret with spring boot application is not working in docker swarm mode /run/secrets 【发布时间】:2019-03-05 03:07:11 【问题描述】:我正在尝试为 mysql 容器和 Spring Boot 应用程序的 DB 密码设置环境变量,这通常在 docker secrets 中声明。
echo "db_secured_password" | docker secret create secret -
这里是配置文件:
spring boot 应用的 -> application.yml
db:
name: my-db
host: localhost
port: 3306
username: root
password: /run/secrets/db-root-password
spring:
application:
name: core-backend
datasource:
url: jdbc:mysql://$db.host:$db.port/$db.name
username: $db.username
password: $db.password
用于 docker swarm 模式下的 docker stack -> docker-compose.yml
version: '3.1'
services:
mysql-db:
container_name: mysql-db
image: mysql:8.0.12
deploy:
restart_policy:
condition: on-failure
volumes:
- ./data/mysql:/var/lib/mysql
- ./conf/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
environment:
- MYSQL_ROOT_PASSWORD=/run/secrets/db-root-password
- MYSQL_DATABASE=my_db
ports:
- "3306:3306"
secrets:
- db-root-password
spring-boot-app:
container_name: spring-boot-app
image: spring-boot-app:local
environment:
- DB_PASSWORD=/run/secrets/db-root-password
# Also tried adding with the file as property name
# - DB_PASSWORD_FILE=/run/secrets/db-root-password
ports:
- "8080:8080"
environment:
HOST_NAME: localhost
secrets:
- db-root-password
depends_on:
- mysql-db
secrets:
db-root-password:
external: true
我使用以下命令运行 docker 堆栈:
docker stack deploy --with-auth-registry -c docker-compose.yml test-stack
我无法准确获取
db-root-password
属性的值 在春季启动应用程序中。当我检查db-root-password
的值时,我 获取值为/run/secrets/db-root-password
。
有什么遗漏吗? 如果我想以不同的方式覆盖环境变量的值?
【问题讨论】:
【参考方案1】:我们通过使用“printf”而不是“echo”解决了同样的问题,echo 的问题是它会在 docker secret 中留下一个换行符。您可以参考 docker secret create => https://docs.docker.com/engine/reference/commandline/secret_create/
中的示例我还有一个例子,将 docker 机密直接加载到 spring 属性中,例如 "spring.datasource.password" => https://github.com/kwonghung-YIP/spring-boot-docker-secret
【讨论】:
如果你使用 'echo -n' 来避免输入换行符,则相同【参考方案2】:我认为您需要从秘密文件中挂载密码,请在此处查看示例“在 Compose 中使用秘密”https://docs.docker.com/engine/swarm/secrets/#build-support-for-docker-secrets-into-your-images
【讨论】:
不,我没有找到您关于安装机密的建议的解决方案。您有任何特定于 Spring Boot 应用程序的示例吗?附言即使我尝试在正在运行的容器(spring boot app)上执行 exec 来检查目录/run/secrets/*
,我也看到所有密码都存在。但是 spring boot 应用程序无法读取它。以上是关于带有 Spring Boot 应用程序的 docker secret 在 docker swarm 模式 /run/secrets 下不起作用的主要内容,如果未能解决你的问题,请参考以下文章
带有 FeignClient 的 Spring Boot RepositoryRestResource
在 Spring Boot 应用程序中嵌入带有作业定义的 Spring Batch Admin
带有 spring-boot 和 angularjs 的 CORS 不起作用