Как передать параметры в основной проект.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

Другие вопросы по тегам