Ни ARG
, ни ENV
не предназначены для того, что вы хотите выполнить. sh.
Вам нужен какой-то сценарий точки входа, который будет читать переменную среды, которую вы устанавливаете при запуске (в ваших примерах - 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`"]
В качестве альтернативы вы можете использовать эквивалент nt в 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
.