【问题标题】:Docker compose refuses to apply environment variablesDocker compose 拒绝应用环境变量
【发布时间】:2022-08-11 08:12:13
【问题描述】:

更新
看来问题与 Dockerfile 中的 RUN 命令特别相关。如果我删除它,构建工作正常并且环境变量显然被拾取,因为密码被应用并且我可以使用它进行连接。不知道为什么在 RUN 命令中登录失败,我见过很多使用类似代码的示例。

我正在开发一个非常基本的 docker compose 文件来为应用程序设置开发环境,我从数据库服务器开始,它是 MS SQL。这是 docker-compose.yml 文件的样子:

version: \'3.8\'

services:
  mssql:
    build:
      context: .
      dockerfile: docker/mssql/Dockerfile
    ports:
      - \'1434:1433\'
    environment:
      ACCEPT_EULA: \"Y\"
      SA_PASSWORD: \"YourStrong!Passw0rd\"
    volumes:
      - mssql-data:/var/opt/mssql

正如您从我的 dockerfile 路径中看到的那样,它位于子路径中,如下所示:

FROM mcr.microsoft.com/mssql/server:2019-latest

COPY ./docker/mssql/TESTDB.bak /var/opt/mssql/backup/TESTDB.bak

RUN ( /opt/mssql/bin/sqlservr --accept-eula & ) | grep -q \"Service Broker manager has started\" && /opt/mssql-tools/bin/sqlcmd -S localhost,1433 -U SA -P \"YourStrong!Passw0rd\" -Q \'RESTORE DATABASE TESTDB FROM DISK = \"/var/opt/mssql/backup/TESTDB.bak\" WITH MOVE \"TESTDB_Data\" to \"/var/opt/mssql/data/TESTDB.mdf\", MOVE \"TESTDB_Log\" to \"/var/opt/mssql/data/TESTDB_log.ldf\"\'

(是的,我意识到 RUN 命令中的密码是多余的,我之前曾尝试在那里使用一个变量,但由于它不起作用,我对其进行了硬编码。)

当我跑步时码头工人组成 -d,我总是得到这个错误:用户 \'SA\' 登录失败

我浪费了太多时间以为密码实际上有问题,直到我意识到如果我直接在 Dockerfile 中添加环境变量,它就可以工作。所以在我的 Dockerfile 中,在 RUN 命令上方,我可以这样做:

ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=YourStrong!Passw0rd

所以我得出结论,我的环境变量根本没有被读取。我尝试使用引号,不带引号,使用env_file相反,似乎没有任何效果。我也尝试了以下格式,没有运气:

environment
  - ACCEPT_EULA=Y
  - SA_PASSWORD=YourStrong!Passw0rd

我还尝试使用 MSSQL_SA_PASSWORD 而不是 SA_PASSWORD,并且两者都在其中。我认为这不太可能是问题,尽管 SA_PASSWORD 工作正常。最后,我尝试使用 2017 年的图像,以防它是特定于图像的,但这也不起作用。

我假设它一定是我错过的一些愚蠢的东西。我看到很多关于 .env 在根目录中的不同的讨论,但是如果我理解正确,当他们尝试在他们的 docker-compose.yml 文件中使用环境值时,人们会出错,这不是我正在做的这里。所以我准备好在这件事上失去理智了,因为这似乎是一件简单、基本的事情。

    标签: docker docker-compose dockerfile


    【解决方案1】:

    这很好混淆。 . .因为yaml。

    当你写:

    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: "YourStrong!Passw0rd"
    

    您正在创建名为 ACCEPT_EULA 的键,其值为“Y”,“SA_PASSWORD”具有相应的值。

    docker-compose 将忽略这些,它将适用的是字符串列表好像它们作为参数传递给 -e。

    所以:

    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=YourStrong!Passw0rd
    

    这有点微妙,但请查看文档中的此部分:

    https://docs.docker.com/compose/environment-variables/#set-environment-variables-in-containers

    此外,我认为您将 Dockerfile 中的 ENV 语句与设置的环境变量混淆了跑步一个图像。关键仍然在文档的细节中。它指出它们与说 docker 相同跑-e,不是 docker build。

    导致更多混乱的原因是,当您使用 ENV 时,您正在为稍后运行图像时设置默认值:

    https://docs.docker.com/engine/reference/builder/#env

    如果您还没有,我非常建议您在继续编写之前熟悉使用 docker run 和 docker build 构建和运行您的映像,这样就不会那么混乱了。

    【讨论】:

    • 我相信这是我尝试的第一种格式,但它也不起作用。我明天再试一次以确保。
    • 它不是。看看你的卷部分,我认为它工作正常吗? Volumes 是一个字符串列表,格式与您传递给 -v 的格式相同。 Environment 是您将传递给 -e 格式的字符串列表。
    • 我的意思是我也尝试了你提到的格式,但没有奏效。今天早上再次尝试确认它没有解决问题。我已经用我尝试过的一些额外的东西(不同的图像,使用 MSSQL_SA_PASSWORD)更新了我的答案。
    • 哦,我想我看到了你对更新的困惑。 Dockerfile 中的 ENV 是一个使用的变量,而建造使用 docker 构建。 docker-compose 传入的环境变量在运行已构建的映像时就在那里。关键仍然是文档中的那一步,它们被传递到码头工人运行 -e不要码头建设。
    • 你说的很对,我终于弄明白了。我已经阅读了这些文档,我以为我已经理解了它们,但结果发现还有另一层让我感到困惑。现在已经更新为在 docker compose 文件中使用 build > args ,然后在我的根目录中创建了一个 .env 文件来填充它。然后我可以访问 Dockerfile 中的 args 值,一切正常。结果证明我的主题是错误的,环境变量工作正常。你的答案是最准确的,所以我给你答案。再次感谢!
    【解决方案2】:

    在您的 docker-compose.yml 中,您是否尝试过:

      - ACCEPT_EULA=Y
      - SA_PASSWORD=YourStrong!Passw0rd
    

    【讨论】:

    • 我相信这是我尝试的第一种格式,但它也不起作用。我明天再试一次以确保。
    • 我已经确认这并不能解决我的问题。
    【解决方案3】:

    上面的两个回答都很好,还有一些事情:

    SA_PASSWORD已弃用改为使用 MSSQL_SA_PASSWORD

    用变量定义 .env 文件总是很好的,例如:

    sapassword.env

    MSSQL_SA_PASSWORD=YourStrong!Passw0rd
    

    sqlserver.env

    ACCEPT_EULA=Y
    MSSQL_DATA_DIR=/var/opt/sqlserver/data
    MSSQL_LOG_DIR=/var/opt/sqlserver/log
    MSSQL_BACKUP_DIR=/var/opt/sqlserver/backup
    

    在 docker-compose.yml 实例中,env 文件以下列方式:

    environment:
          - sqlserver.env
          - sapassword.env
    

    【讨论】:

    • @jvmcollaborator 您不会为此使用 env_file 而不是环境吗?我确实尝试过,事实上这是我的偏好,在 env_file 无法工作后我转移到环境。
    猜你喜欢
    • 2015-06-17
    • 2019-07-26
    • 1970-01-01
    • 2022-01-01
    • 2018-02-03
    • 2019-02-25
    • 2022-06-11
    • 2021-08-15
    • 2021-09-02
    相关资源
    最近更新 更多