如何将环境变量从 docker-compose 传递给项目?

Posted

技术标签:

【中文标题】如何将环境变量从 docker-compose 传递给项目?【英文标题】:How to pass environment variable from docker-compose to the project? 【发布时间】:2019-06-06 15:56:18 【问题描述】:

我正在使用 AWS ECS 存储库来存储 docker 映像。

我的docker-compose.yml 文件如下所示:

version: "3"
services:
  my-front-end:
    image: myFrontEndImage:myTag
    links:
      - my-back-end
    ports:
      - "8080:8080"
    logging:
      driver: 'json-file'
      options:
        max-size: "50m"
  my-back-end:
    image: myBackEndImage:myTag
    ports:
      - "3000:3000"
    logging:
      driver: 'json-file'
      options:
        max-size: "50m"

我需要的是,能够将 docker-compose 文件中的环境变量传递到我的 docker 映像中。

我尝试的是添加环境行(在example 之后)。

version: "3"
services:
  my-front-end:
    image: myFrontEndImage:myTag
    links:
      - my-back-end
    environment:
      - BACKEND_SERVER_PORT=3001
    ports:
      - "8080:8080"
    logging:
      driver: 'json-file'
      options:
        max-size: "50m"
  my-back-end:
    image: myBackEndImage:myTag
    ports:
      - "3000:3000"
    logging:
      driver: 'json-file'
      options:
        max-size: "50m"

然后在我的项目(这是一个 VueJS 项目)中,我尝试通过 process.env.BACKEND_SERVER_PORT 访问它。但是我看不到我的价值,当我尝试console.log(process.env); 时,我发现它只有NODE_ENV: "development" 的价值。

所以我的问题是,如何将环境变量从 docker-compose 传递到我的 docker 映像,以便我能够在我的项目中使用它?

项目中的一切正常,我在这个项目上工作了很长时间,docker-compose 文件工作,只是,现在当我需要添加这个环境变量时,我不能让它工作。

编辑:根据评论中的请求添加更多文件。

my-front-end.Dockerfile 看起来像:

FROM node:8.11.1
WORKDIR /app
COPY package*.json ./
RUN npm i npm@latest -g && \
    npm install
COPY . .
CMD ["npm", "start"]

如前所述,这是一个VueJS 应用程序,这是您可能感兴趣的package.json 部分:

"scripts": 
  "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
  "start": "npm run dev",
  "build": "node build/build.js"
,

虽然 .Dockerfile 对应于 my-back-end 看起来像:

FROM node:8.11.1
WORKDIR /app/server
COPY package*.json ./
RUN npm i npm@latest -g && \
    npm install
COPY . .
CMD ["npm", "start"]

我的后端实际上是一个express.js 应用程序,它正在侦听一个单独的端口,该应用程序放置在项目根目录下的文件夹server 中。 这是package.json你可能感兴趣的部分:

"scripts": 
  "start": "nodemon src/app.js",
  "test": "echo \"Error: no test specified\" && exit 1"
,

【问题讨论】:

你能展示一下你的 VueJS 项目的 Dockerfile 吗? @AlikKhilazhev 我已经编辑了我的帖子,提供了更多详细信息 【参考方案1】:

我认为您在配置 docker-compose 方面做的一切都是正确的。似乎将环境变量传递给 VueJS 应用程序有一些细微差别。

根据对this question 的回答,您需要使用VUE_APP_* 命名变量,以便能够从客户端获取它们

【讨论】:

以上是关于如何将环境变量从 docker-compose 传递给项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何从.env文件获取环境变量到docker-compose.yml?

从 docker-compose 替换 NGINX 配置中的环境变量

docker-compose - 如何转义环境变量

如何使用来自其他目录的 docker-compose 环境变量

docker-compose环境会覆盖jar中的变量,docker环境变量和jar中的变量是如何映射的?

基于 docker-compose 环境变量将文件添加到 docker 容器