【发布时间】:2021-10-21 06:57:03
【问题描述】:
背景
我正在编写一个.NET 5 应用程序并使用 .net 用户密码作为我的密钥(数据库连接和密码)。
最近我决定学习Dockers 并更新我的应用程序以使用它,以便使用Visual Studio 为我的API 项目生成一个docker 文件,然后创建一个包含@ 的docker-compose 文件987654327@ 项目和数据库(以及与此问题无关的一些内容)。
几乎一切都运行良好。从技术上讲,我可以对这些秘密进行硬编码,然后应用程序就会运行良好。
我有一些秘密,其中大部分都可以正常工作,例如:数据库连接秘密运行良好,在 C# 代码中我执行以下代码并从 .net user-secrets 获取值:
config.GetConnectionString("Default");
代码详情
我有一个密钥,其中包含 sa 用户的 SQL 密码。
dotnet user-secrets set "SA_PASSWORD" "<MySecretPassword>"
然后我有一个 Linux 系统的 docker-compose 文件,这是代码的一部分:
sql_in_dc:
build:
context: .
dockerfile: items/sql/sql.Dockerfile
restart: always
ports:
- "1440:1433"
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=$SA_PASSWORD
- ASPNETCORE_ENVIRONMENT=Development
- USER_SECRETS_ID=80a155b1-fb7a-44de-8788-4f5759c60ff6
volumes:
- $APPDATA/Microsoft/UserSecrets/$USER_SECRETS_ID:/root/.microsoft/usersecrets/$USER_SECRETS_ID
- $HOME/.microsoft/usersecrets/$USER_SECRETS_ID:/root/.microsoft/usersecrets/$USER_SECRETS_ID
如您所见,它调用sql.Dockerfile,即:
FROM mcr.microsoft.com/mssql/server
ARG PROJECT_DIR=/tmp/devdatabase
RUN mkdir -p $PROJECT_DIR
WORKDIR $PROJECT_DIR
COPY items/sql/InitializeDatabase.sql ./
COPY items/sql/wait-for-it.sh ./
COPY items/sql/entrypoint.sh ./
COPY items/sql/setup.sh ./
CMD ["/bin/bash", "entrypoint.sh"]
那么setup.sh就是:
# Wait for SQL Server to be started and then run the sql script
./wait-for-it.sh sql_in_dc:1433 --timeout=0 --strict -- sleep 5s && \
/opt/mssql-tools/bin/sqlcmd -S localhost -i InitializeDatabase.sql -U sa -P "$SA_PASSWORD"
问题
文件setup.sh 无法识别来自秘密文件的$SA_PASSWORD 环境变量。
如果我将docker-compose.yml 文件更改为:
- SA_PASSWORD=SomePassword
备注
- 我在 Google 中搜索了答案并尝试了很多方法,但找不到完全符合我的情况。
- 我知道可以使用
Docker Swarm作为秘密,但现在我想不使用它。我仍在学习,希望代码能正常工作,下一步将使用Docker Swarm/Kubernetes/ 等... - 我很高兴知道是否有快速的解决方案,即使它不是理想的解决方案。稍后我会改进它并使用更好的技术。
- 我写的代码我认为对于案例和相关代码应该足够了,但是如果您需要更多数据,请告诉我,我会添加它。
- 我在 GitHub 的一个推送分支的公共存储库中拥有它。如果你愿意,我可以与你分享代码。
提前非常感谢!
【问题讨论】:
-
正如您所提到的,这取决于您的环境(Docker swarm、Kubernetes)。我在生产中使用用户密码进行本地开发我在 openshift(kubernetes)中创建密码并将它们映射到集群中的环境变量
-
@kraego 是的。对于地方发展的问题。它无法识别
SA_PASSWORD的用户机密。也许我做得不对。
标签: sql-server .net-core docker-compose visual-studio-2019 user-secret