amazon-web-services - AWS Elasticbeanstalk 环境变量上的 Mulicontainer Docker 环境
问题描述
我有一个在 AWS Elastic Beanstalk(引擎盖下的 ECS)上运行的多容器 docker 环境。集群中的每个实例都在运行所有容器(代理、身份验证、api、客户端、通知)。我使用 Codepipeline 和 Codebuild 作为链接到 Github 推送到主分支的 CICD。
目前为任何一项服务构建 prod 环境的流程如下所示:
PR 到 master -> 推送到 Github -> 触发 Codepipeline -> 触发 Codebuild(这里我构建、标记和推送从源代码中的 Dockerfile 创建的 docker 映像到 Elastic Container Registrary [ECR])。
将映像推送到 ECR 后,我可以更新 Elastic Beanstalk 环境以开始为该服务使用新映像。
我不明白如何将环境变量添加到每个服务中。我以前使用过 elastic beanstalk 的 environment 部分,但是当我有一个多容器环境时,它如何工作?例如,一个服务可能有DB_CONNECTION_STRING=foo
,而另一个可能有DB_CONNECTION_STRING=bar
。所以使用 elastic beanstalk 的集中环境属性部分是行不通的。
我也无法将 env 文件推送到源代码,因为它包含密码/秘密,因此我无法将其添加为构建阶段的一部分。除非我可以在 Codepipeline 中添加所有环境变量?还是我应该使用 Secrets 管理器?
这方面的最佳做法是什么?
同样重要的是要注意,所有服务的构建阶段都是相同的。
谢谢
解决方案
我使用 Github 工作流程而不是 Codebuild,但想法是一样的。我假设您可以将您的秘密存储在 AWS 中并在构建期间访问它们(如在 github 工作流程中)
我们所做的:
在 Github 工作流 yml 文件中:
jobs:
deploy:
name: some job name
runs-on: ubuntu-latest
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
ACCESS_TOKEN_SECRET: ${{ secrets.ACCESS_TOKEN_SECRET }}
REFRESH_TOKEN_SECRET: ${{ secrets.REFRESH_TOKEN_SECRET }}
然后,后来工作:
- name: Build dockers
id: build-dockers
run: |
docker build --build-arg NPM_TOKEN=$NPM_TOKEN --build-arg dockerAccessTokenSecretDefault=$ACCESS_TOKEN_SECRET -t your_registry/name
码头工人文件:
FROM node:latest
ARG NPM_TOKEN
ARG dockerAccessTokenSecretDefault
ARG dockerRefreshTokenSecretDefault
ENV ACCESS_TOKEN_SECRET=$dockerAccessTokenSecretDefault
ENV REFRESH_TOKEN_SECRET=$dockerRefreshTokenSecretDefault
COPY some_folder some_docker_folder
WORKDIR some_docker_folder
RUN npm install --production
EXPOSE 3000
ENTRYPOINT [ "npm", "start" ]
您可以在 docker 文件中看到我有 ARG 和 ENV,ARG 仅在构建期间存在,但 ENV 在运行时保留在那里。
推荐阅读
- angular - 在运行时初始化值时如何从其他组件获取变量的值?
- ruby-on-rails - 在 Rails 5 上使用 webpacker 时,Travis 的必要设置是什么?
- testng - 有没有办法在 After 方法中使用 ITestResult 获取完整的错误/异常?
- python - 从 cron odoo 更新字段
- vuejs2 - 为什么 Dynamite Vue 组件在数组中自动刷新
- ios - 子类化 UICollectionViewFlowLayout - iOS 12 中的自动调整单元格框架计算问题
- apache - Apache 总是加载相同的虚拟主机
- python - WebSocket 握手期间出错:意外的响应代码:ChromeDriver 和 Selenium 的 200
- python - 使用不同的日期时间格式、datetime 和 datetime64 进行计算
- php - PHP使用Google Drive API从客户端上传大文件