当前位置: 首页 > 知识库问答 >
问题:

DockerFile:有没有办法从.env文件中读取变量

邹博明
2023-03-14

我想读取Dockerfile中的port变量,该变量在.env文件中定义。有什么办法可以做到这一点吗?

这是我的DockerFile:

FROM node:11-alpine

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

ENV PORT=3000

COPY . .

RUN npm install

EXPOSE 3000

CMD ["npm", "run", "start"]

共有1个答案

端木狐若
2023-03-14

已更新

在一次聊天中讨论后,我们意识到nodejs应用程序容器没有问题,问题来自错误配置的nginx代理。

下一个docker-compose文件就是nodejs应用程序正常运行的证明。

version: "3"
services:
    api:
        build: .
    curl:
        image: curlimages/curl:7.70.0
        depends_on:
          - api
        entrypoint: ""
        command: curl -si --retry 5 --retry-delay 5 --retry-max-time 40 http://api:6000
        restart: on-failure
docker build --build-arg APP_PORT=3000
FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ARG APP_PORT=80
EXPOSE ${APP_PORT}

COPY . .
RUN APP_PORT=${APP_PORT} npm install

CMD APP_PORT=${APP_PORT} npm run start

无论如何,如果您在expose中有不同的端口,并且您的应用程序监听--它不会破坏任何东西,那么应用程序的端口将在您想要的端口上可用,尽管它没有在expose中指定。

您甚至可以跳过文件中的expose,因为它更像是映像的元数据信息,而不是系统打开端口的指令:https://docs.docker.com/engine/reference/builder/#expose

无论公开设置如何,您都可以在运行时使用-p标志重写它们。

如果您的映像在构建后是静态的(您不打算更改.env),您可以下一步执行,那么npm installnpm run start具有相同的env。您仍然可以稍后更改端口,但不会影响npm安装

FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . .
RUN export $(cat .env) && npm install 

CMD export $(cat .env) && npm run start

如果必须将cmd保留为数组,那么我们需要创建一个引导脚本

FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . .
RUN export $(cat .env) && npm install

RUN echo '#!/usr/bin/env sh' > start.sh && echo 'export $(cat .env) && npm run start ${@}' >> start.sh
CMD ["sh", "./start.sh"]
 类似资料:
  • 问题内容: 我有一个文件,称之为。 有没有一种方法可以“读取”其中的内容,并获取其中的所有类的列表作为完整的类名,包括其包,例如? 我在考虑,但是似乎找不到用于检索整个类集的方法。 问题答案: 您可以将dexlib2库用作独立库(在maven中可用),以读取dex文件并获取类列表。 请注意,类名将采用“ Ljava / lang / String;”的形式,这就是它们如何存储在dex文件(和Jav

  • 我正在做一个项目,需要遍历文件系统,从pdf中提取文本,然后扫描文本。以前,文件系统是一个N驱动器(充当本地文件系统),因此使用java文件API,我可以访问每个pdf文件。使用此方法,我将提取文本: 从这里,我可以扫描文本。 我现在需要这样做,但使用dropbox文件系统。但是,我只能找到一种方法来获取每个文件的元数据,而不是实际的文件,因此我可以提取文本。 有没有办法获取文件,以便我可以在文件

  • 我正在尝试dockerize一个基本的nodejs应用程序。我的dockerfile如下 但我总是收到同样的错误 我该怎么解决?

  • 问题内容: 我喜欢新的Java8 StreamAPI,并希望不仅将其用于一个文件。通常,我使用以下代码: 但是,如果可能的话,如何在一个流中读取两个文件呢? 问题答案: 没有任何额外的帮助程序功能或外部库,最简单的方法是: 如果尚未声明抛出受检查的异常,则可以 但是,a,我们不能这样做。有几种解决方法。一种是制作自己的版本,将其称为标准版本,然后将其作为捕获并重新抛出。另一种方法是使用抛出检查异常

  • 问题内容: 它似乎没有该属性,但是对我来说真的很有用。 问题答案: 你必须改变状态的的小部件从到 之后 进入或:

  • 问题内容: 给定一个JSON文件,: 我可以在shell中阅读using 并分别初始化变量: 有没有办法读取JSON文件中的所有键值对,然后在shell中相应地初始化所有变量? 问题答案: 您可以遍历键/值对,并用于动态创建变量名。