【发布时间】: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