繁体   English   中英

Docker compose is using the env which was built by Dockerfile, instead of using env_file located in docker-compose.yml directory because of webpack

[英]Docker compose is using the env which was built by Dockerfile, instead of using env_file located in docker-compose.yml directory because of webpack

首先我想在我的 webpack.config.prod.js 上使用我的 application.env 变量,所以我在我的 webpack 文件中这样做了。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我能够成功访问 process.env.BUILD 变量。

我的应用程序的环境有这个配置 -

在此处输入图像描述

我的 nodejs web 应用程序在本地运行良好,完全没有问题。 我想构建此应用程序的 docker 映像,需要使用 docker-compose 来创建容器。

我构建了我的 docker 图像,到目前为止一切都很好。

现在创建容器,而不是 docker 运行。 我正在使用由 docker-compose.yml 和 .env 文件组成的单独文件夹。 附上下面的截图

![在此处输入图像描述

我的 docker-compose.yml 有这个代码 -

version: '3.9'
services:     
  api:
    image: 'api:latest'
    ports:
      - '17000:17000'
    env_file:
      - .env
    volumes:
      - ./logs:/app/logs
    networks:
      - default

我的 docker-compose.env 有这个 redis 详细信息

在此处输入图像描述

我的应用程序有这个日志 -

在此处输入图像描述

我通过执行 docker-compose 启动了我的 docker 容器。 容器创建并启动并运行,但问题是

在控制台中,连接到 redis.. 后,process.env.REDIS_HOST 包含名为“localhost”的值(来自我用来构建 docker 映像的第一个环境)。 Docker compose.env 未被访问。

花了5个多小时后。 我找到了罪魁祸首,它是 webpack。 在我的初始代码中,我在 webpack 中添加了一些与环境相关的内容,对吧? 一旦我评论了这些,就进行了新的构建。 一切正常。

但我的问题是如何在 webpack 中实际使用 process.ENV,docker-compose 也需要使用其目录中的.env。

更新 -

我的 DockerFile 看起来像这样:

在此处输入图像描述

只是,它会复制包含 bundle.js 的 dist,npm start 就可以了 - pm2 运行 bundle.js。

据我所知,webpack 在构建时而不是在运行时获取.env。 这意味着它在构建映像时需要环境变量。

您在 docker-compose.yml 中传递的那个没有被使用,因为那时您的应用程序已经构建好了。 那是对的吗? 为了使用 your.env,您应该使用 docker-compose 构建映像,并将 env 变量作为构建 arguments 传递给您的 Dockerfile。

为了使用您的 docker-compose.yml 构建映像,您应该执行以下操作:

version: '3.9'
services:     
  api:
    image: 'api:latest'
    build:
      context: .
      args:
      - REDIS_HOST
      - REDIS_PORT
    ports:
      - '17000:17000'
    volumes:
      - ./logs:/app/logs

注意:上面的context指向当前文件夹。 You can change it to point to a folder where you Dockerfile (and the rest of the project is) or you can put your docker-compose.yml together with the rest of the project directly and then context stays . .

在您的Dockerfile ,您需要指定这些 arguments:

FROM node:14 as build

ARG REDIS_HOST
ARG REDIS_PORT

...

通过这些更改,您可以使用 docker-compose 构建和运行:

docker-compose up -d --build

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM