如何在Heroku部署需挂载证书文件的公有仓库Docker镜像
在Heroku部署带证书挂载的公有Docker镜像方案
Heroku的容器运行环境不支持直接挂载本地文件卷,也无法直接使用公有镜像同时挂载外部文件,你可以通过以下两种方案解决证书注入的问题:
方案一:通过环境变量注入证书内容,启动时生成文件
利用Heroku支持设置环境变量的特性,将证书内容传入容器,启动时写入文件再启动服务:
将证书内容设置为Heroku环境变量
在本地执行命令,把证书内容直接传入环境变量:heroku config:set CERT_CONTENT="$(cat /Users/me/public.pem)" --app your-app-name推送公有镜像到Heroku并自定义启动命令
先登录Heroku容器注册表:heroku container:login推送公有镜像:
heroku container:push web --app your-app-name --image public.images.repo/my-service发布容器时指定启动命令,先把环境变量中的证书内容写入文件,再启动原服务(替换
/usr/bin/my-service为镜像实际的启动命令):heroku container:release web --app your-app-name --command 'echo "$CERT_CONTENT" > /public.pem && /usr/bin/my-service'
方案二:构建极简包装镜像,内置证书
基于公有镜像创建一个新的镜像,将证书复制进去,再通过heroku.yml部署:
创建本地Dockerfile
在本地新建目录,放入public.pem和以下Dockerfile:FROM public.images.repo/my-service COPY public.pem /public.pem ENV CERT_PATH=/public.pem创建heroku.yml配置文件
同目录下新建heroku.yml:build: docker: web: Dockerfile部署到Heroku
执行以下命令完成推送和发布:heroku container:login heroku container:push web --app your-app-name heroku container:release web --app your-app-name
方案对比
- 方案一无需构建新镜像,证书存储在环境变量中,适合证书需要频繁更新的场景,但要注意Heroku环境变量有大小限制,过大的证书可能无法使用。
- 方案二将证书打包在镜像内,启动流程更简洁,适合证书稳定的场景,但更新证书时需要重新构建并推送镜像。
内容的提问来源于stack exchange,提问作者DeLac
相关产品推荐
相关产品推荐

