如何在 Docker 中创建 .env 文件

Ada*_*Hey 9 docker google-cloud-platform asp.net-core

我对 Docker 和 .Net Core 还很陌生(多年来一直使用 .Net Framework)。

我创建了一个新的 .Net Core 3 应用程序并将其设置为使用 Docker,然后该应用程序将构建并运行。到目前为止,一切都很好。此应用程序需要连接到 GoogleBigQuery,因此需要将 Google Cloud 凭据存储在环境变量中(花了一个令人沮丧的小时才意识到 Docker 不使用 Windows 环境变量)。

根据我一直 阅读的内容,我只需将它们添加到 .env 文件中,但我的项目目录中没有。

我尝试使用命令行来设置它们,docker run containername:dev --env VAR1=value1但出现以下错误:

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:367:启动容器进程导致:exec:“-e”:在 $PATH 中找不到可执行文件:未知。

我还看到了对该docker-compose.yml文件的引用。

我尝试创建 .env 文件并尝试(未成功)使用 CLI 将其与容器关联,如下所示:

docker run -i containername:dev --env-file .env
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "--env-file": executable file not found in $PATH: unknown.
Run Code Online (Sandbox Code Playgroud)

所以我不知道从这里该去哪里。我读过的所有内容似乎都假设您已经有一个 .env,并且我找不到有关手动创建 .env 的任何内容。我确实创建了一个 docker-compose.yml 文件,我希望 Docker 能够识别该文件并随后找到 .env:

version: '3.5'

services:
  fms-techmobile-utilities:
    build:
      context: .
      dockerfile: Local.Dockerfile
    image: foo
    container_name: foo
    restart: unless-stopped
    env_file:
      - .env
Run Code Online (Sandbox Code Playgroud)

上面的方法不起作用,所以我真的不知道还能尝试什么。我确实尝试停止并重新启动 Docker 容器,希望它能找到 yml 和 env 文件,但没有

小智 7

docker run containername:dev --env VAR1=value1
正在将命令传递到containername:dev 并要求它运行它。

将命令的顺序更改为:
docker run -e VAR1-value1 containername:dev
将要求 Docker 运行命令并将值传递到容器中。

要使用环境文件,请将 替换-e--env-file ./filename. 例如:
docker run --env-file ./my_env containername:dev

这假设该文件my_env位于您运行命令的目录中。


Chr*_*jen 6

无需 Docker 撰写

Docker 容器不知道主机系统上的环境变量。要在容器中设置环境变量,您必须指定它:

docker run -i containername:dev -e VARNAMEINCONTAINER='value'
Run Code Online (Sandbox Code Playgroud)

为了简化这一点,您可以创建一个“env 文件”,它是一个简单的文本文件,如下所示

myenvfile

VARNAME=value
FOO=bar
Run Code Online (Sandbox Code Playgroud)

并告诉docker使用它

docker run -i containername:dev --env-file=myenvfile
Run Code Online (Sandbox Code Playgroud)

这将在您的容器中VARNAME凝固FOO

文档: https: //docs.docker.com/engine/reference/commandline/run/

Docker 组合

想象一下您需要启动多个容器。如果我们必须手动调用docker run...每个容器的所有参数,这将是一件痛苦的事情。这就是为什么我们可以使用 docker compose。

Docker compose 具有docker-compose.yml描述启动内容的文件并替换了 docker run 命令。同样,我们必须提供环境变量:

version: '3.5'

services:
  fms-techmobile-utilities:
    build:
      context: .
      dockerfile: Local.Dockerfile
    container_name: foo
    environment:
      - FOO=bar
Run Code Online (Sandbox Code Playgroud)

同样,我们经常在 docker-compose.yml 文件中多次需要环境变量,因此我们可以使用名为 .env 的文本文件来存储它们:

.env

FOO=bar
Run Code Online (Sandbox Code Playgroud)

并在 docker-compose.yml 中使用它们

web:
  environment:
    -FOO
Run Code Online (Sandbox Code Playgroud)

.env是该文件的标准名称,docker compose 将自动查找该文件。请注意,您仍然必须列出每个服务的变量名称。(= .env 中的变量名 + 值,变量名仅在 docker-compose.yml 中)

或者您应用此类文本文件中的所有变量,如下所示:

web:
  env_file:
    - web-variables.env
Run Code Online (Sandbox Code Playgroud)

(= 使文件“web-variables.env”中的所有变量在此容器中可用)

文档: https: //docs.docker.com/compose/environment-variables/


小智 1

您实际上在与撰写文件相同的位置创建了一个名为 .env 的文件。

然后您可以将 env 变量添加到 .env 文件中,例如IMAGE=foo在 compose 文件中使用以下行image: ${foo}