20

我有一个.NET Core 项目(使用 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?
}

在此处输入图像描述

4

5 回答 5

9

您可以通过ENTRYPOINT设置命令和CMD设置默认选项的组合来执行此操作。

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

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

如果你在没有命令的情况下运行容器,它会在容器启动时执行这个命令:

dotnet app.dll argument

并且该args数组将有一个条目“参数”。但是你可以传递一个命令 odocker run来覆盖CMD定义:

docker run app arg1 arg2
于 2016-10-27T08:59:34.437 回答
5

我也使用了可以由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;
        }
    }
}
于 2016-11-21T22:01:51.790 回答
1

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

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

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

于 2016-10-29T09:10:12.750 回答
0

VS Tools for Docker 似乎默默地覆盖了 CMD 和 ENTRYPOINT 参数。请参阅在 Visual Studio 中调试 docker-compose 项目时如何传递命令行?https://github.com/Microsoft/DockerTools/issues/75

于 2019-01-04T19:07:42.780 回答
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
于 2020-04-30T07:50:11.553 回答