docker - NLog config 设置来自 docker run 参数的连接字符串
问题描述
我有一个需要在 Docker 容器中运行的 .NET Core api 项目。该项目使用 NLog 将数据记录到数据库中。我想在运行容器时在 nlog.config 文件中设置连接字符串属性。
该应用程序将部署到不同的客户端,并将使用它们的数据库进行日志记录。
这就是我尝试在 nlog.config 文件中配置连接字符串的方式:
...
<target name="database" xsi:type="Database">
<connectionString>'${environment:logs_connection_string}'</connectionString>
<dbProvider>MySql.Data.MySqlClient.MySqlConnection, MySql.Data</dbProvider>
...
这是我的 Dockerfile:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["Service/Service.csproj", "Service/"]
COPY ["Extensions/CustomExtensions.csproj", "Extensions/"]
RUN dotnet restore "Service/Service.csproj"
COPY . .
WORKDIR "/src/Service"
RUN dotnet build "Service.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Service.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Service.dll"]
ARG log_connection
ENV logs_connection_string=$log_connection
这些是我在运行时传递连接字符串的一些尝试:
- docker run -e log_connection="connection_string" -itd -p 1234:80 --name service service
- docker run -e log_connection_string="connection_string" -itd -p 1234:80 --name service service
我没有太多使用 Docker 的经验,所以这种方法甚至可能不可行。我愿意接受任何建议。
解决方案
既不是ARG
也不ENV
是为了你想要完成的事情。
您需要的是某种入口点脚本,它将读取您在运行命令(log_connection
或log_connection_string
在您的示例中)设置的环境变量,对错误做出反应或将其设置为默认值(如果未设置),最后编辑nlog.config
和设置的值 <connectionString>
到变量的值,最后运行dotnet Service.dll
。
例如,您可以nlog.config
像这样设置您的连接事物:
<connectionString>log_connection_string</connectionString>
然后创建run.ps1
内容如下的文件:
#!/opt/microsoft/powershell/7/pwsh
if (-not (Test-Path env:log_connection_string)) { $env:log_connection_string = 'default value for log_connection_string' }
((Get-Content -Path path\to\nlog.config -Raw) -replace 'log_connection_string',$Env:log_connection_string) | Set-Content -Path path\to\nlog.config
dotnet Service.dll
/app
在图像构建期间将其复制到目录
并将 Dockerfile 的最后三行替换为:
ENTRYPOINT ["./run.ps1"]
编辑:要在基础映像中安装 Powershell Core,请在 Dockerfile 中使用以下命令(FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
最好在下面):
RUN curl https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb --output packages-microsoft-prod.deb --silent && \
dpkg -i packages-microsoft-prod.deb && \
rm packages-microsoft-prod.deb && \
apt-get update && \
apt-get install -y powershell && \
apt-get clean
您还需要使run.ps1
可执行文件或将入口点更改为:
ENTRYPOINT ["/opt/microsoft/powershell/7/pwsh", "-Command","./run.ps1`enter code here`"]
或者,您可以在 Bash 中使用等效脚本(让我们将其命名run.sh
):
#!/bin/bash
[[ -z "$log_connection_string" ]] && export log_connection_string="default value for log_connection_string"
sed -i 's/log_connection_string/'"$log_connection_string"'/' path\to\nlog.config
dotnet Service.dll
入口点应设置为:
ENTRYPOINT ["/bin/bash", "-c", "./run.sh"]
最后一点:没有法律禁止使用小写的环境变量名称,但普遍接受的约定是全部大写,例如。LOG_CONNECTION_STRING
而不是log_connection_string
.
推荐阅读
- matlab - Matlab:数据点的加权平均值
- r - 计算R中不同步骤的开始和结束时间的差异
- java - 应用程序被杀死时的Android推送通知
- excel - Excel:在数据透视表上打印所有过滤器
- apache - 如何为 HTTPS 休息调用配置骆驼休息 dsl 生产者
- html - 内部带有 div 的链接的自定义焦点大纲
- python - 如果网站因 robots.txt 而无法抓取,则获取响应
- postgresql - 使用 flyway、Access FE 和 Postgresql BE 跟踪 DDL 和 DML 更改
- java - 如何使用 Apache POI 将 .ppt 文件转换为 html?
- r - 计算 R 中 2 个日期时间 ("%Y-%m-%dT%H:%M:%OS-05:00") 列之间经过的时间