阿里云容器服务与ASP.NET Core部署:用 docker secrets 保存 appsettings.Production.json

时间:2023-12-13 18:22:44

这是我们使用阿里云容器服务基于 docker 容器部署 asp.net core 应用遇到的另一个问题 —— 如果将包含敏感信息的应用配置文件 appsettings.Production.json 传递给运行在容器中的 asp.net core 应用。

Docker 针对这样的应用场景已经提供了解决方案 —— Docker Secrets,对应的 docker 命令是 docker secret 。我们就用 docker secrets 解决了这个问题,在这篇随笔中分享一下。

首先在阿里云容器服务中将 appsettings.Production.json 添加到 docker scrects :

进入集群管理的控制台 -> “密钥管理”,点击“创建”按钮添加一个 secret ,将 appsettings.Production.json 中的保存在这里(见下图)。

阿里云容器服务与ASP.NET Core部署:用 docker secrets 保存 appsettings.Production.json

如果不通过阿里云容器服务控制台,可以直接使用 docker secret 命令添加(前提用 docker 客户端连接到阿里云容器服务中对应的集群):

cat appsettings.Production.json | docker secret create cache-service-appsettings.Production.json -

接着修改编排(compose)文件,启用这个 secret :

secrets:
- cache-service-appsettings.Production.json

有了这个编排,容器启动后,就可以在 /run/secrets 目录中看到这个文件,并且可以查看文件中的配置内容:

root@511090335bb5:/# ls /run/secrets
cache-service-appsettings.Production.json
root@511090335bb5:/# cat /run/secrets/cache-service-appsettings.Production.json

为了让容器中的 asp.net core 应用能够读取到这个文件,我们采用的方法是在容器启动时,将其复制到应用程序的根目录中并重命名为 appsettings.Production.json :

command: bash -c "cp /run/secrets/cache-service-appsettings.Production.json /app/appsettings.Production.json && cd /app && dotnet Cnblogs.Cache.WebApi.dll"

添加了 secret ,修改好 compose ,重新部署应用,运行在容器中的 asp.net core 应用就能成功读取到保存在 docker secrets 中的  appsettings.Production.json 的配置。

搞定!

2017年6月22日更新

后来在实际时使用发现,当容器运行时,无法通过 docker secret rm 命令删除 secret :

Error response from daemon: rpc error: code = 3 desc = secret 'cache-appsettings.Production.json' is in use by the following service: xxx

由于 docker secrets 无法直接更新,只能删除后添加,但删除需要停止容器,这对于生产环境是不能接受的。如果不采用先删除后添加的方式,那只能每次更新时换一个secret名称,但这样编排文件也要跟着进行修改,很麻烦。

后来改用阿里云容器服务的NAS数据卷解决了这个问题,参考阿里云帮助文档: