我的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中。
1条答案
按热度按时间vnjpjtjt1#
您不能将cdk中声明的环境变量与
addEnvironment
一起用作dockerfile中ENV
声明的组件。这是因为ENV
命令在 * 构建时 * 执行,而CDK提供的环境变量(实际上在任务定义中)仅在 * 运行时 * 可用,而在构建时不可用。要解决这个问题,可能有两种方法:
1.在cdk应用程序中设置整个变量,或者
1.使用入口点在运行时形成
DATABASE_URL
。然后在您的dockerfile中,执行以下操作:
这样,您将在运行时创建变量,此时所有其他变量都可用。
此外,您不应该使用
addEnvironment
作为机密。否则,您将以明文形式暴露任务定义中的敏感数据。创建容器时,请使用secrets
参数从AWS机密管理器或S3添加机密。