最近,我开始致力于Angular App的Docker化。 添加完所有必需的文件(Dockerfile,docker-compose.yml,entrypoint.sh)后,我设法成功构建了映像。
然后,我需要将环境变量传递给应用程序,以传递我不想将其既不添加到代码本身也不添加到Dockerfile的后端api url。
经过一番搜索,我关注了这篇文章
https://codinglatte.com/posts/angular/using-os-environment-variables-in-angular-with-docker/
总结一下
我创建了一个custom-webpack.config.js文件,该文件已添加到配置中
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.DefinePlugin({
$ENV: {
ENVIRONMENT: JSON.stringify(process.env.ENVIRONMENT),
SomeAPIKey: JSON.stringify(process.env.SomeAPIKey),
SomeOtherAPIKey: JSON.stringify(process.env.SomeOtherAPIKey)
}
})
]
};
我创建并导出了一个接口,其中包含要导入的变量声明
import { Env } from 'src/typing';
declare var $ENV: Env;
export const environment = {
production: true,
environment: $ENV.ENVIRONMENT,
ApiUrl:$ENV.API_URL
};
然后最后一步是将环境变量添加到Dockerfile中,例如
FROM node:10.15.0 as builder
# SET ENVIRONMENT VARIABLES
ENV ENVIRONMENT="development"
ENV API_URL="xxx"
RUN ng build --prod
即使我看到
,一切都很好ENV API_URL=x
命令在
之后RUN ng build --prod
然后未获取此值。
所以我的问题是我该如何在Dockerfile之外添加不包含此类详细信息的环境变量,并且还应解决ENV命令顺序的问题?
例如,可以在运行时传递这些变量。 例如,Asp.net核心映像可以在以下位置接收环境变量 泊坞窗运行。.
我尝试并发现,如果在构建后传递了这些env变量,则它们不会从angular应用程序接收到。
有什么想法吗?谢谢。
答案 0 :(得分:0)
如果API_URL
或RUN ng build --prod
的其他步骤未使用docker build
,则无需在Dockerfile
中指定它,只需在运行时将其传递给容器即可,如下一个:
docker run --env API_URL="xxx" --env VAR2=value2 ubuntu
您可以参考official guide,则无需关心ENV
中的Dockerfile
顺序。