У меня есть консольное приложение, написанное на .NET Core 2.1.1, которое я хочу запустить в сервисе Docker в Swarm.Консольное приложение требует пары входных значений, которые я хотел бы передать через переменные окружения.В настоящее время у меня есть следующий Dockerfile, который создает консольное приложение, и окончательный образ помещается в реестр.
FROM microsoft/dotnet:latest AS builder
WORKDIR /app
COPY MyApp.sln ./MyApp.sln
COPY src/MyApp.Console/*.csproj ./MyApp.Console/
COPY src/MyApp.Core/*.csproj ./MyApp.Core/
COPY src/MyApp.Infrastructure/*.csproj ./MyApp.Infrastructure/
WORKDIR /app/MyApp.Console
RUN dotnet restore MyApp.Console.csproj
WORKDIR /app/
COPY src/MyApp.Console/. ./MyApp.Console/
COPY src/MyApp.Core/. ./MyApp.Core/
COPY src/MyApp.Infrastructure/. ./MyApp.Infrastructure/
WORKDIR /app/MyApp.Console
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:runtime AS runtime
WORKDIR /app
COPY --from=builder /app/MyApp.Console/out ./
ENTRYPOINT ["dotnet", "MyApp.Console.dll"]
Я использую API Docker C # из веб-службы, которая будет загружать изображение и запускать его как службу внутри роя.
Но сейчас, для локального тестирования, я использую
docker run -i -t my.registry/my-app/my-app/my-app:latest -e "VAL1=test" -e "VAL2=test"
Но когда я вывожу значения переменных среды через
var var1 = Environment.GetEnvironmentVariable("VAL1");
System.Console.WriteLine($"Variable 1: {var1}");
Это пусто.Я также пытался использовать встроенный API-интерфейс ConfigurationBuilder, но он также не возвращает значения для этой переменной среды:
Configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
var var1 = Configuration["VAL1"];
System.Console.WriteLine($"Variable 1: {var1}");
Но он также ничего не возвращает для этой переменной.Когда я добавляю переменные окружения через Dockerfile, переменные извлекаются с помощью описанных выше подходов, но это не вариант, поскольку мне нужно, чтобы входные данные отправлялись во время выполнения, когда эти образы запускаются или добавляются в рой.
Еще одна вещь, на которую следует обратить внимание: когда я проверяю контейнер Docker, когда он работает, я вижу переменные среды в выходных данных JSON, но кажется, что консольное приложение не может их видеть.Я могу получить доступ к другим переменным среды из консольного приложения, но те, которые я добавляю в команду run, недоступны.
На данный момент я не знаю, что делать, так как множество примеровВ интернете говорят, что это должно работать.Я что-то пропустил?Можно ли извлекать переменные среды, указанные в команде запуска docker, из приложения?