Ответ 1
Он работает для меня, настраивая ASPNETCORE_ENVIRONMENT
с помощью команды dotnet CoreDocker.dll --environment="X"
Попробуйте изменить dockerfile
как dockerfile
ниже:
ENTRYPOINT ["dotnet", "CoreDocker.dll", "--environment=X"]
У меня проблемы с настройкой переменной ASPNETCORE_ENVIRONMENT, выполняющей мой проект в контейнере докеров. Проблема в том, что значение всегда устанавливается/перезаписывается в "Development".
Я попытался установить переменную окружения в моем Dockerfile, используя
ENV ASPNETCORE_ENVIRONMENT test
также попытался установить переменную окружения в моем файле - файле -докере, используя
environment:
- ASPNETCORE_ENVIRONMENT=test
Когда я устанавливаю любую другую переменную среды, она работает, например:
environment:
- OTHER_TEST_VARIABLE=test
Я предполагаю, что значение переменной ASPNETCORE_ENVIRONMENT перезаписывается где-то, но мне трудно узнать, где.
Я добавил поддержку Docker к существующему проекту и выполняю проект напрямую с помощью Visual Studio Docker/Docker compose option
Проект работает на Asp Net Core 2.1
заранее спасибо
Мой launchSettings.json:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53183/",
"sslPort": 0
}
},
"profiles": {
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://localhost:{ServicePort}/api/values"
}
}
}
Я также попытался добавить конфигурацию переменной окружения в launchSettings.json
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://localhost:{ServicePort}/api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "test"
}
}
Мой веб-хостинг:
public static IWebHost BuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((builderContext,config) =>
{
config.AddEnvironmentVariables();
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
.UseStartup<Startup>()
.Build();
}
Мой docker-compose.yml
version: '3.4'
services:
api:
image: ${DOCKER_REGISTRY}api
build:
context: .
dockerfile: API/Dockerfile
environment:
- ASPNETCORE_ENVIRONMENT=test
Мой Dockerfile:
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY API/API.csproj API/
RUN dotnet restore API/API.csproj
COPY . .
WORKDIR /src/API
RUN dotnet build API.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish API.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "API.dll"]
Ниже приведен список переменных среды в контейнере
C:\Users\Administrator>docker exec -ti d6 /bin/bash
[email protected]:/app# printenv
HOSTNAME=d6f26d2ed2c3
ASPNETCORE_URLS=http://+:80
test1=asdasd
test2=dasdasd
test3=dasdasd
PWD=/app
HOME=/root
NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages
DOTNET_USE_POLLING_FILE_WATCHER=1
ASPNETCORE_VERSION=2.1.3
DOTNET_RUNNING_IN_CONTAINER=true
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ASPNETCORE_ENVIRONMENT=Development
_=/usr/bin/printenv
[email protected]:/app#
Он работает для меня, настраивая ASPNETCORE_ENVIRONMENT
с помощью команды dotnet CoreDocker.dll --environment="X"
Попробуйте изменить dockerfile
как dockerfile
ниже:
ENTRYPOINT ["dotnet", "CoreDocker.dll", "--environment=X"]
В файле docker-compose.override.yml вы должны найти что-то вроде этого:
version: '3.4'
services:
webapplication1:
environment:
- ASPNETCORE_ENVIRONMENT=Development # <==
Спасибо за ваши комментарии, я решил свою проблему. Это была моя ошибка.
Моя проблема заключалась в том, что когда я добавил Docker-Support в свой проект, у меня уже был Dockerfile, включенный в проект.
Когда VS сгенерировал файлы для поддержки Docker, появился второй файл Dockerfile, и один из Dockerfiles был переименован в "Dockerfile.original".
Я использовал "Dockerfile", видимый в проводнике решений (который каким-то образом был сопоставлен с файлом "Dockerfile.original" в файловой системе)
Кажется, что в фоновом режиме мои изменения, написанные на "Dockerfile.original", но этот файл не использовался, пока выполнялась работа docker-compose. Он использовал пустой сгенерированный файл Docker, который не был виден в проводнике решений.
Если вы используете интеграцию Docker для Visual Studio (контейнер отладки из VS), вам нужно обратить особое внимание на настройки по умолчанию.
Когда инструмент запускает отладчик с помощью команды docker run [..]
, он предоставляет аргумент -e "ASPNETCORE_ENVIRONMENT=Development"
. Вы можете перезаписать эту переменную среды в Properties/launchSettings.json
.
Несмотря на то, что я не вижу этого в введенной команде, при тестировании я также испытал другую переменную по умолчанию ASPNETCORE_URLS=http://+:80
.
Хорошей отправной точкой для чтения о VS Docker Tooling является это сообщение в блоге и официальная документация.
Когда вы используете универсальный хост в .Net-Core 3.0, вы можете столкнуться с проблемами при использовании новой универсальной переменной DOTNET_ENVIRONMENT
, поскольку тогда у вас будет две указанные среды. Это может быть трудно отладить. Итак, что мне нравится делать, так это сначала сбросить все настройки по умолчанию и начать все заново с моего Properties/launchSettings.json
:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"Docker": {
"commandName": "Docker",
"environmentVariables": {
// Overwrite default VS Docker Tools environment variables first (ASPNETCORE_ENVIRONMENT=Development; ASPNETCORE_URLS=http://+:80)
// https://www.paraesthesia.com/archive/2019/06/18/tips-on-container-tools-for-visual-studio/
"ASPNETCORE_ENVIRONMENT": "",
"ASPNETCORE_URLS": "",
"DOTNET_ENVIRONMENT": "Production",
"DOTNET_URLS": "http://+:80"
}
}
}
}