Docker合成正在使用由Dockerfile构建的env,而不是使用位于docker-compose.yml目录中的env_file,因为存在webpack

nhn9ugyo  于 2022-11-13  发布在  Webpack
关注(0)|答案(1)|浏览(170)

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

我能够成功访问process.env.BUILD变量。
我的应用程序的env具有以下配置-

我的nodejs web应用程序在本地运行良好,没有任何问题。我想建立这个应用程序的docker映像,需要使用docker-compose来创建容器。
我建立了我的 Docker 形象和一切都好到目前为止。
现在创建容器,而不是docker运行。我正在使用单独的文件夹,其中包括docker-compose.yml和.env文件。下面附上截图
x1c4d 1x指令集
我的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 up来启动我的docker容器。容器被创建并启动和运行,但问题是
在控制台中,连接到redis.. process.env后,REDIS_HOST包含名为“localhost”的值(它来自我用来构建Docker映像的第一个env)。Docker compose .env没有被访问。
在花了5个多小时后。我找到了罪魁祸首,它是webpack。在我的初始代码中,我在webpack中添加了一些env相关的东西,对吗?一旦我评论了这些,就进行了一个新的构建。一切都很好。
但我的问题是我如何在webpack中实际使用process.ENV,而且docker-compose需要使用其目录中的.env。

已更新-
我的DockerFile看起来像这样:

只是,它将复制包含bundle.js的dist,npm启动将执行- pm2运行bundle.js。

6l7fqoea

6l7fqoea1#

据我所知,webpack是在构建时而不是运行时获取.env的,这意味着它在构建映像时需要环境变量。
你在docker-compose.yml中传递的那个变量没有被使用,因为那时你的应用程序已经被构建了。对吗?为了使用你的.env,你应该用docker-compose. yml构建图像,并把env变量作为构建参数传递给你的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指向当前文件夹。您可以将其更改为指向您的Dockerfile(以及项目的其余部分)所在的文件夹,或者您可以直接将您的docker-compose.yml与项目的其余部分放在一起,这样context就保持为.
在您的Dockerfile中,您需要指定以下参数:

FROM node:14 as build

ARG REDIS_HOST
ARG REDIS_PORT

...

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

docker-compose up -d --build

相关问题