docker aws-cdk:通过Ec2 TaskDefinition将ENV传递给NextJS应用程序

hrirmatl  于 2023-01-04  发布在  Docker
关注(0)|答案(1)|浏览(120)

我的node.js应用程序需要creds和一个数据库端点。我使用cdk和Ec2 TaskDefinition部署应用程序。使用ECS.ContainerDefinition.addEnvironment(...),我将env传递到Docker容器。Dockerfile具有多级类型,在最后一个阶段,我将所有必需的env收集到一个字符串中,以便将来在NextJS应用程序中使用。

FROM --platform=linux/amd64 node:16-alpine AS deps
#Skiped code
#....
FROM --platform=linux/amd64 node:16-alpine AS runner

ENV DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_ENDPOINT}/postgres?schema=public

EXPOSE 8081
CMD ["node_modules/.bin/next", "start", "-p", "8081"]

但在下一个应用程序中,我得到的不是正确格式的字符串:
postgresql://:@/postgres?架构=公共
所有的ENV都是空的。但是我可以在亚马逊的任务定义网页界面中看到所有需要的env。看起来我需要把它们转移到Docker中。

vnjpjtjt

vnjpjtjt1#

您不能将cdk中声明的环境变量与addEnvironment一起用作dockerfile中ENV声明的组件。这是因为ENV命令在 * 构建时 * 执行,而CDK提供的环境变量(实际上在任务定义中)仅在 * 运行时 * 可用,而在构建时不可用。
要解决这个问题,可能有两种方法:
1.在cdk应用程序中设置整个变量,或者
1.使用入口点在运行时形成DATABASE_URL

#!/usr/bin/env sh

# /docker-entrypoint.sh

export DATABASE_URL="postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_ENDPOINT}/postgres?schema=public"

exec "$@"

然后在您的dockerfile中,执行以下操作:

# ...
FROM --platform=linux/amd64 node:16-alpine AS runner

EXPOSE 8081
COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh 

ENTRYPOINT ["/docker-entrypoint.sh"]

CMD ["node_modules/.bin/next", "start", "-p", "8081"]

这样,您将在运行时创建变量,此时所有其他变量都可用。
此外,您不应该使用addEnvironment作为机密。否则,您将以明文形式暴露任务定义中的敏感数据。创建容器时,请使用secrets参数从AWS机密管理器或S3添加机密。

相关问题