如何正确处理 docker 中的 .env 文件

Kan*_*naj 13 node.js docker

我有一个节点应用程序dotenv用于跟踪环境变量。它使用.env根文件夹中的文件在运行时获取变量。问题是当我使用 docker 构建节点图像时,下面的行.env也会复制构建文件

FROM node:latest

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8000
Run Code Online (Sandbox Code Playgroud)

如果我从 dockerhub 构建和拉取图像。该文件已包含.env我在开发中使用的文件。理想情况下,我想.env为生产指定一个不同的文件。(也许在生产服务器中手动创建一个新的 .env 文件)

我尝试.env在 dockerignore 中指定文件。但 lineCOPY . /usr/src/app似乎仍然复制了 env 文件。

我不需要这样使用dotenv。我试着像下面那样指定它

version: '2'

services:
  node:
    container_name: node
    build: .
    env_file: .env
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    command: npm start
Run Code Online (Sandbox Code Playgroud)

所以我真的不需要在构建中指定一个 .env 文件夹。但这也行不通。

如何阻止COPY命令复制.env文件?

bil*_*ohi 7

有一个文件!

在 docker CLI 将上下文发送到docker守护进程之前,它会在上下文的根目录中查找名为.dockerignore的文件。如果此文件存在,CLI 会修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免不必要地将大型或敏感文件和目录发送到守护程序,并可能使用 ADD 或 COPY 将它们添加到图像中。

在您的情况下,您只需要echo .env >> .dockerignore在与 Dockerfile 相同的目录中。


Mat*_*hew -2

为什么不简单地添加以下内容?:

RUN rm /usr/src/app/.env
COPY dockerenv /usr/src/app/.env
Run Code Online (Sandbox Code Playgroud)

(此外,如果您担心 .env 数据泄漏,请注意旧的 .env 文件可能在文件系统层中可见。您可以压缩文件系统以消除此问题)。