在Docker构建期间访问AWS Elastic Beanstalk的.env变量

问题描述

我正在使用AWS Elastic Beanstalk上的Docker平台部署Laravel应用程序。 Dockerfile中的步骤之一是通过运行npm run production来使用Laravel mix绑定资产,如下所示。

# Dockerfile
...
RUN echo "${ALPINE_MIRROR}/edge/main" >> /etc/apk/repositories \
  && apk add --no-cache nodejs nodejs-npm  --repository="http://dl-cdn.alpinelinux.org/alpine/edge/com@R_502_5413@y" \
  && npm install \
  && npm run production

此命令运行时,触发的步骤之一是将产生的资产复制到Amazon S3,如下所示:

mix.webpackConfig({
    plugins: [
        new s3Plugin({
            exclude: /.*\.(html|PHP|htaccess|txt|json)/,s3Options: {
                accessKeyId: process.env.AWS_ACCESS_KEY_ID,secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,region: process.env.AWS_DEFAULT_REGION,},s3UploadOptions: {
                Bucket: process.env.AWS_BUCKET,directory: 'public',})
    ]
});

如上所示,脚本需要AWS环境变量才能工作。但是,即使在Elastic Beanstalk仪表板中(在配置中)配置了构建脚本,也不会选择它们。一种快速解决方法是在Dockerfile中定义ARG变量,但我不希望此信息以纯文本显示

我试图寻找解决方案,但是我没有运气。任何建议确实会有所帮助。谢谢。

解决方法

在本指南的帮助下,我设法实现了所需的目标:

https://aws.amazon.com/blogs/security/how-to-manage-secrets-for-amazon-ec2-container-service-based-applications-by-using-amazon-s3-and-docker/

基本上:

  1. 创建存储桶以存储具有所需变量的文件。
  2. 设置存储桶策略以限制对同一VPC的访问
  3. 在Dockerfile中,执行脚本以下载该文件并加载环境变量。

谢谢!

,

如果您希望这些env变量在构建步骤中反映出来,请在相应的代码构建项目的env部分中添加它们。


如果您将ECS与Elastic beantalk一起使用,则应在任务定义环境中定义这些环境变量。