Docker环境下Laravel Mix环境变量失效问题求助
问题原因
容器内执行脚本时,默认shell通常是sh而非宿主机的bash,不支持$(...)这种命令替换语法;或者cross-env在容器环境下无法正确传递通过shell命令生成的环境变量,导致APP_VERSION无法被正确赋值,进而MIX_APP_VERSION取不到值。
解决方案
方案1:用Node脚本替代shell命令替换
绕开shell兼容性问题,直接用Node脚本读取版本并启动mix:
- 在项目根目录新建
start-watch.js:
const { execSync } = require('child_process'); const packageJson = require('./package.json'); process.env.APP_VERSION = packageJson.version; execSync('mix watch', { stdio: 'inherit' });
- 修改package.json的scripts:
"scripts": { // ... "watch": "node start-watch.js" }
方案2:直接在React组件中导入package.json
跳过环境变量传递环节,直接读取版本:
import packageJson from '../package.json'; // 组件内使用 <div>version {packageJson.version}</div>
若生产构建时webpack报错,需在webpack.mix.js中添加配置允许导入package.json:
mix.webpackConfig({ externals: { 'package.json': JSON.stringify(require('./package.json')) } });
方案3:Docker构建时注入版本到.env
在Docker构建阶段直接将版本写入.env,后续脚本无需额外处理:
COPY . . # 把package.json版本注入到.env RUN echo "MIX_APP_VERSION=$(node -pe 'require(\"./package.json\").version')" >> .env # 执行构建命令 RUN npm run prod
内容的提问来源于stack exchange,提问作者Metaman
相关产品推荐
相关产品推荐

