Docker 由于摘要完整性问题,加载appsettings.Production.json时出错

Docker 由于摘要完整性问题,加载appsettings.Production.json时出错,docker,kubernetes,progressive-web-apps,blazor-webassembly,appsettings,Docker,Kubernetes,Progressive Web Apps,Blazor Webassembly,Appsettings,我正在开发一个Blazor WebAssembly应用程序,它启用了PWA,并且包含文件appsettings.json、appsettings.Development.json和appsettings.Production.json。最后一个是空的,因为当生产环境部署到kubernetes集群时,它将包含要替换的秘密 我使用k8s进行部署,并使用Secret资源将空的appsettings.Production.json文件替换为加密文件,将其部署到一个基于nginx的容器中,容器中包含已发布

我正在开发一个Blazor WebAssembly应用程序,它启用了PWA,并且包含文件
appsettings.json
appsettings.Development.json
appsettings.Production.json
。最后一个是空的,因为当生产环境部署到kubernetes集群时,它将包含要替换的秘密

我使用k8s进行部署,并使用
Secret
资源将空的
appsettings.Production.json
文件替换为加密文件,将其部署到一个基于nginx的容器中,容器中包含已发布的blazor应用程序

现在我在浏览器中看到了这个问题:

当在CI管道中使用docker build构建应用程序时,该文件是一个空json文件,并且得到的SHA计算值与构建过程计算的SHA计算值不匹配

我的问题是:如何在部署期间替换
appsettings.Production.json
,比构建过程晚得多,并且不让完整性测试在该文件上失败

文件
blazor.boot.json
不包含
appsetting.Production.json
文件的任何SHA:

{
“cacheBootResources”:正确,
“配置”:[
“appsettings.Development.json”,
“appsettings.json”,
“appsettings.Production.json”
],
“debugBuild”:false,
“入口组件”:“IrisTenantWeb”,
“icuDataMode”:0,
“linkerEnabled”:没错,
“资源”:{
“大会”:{
“Azure.Core.dll”:“sha256 rzNx\/GlDpiutVRPzugT82owXvTopmiixMar68xLA6L8=”,
//一堆.dll文件,
“System.Private.CoreLib.dll”:“sha256-S7l+o9J9ivjCunMa+Ms\/JO\/kVaXLW8KTAjq1eRjY4EA=”
},
“lazyAssembly”:空,
“pdb”:空,
“运行时”:{
“dotnet.timezones.blat”:“sha256-SQvzbzBfueaAxSKIKE1khBH02NH2MJJaWDBav\/S5MSs=”,
“dotnet.wasm”:“sha256-Yxynllemqrpfvpy2ksdhlek35d9kvzzwwkaoiftc=”,
“icudt.dat”:“sha256-m7NyeXyxM+CL04jr9ui1Z6pVfMWwhHusuz5qNZWpAwA=”,
“icudt_CJK.dat”:“sha256-91bygK5voY9lG5wxP0\/uj7uH5xljF9u7iWnSldT1Z\/g=”,
“icudt_EFIGS.dat”:“sha256-DPFEOLPH83B2RDX40CxIbCFVZ8ABTWAFQ+RBQMxGw0=”,
“icudt编号CJK.dat”:“sha256-OM7Z6AN9JHMCYQDMCBWFGFFAYAGGSH1JLC\/Z6DYEVMK=“,
“dotnet.5.0.5.js”:“sha256-Dvb7uXD3+JPPqlsw2duS+FFNQDkFaxhIbSQWSnhODkM=”
},
“卫星资源”:空
}
}
但是
service worker assets.js
文件确实包含为其计算的SHA:

self.assetsmifest={
“资产”:[
{
“散列”:“sha256-EaNzjsIaBdpWGRyu2Elt6mv3X+48iD9gGaSN8xAm3ao=”,
“url”:“appsettings.Development.json”
},
{
“散列”:“sha256-RIn54+RUdIs1IeshTgpWlNViz\/PZ\/1EctFaVPI9TTAA=”,
“url”:“appsettings.json”
},
{
“散列”:“sha256-RIn54+RUdIs1IeshTgpWlNViz\/PZ\/1EctFaVPI9TTAA=”,
“url”:“appsettings.Production.json”
},
{
“散列”:“sha256 OV+CP+ILUqNY7e7\/MGw1L5+Gi7EKCXEYNJVyBjbn44M=”,
“url”:“css\/app.css”
},
// ...
],
“版本”:“j39cUu6V”
};
注意:您可以看到
appsettings.json
appsettings.Production.json
具有相同的哈希,因为它们都是空的json文件
{}
。但在生产环境中,第二个是计算出的哈希值为
YM2gjmV5…
,并发出错误


对于不同的环境,我不能有不同的构建过程,因为这不能确保从暂存和生产中使用相同的构建。我需要使用相同的docker映像,但在部署时替换文件。

我编辑了
wwwroot/service worker.published.js
文件,第一行如下所示:

//小心!在使用发布应用程序之前,请确保您了解这些注意事项
//离线支持。看见https://aka.ms/blazor-offline-considerations
self.importScripts('./service worker assets.js');
self.addEventListener('install',event=>event.waitUntil(onInstall(event));
self.addEventListener('activate',event=>event.waitUntil(onActivate(event));
self.addEventListener('fetch',event=>event.respondWith(onFetch(event));
const cachenameprifix='offline cache-';
常量cacheName=`${cacheNamePrefix}${self.assetsmifest.version}`;
常量offlineAssetsInclude=[/\.dll$/,/\.pdb$/,/\.wasm/,/\.html/,/\.js$/,/\.json$/,/\.css$/,/\.woff$/,/\.jpe?g$/,/\.gif$/,/\.ico$/,/\.blat$/,/\.dat$/;
const offlineassetexclude=[/^service worker\.js$/];
异步函数onInstall(事件){
console.info('Service worker:Install');
//从资产清单中获取并缓存所有匹配项
const assetsRequests=self.assetsManifest.assets
.filter(asset=>offlineassetinclude.some(pattern=>pattern.test(asset.url)))
.filter(asset=>!offlineassetexclude.some(pattern=>pattern.test(asset.url)))
.map(asset=>newrequest(asset.url,{integrity:asset.hash}));
等待caches.open(cacheName).then(cache=>cache.addAll(assetsRequests));
}
...
我添加了一个模式数组,类似于
offlineAssetsInclude
offlineassetexclude
来指示要跳过完整性检查的文件

。。。
常量offlineAssetsInclude=[/\.dll$/,/\.pdb$/,/\.wasm/,/\.html/,/\.js$/,/\.json$/,/\.css$/,/\.woff$/,/\.jpe?g$/,/\.gif$/,/\.ico$/,/\.blat$/,/\.dat$/;
const offlineassetexclude=[/^service worker\.js$/];
const integrityExclude=[/^appsettings\.Production\.json$/];//OfflineAssetInclude.some(pattern=>pattern.test(asset.url)))
.filter(asset=>!offlineassetexclude.some(pattern=>pattern.test(asset.url)))
.map(资产=>{
//新代码的开始
常量完整性=
integrityExclude.some(pattern=>pattern.test(asset.url))
无效的
:asset.hash;
返回!!完整性
?新请求(asset.url,{integrity})
:新请求(asset.url);