首页 > 解决方案 > 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 管理器?

这方面的最佳做法是什么?

同样重要的是要注意,所有服务的构建阶段都是相同的。

谢谢

标签: amazon-web-servicesdockercontinuous-integrationenvironment-variablesdockerfile

解决方案


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


推荐阅读