Mulicontainer Docker AWS Elasticbeanstalk 环境变量上的环境

Mulicontainer Docker Environment on AWS Elasticbeanstalk environment variables

我在 AWS Elastic Beanstalk(引擎盖下的 ECS)上有一个多容器 docker 环境 运行。集群中的每个实例都是 运行 所有容器(代理、身份验证、api、客户端、通知)。我正在使用 Codepipeline 和 Codebuild 作为链接到 Github 推送到主分支的 CICD。

为任何一项服务构建生产环境的流程当前如下所示:

PR into master -> push to Github -> triggers Codepipeline -> triggers Codebuild(这里我构建,标记,并推送一个从源代码中的 Dockerfile 创建的 docker 镜像到弹性容器注册中心 [ECR]).

将映像推送到 ECR 后,我可以更新 Elastic Beanstalk 环境以开始为该服务使用新映像。

我不明白如何将环境变量添加到每个服务中。我以前使用过 Elastic Beanstalk 的环境部分,但是当我有一个多容器环境时,它如何工作?例如,一项服务可能具有 DB_CONNECTION_STRING=foo,而另一项服务可能具有 DB_CONNECTION_STRING=bar。所以使用elastic beantalk的集中环境属性部分是行不通的。

我也无法将 env 文件推送到源代码,因为它包含 passwords/secrets,所以我无法将其添加为构建阶段的一部分。除非我可以在 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

Docker 文件:

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 在运行时保留在那里。