Как передать параметры в основной проект.net с помощью dockerfile
У меня есть проект.NET Core (с использованием Visual Studio и добавлены файлы Docker через инструменты Visual Studio для Docker).
мой DockerFile
выглядит так:
FROM microsoft/dotnet:1.0.1-core
ARG source=.
WORKDIR /app
COPY $source .
ENTRYPOINT ["dotnet", "MyApp.dll"]
CMD ["arg1", "arg2"]
У меня вопрос, как передать параметры в проект?
public static void Main(string[] args)
{
// how does `args` get populated?
}
3 ответа
Я использовал переменные окружения, которые тоже можно установить с помощью docker-compse.yml
public static class EnvironmentHelper
{
public const string EnvironmentArguments = "DOTNETCORE_ARGUMENTS";
private static string[] _arguments;
public static string[] Arguments
{
get
{
bool argumentsExist = _arguments != null && _arguments.Any();
if (!argumentsExist)
{
IDictionary environmentVariables = Environment.GetEnvironmentVariables();
if (!environmentVariables.Contains(EnvironmentArguments))
{
throw new Exception("Environment Arguments do not exist");
}
var argumentsHolder = environmentVariables[EnvironmentArguments] as string;
const char argumentSeparator = ' ';
_arguments = argumentsHolder?.Split(argumentSeparator);
}
return _arguments;
}
}
}
Вы можете сделать это с помощью комбинации ENTRYPOINT
установить команду и CMD
установить параметры по умолчанию.
Пример для приложения ASP.NET Core:
ENTRYPOINT ["dotnet", "app.dll"]
CMD ["argument"]
Если вы запустите контейнер без команды, он выполнит эту команду при запуске контейнера:
dotnet app.dll argument
И args
массив будет иметь одну запись, "аргумент". Но вы можете передать команду docker run
переопределить CMD
определение:
docker run app arg1 arg2
Ответ уже дан @Elton Stoneman, но может помочь кому-то другому, так как этот подход не работает с переменной среды docker.
Я искал способ использовать аргументы от environment variable
вместо того, чтобы передать это docker run
команда. Итак, вот мой подход
ENV ARG1=default
ENV ARG2=default
CMD ["sh", "-c", "dotnet /app/StockPods.Core.Listener.dll $ARG1 $ARG2" ]
Таким образом, будет легко запустить это на другой платформе, не беспокоясь о том, чтобы передать что-либо команде запуска докера.
Чтобы изменить это поведение
docker run -it --rm -e ARG1=newvalue -e ARG2=newvalue my_docker_image
Один из подходов заключается в чтении переменных среды. Вы не изменили бы свой Dockerfile, чтобы сделать это. Скорее, скажем, вы запустили свой контейнер следующим образом:
$ FOO="bar"
$ docker run -e FOO=$FOO devlife/myapp
Все, что вам теперь нужно выяснить, это как читать переменную среды FOO в вашем приложении dotnetcore. Я хотел бы попробовать подход, описанный здесь: ASP.NET Core переменные среды чтения
VS Инструменты для Docker, по-видимому, переопределяют аргументы CMD и ENTRYPOINT. Посмотрите, пожалуйста, Как передать командную строку при отладке проекта docker-compose в Visual Studio? и https://github.com/Microsoft/DockerTools/issues/75