我不确定自己在做什么错。 console.log显示undefined
。 Makefile
,config.env
,webpack.config.js
和package.json
都位于项目的根目录。
Makefile:
docker-run: docker
docker run -it --env-file config.env -p "80:80" app
config.env
API_KEY=https://test.com
webpack.config.js
plugins: [
new webpack.DefinePlugin({
BASE_URL: JSON.stringify('https://myapp.firebaseio.com'),
'process.env.API_KEY': JSON.stringify(process.env.API_KEY)
})
]
App.js
const App = () => {
useEffect(() => {
console.log(process.env.API_KEY);//undefined
console.log(process.env.BASE_URL);//undefined
console.log(BASE_URL);//undefined
}, []);
return (
<></>
);
};
Package.json(npm run docker
)
"scripts": {
"start": "rm -rf dist && webpack-dev-server --mode development --open --hot --port 8090",
"docker": "rm -rf dist && webpack --mode production && make docker-run"
},
答案 0 :(得分:0)
我在这里看到的一个错误是,您正在docker之外构建项目,并将构件(构建后)推送到docker来为Webapp服务。
根据DefinePlugin
的文档
https://webpack.js.org/plugins/define-plugin/
DefinePlugin允许您创建全局常量,该常量可以是 在编译时配置
这意味着,如果您有一个像下面这样的App.js
组件
import React from 'react';
function App() {
return (
<div>
<p>[process.env.test] = {process.env.test}</p>
<p>[process.env.NODE_ENV] = {process.env.NODE_ENV}</p>
</div>
);
}
export default App;
和webpack配置
new webpack.DefinePlugin({"process.env.test": JSON.stringify(process.env.test)})
运行NODE_ENV=production test="A test variable" npm run build
之后(如果使用create-react-app引导,则内部运行webpack --mode production
)
该组件将被编译为(仅粘贴webpack编译代码的相关部分)。
var i = function() {
return a.a.createElement(
"div",
null,
a.a.createElement(
"p",
null,
"[process.env.test] = ",
"A test variable"
),
a.a.createElement(
"p",
null,
"[process.env.NODE_ENV] = ",
"production"
)
);
}
此处在编译时将{process.env.test}
和{process.env.NODE_ENV}
替换为A test variable
和production
。。
在构建后在服务器上设置任何环境变量都不会影响编译的文件。
而且由于在已编译的代码中直接注入了env变量,因此您不应使用它来存储机密信息(秘密/专用令牌,密码,内部服务器的IP地址等)。 < / p>
因此,您最初的问题的解决方案可能是在docker容器内构建工件。下面是一个示例Docker文件。
FROM node:10 as react-app
# Create app directory
WORKDIR /usr/src/app
# Set a temporary variable
ENV test="Hello Docker"
COPY . .
RUN npm install
RUN npm run build
FROM nginx:1.12-alpine
COPY --from=react-app /usr/src/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
如果需要参考,请参阅示例git repo。