首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Docker组合似乎不读取env文件中定义的env变量。

Docker组合似乎不读取env文件中定义的env变量。
EN

Stack Overflow用户
提问于 2021-06-03 10:51:59
回答 3查看 4K关注 0票数 5

我有以下项目目录结构:

代码语言:javascript
运行
复制
myapp/
    docker/
        docker-compose.yml
    .env
    src/
        <my source code here>
    config.properties

这是我的.env文件:

代码语言:javascript
运行
复制
ENV=local
SERVICE_DB_HOST=0.0.0.0
SERVICE_DB_PORT=3306
SERVICE_DB_ROOT_PASSWORD=12345
SERVICE_DB_APP_USER=my-service-user
SERVICE_DB_APP_PASSWORD=23456

这是我的docker/docker-compose.yml

代码语言:javascript
运行
复制
version: "3.7"
services:
  myapp-main-db:
    env_file:
      - ../.env
    image: mysql:8
    container_name: myapp-main-db
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - $SERVICE_DB_PORT:$SERVICE_DB_PORT
    environment:
      MYSQL_ROOT_PASSWORD: $SERVICE_DB_ROOT_PASSWORD
      MYSQL_DATABASE: myapp_service_db_$ENV
      MYSQL_USER: $SERVICE_DB_APP_USER
      MYSQL_PASSWORD: $SERVICE_DB_APP_PASSWORD
    volumes:
      - myapp-service-db-data:/var/lib/mysql
volumes:
  myapp-service-db-data:

当我从项目根目录运行docker-compose -f docker/docker-compose.yml up -d时,我看到MySQL容器在没有问题的情况下旋转,并通过docker ps验证它的运行情况。

然而,我无法使用预期的连接字符串和凭据连接到它,我确信是正确的。这使我相信Docker并没有像我期望的那样加载../.env文件,因此../.env中定义的变量中没有一个被注入为env。

有人能发现我要出错的地方吗?

更新

当我运行docker-compose config时,我得到:

代码语言:javascript
运行
复制
$ docker-compose config
WARNING: The SERVICE_DB_PORT variable is not set. Defaulting to a blank string.
WARNING: The SERVICE_DB_ROOT_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The ENV variable is not set. Defaulting to a blank string.
WARNING: The SERVICE_DB_APP_USER variable is not set. Defaulting to a blank string.
WARNING: The SERVICE_DB_APP_PASSWORD variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.myapp-main-db.ports contains an invalid type, it should be a number, or an object
EN

回答 3

Stack Overflow用户

发布于 2021-06-03 11:43:11

Compose有两个单独的环境文件处理层:

  1. 当读取docker-compose.yml文件时,它从与docker-compose.yml相同的目录中读取.env文件,并使用该文件扩展$VARIABLE引用。
  2. 当单个容器启动时,它读取env_file:并使用它来设置容器中的环境变量。

由于.env不在与docker-compose.yml文件相同的目录中,所以在文件中展开变量之前,Compose不会读取它。这将导致容器获取数据库凭据的空字符串,并导致错误,因为ports:格式错误。

您可以将.env移动到与docker-compose.yml相同的目录中。

代码语言:javascript
运行
复制
mv .env docker
docker-compose -f docker/docker-compose.yml up

或者传递一个docker-compose --env-file选项

代码语言:javascript
运行
复制
docker-compose -f docker-docker-compose.yml --env-file .env up

对于这种特殊用途,您不需要在env_file:文件中使用docker-compose.yml,并且可以删除它。

为了进一步调试这一点,您可以使用备用的docker-compose run来对容器进行command:调试。例如,您可以使用docker-compose run myapp-main-db env打印它的环境,而不是启动数据库。我希望你在这里看到的流程是:

  1. Compose读取docker/.env (来自与docker-compose.yml文件相同的目录),这是不存在的
  2. 编写替换文件中的变量;我希望看到MYSQL_USER是一个空字符串
  3. Compose读取env_file:;容器将具有来自该文件的附加环境变量SERVICE_DB_APP_USER=my-service-user
票数 3
EN

Stack Overflow用户

发布于 2021-06-03 11:12:20

根据docker的默认行为,Dockerfile和docker-组合不会从父目录读取任何文件或值。它总是从当前目录或子目录读取。

因此,对于您的代码,我建议您在源目录/根目录中使用docker-组合文件。

示例:

代码语言:javascript
运行
复制
myapp/
    docker-compose.yml
    .env
    src/
        <my source code here>
    config.properties
票数 2
EN

Stack Overflow用户

发布于 2021-06-03 11:45:17

引用来自正式的码头文档:使用“-env-file”选项

您可以在任何地方使用.env文件,使用--env-file选项: 通过将文件作为参数传递,您可以将其存储在任何地方,并将其命名为适当的名称,例如.env.ci、.env.dev、.env.prod。传递文件路径是使用--env-file选项完成的: docker-组合--env-file ./config/.env.dev up

显然,当您在docker-组合中时,不能转到当前目录的父目录来获取.env文件,因此,不像这样:

代码语言:javascript
运行
复制
version: "3.7"
services:
  myapp-main-db:
    env_file:
      - ../.env

使用来自父文件夹的其他地方的.env文件的一种方法是使用docker-compose命令的--project-directory参数。根据正式码头医生

.env文件路径如下: 从+v1.28开始,.env文件放在项目目录的底部 对于以前的版本,它被放置在当前工作目录中,其中Docker命令执行,除非定义了一个-project-目录,该目录覆盖.env文件的路径。这种不一致性在+v1.28中是通过将filepath限制在项目目录下来解决的。。“

这就意味着在你的情况下:

代码语言:javascript
运行
复制
docker-compose --project-directory .. up

或者:如果您将系统中的任何.env文件作为docker-compose命令的--env-file参数传递,则可以访问它。

代码语言:javascript
运行
复制
docker-compose --env-file ../.env up

如果既不使用--project-directory也不使用--env-file,则需要将.env文件放置在停靠器-复合文件所在的位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67820106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档