如何使用dockerfile将参数传递给.NET核心项目

时间:2016-10-26 21:23:00

标签: docker dockerfile docker-for-windows docker-desktop

我有一个 .NET 核心项目(使用visual studio并通过Visual Studio Tools for Docker添加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?
}

enter image description here

5 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分:2)

您可以使用ENTRYPOINT组合设置命令,CMD设置默认选项。

示例,对于ASP.NET Core应用程序:

ENTRYPOINT ["dotnet", "app.dll"]
CMD ["argument"]

如果在没有命令的情况下运行容器,它将在容器启动时执行此命令:

dotnet app.dll argument

args数组将有一个条目,“参数”。但是您可以传递命令o docker run来覆盖CMD定义:

docker run app arg1 arg2

答案 2 :(得分:0)

一种方法是读入环境变量。您不会修改Dockerfile来执行此操作。相反,假设您按如下方式运行容器:

$ FOO="bar"
$ docker run -e FOO=$FOO devlife/myapp

您现在需要弄清楚的是如何在dotnetcore应用程序中读取FOO环境变量。我会尝试这里记录的方法:ASP .NET Core read environment variables

答案 3 :(得分:0)

答案 4 :(得分:0)

@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命令。

要忽略此行为

docker run -it --rm -e ARG1=newvalue -e ARG2=newvalue my_docker_image