[英]Failed to resolve dockerfile - no such file or directory - docker-compose.yml
[英]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.