如何使用 dockerfile 将参数传递给 .NET Core 项目
How to pass parameters to a .NET core project with dockerfile
我有一个 .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?
}
您可以结合使用 ENTRYPOINT
设置命令和 CMD
设置默认选项。
例如,对于 ASP.NET 核心应用程序:
ENTRYPOINT ["dotnet", "app.dll"]
CMD ["argument"]
如果你运行没有命令的容器,它会在容器启动时执行这个命令:
dotnet app.dll argument
并且 args
数组将有一个条目,"argument"。但是您可以通过命令 o docker run
来覆盖 CMD
定义:
docker run app arg1 arg2
一种方法是读入环境变量。您不会修改 Dockerfile 来执行此操作。相反,假设您 运行 按如下方式设置您的容器:
$ FOO="bar"
$ docker run -e FOO=$FOO devlife/myapp
您现在需要弄清楚的是如何在您的 dotnetcore 应用程序中读取 FOO 环境变量。我会尝试此处记录的方法:
我使用了可以通过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;
}
}
}
Docker 的 VS 工具似乎默默地覆盖了 CMD 和 ENTRYPOINT 参数。请参阅 How to pass command line when debugging docker-compose project in Visual Studio? and https://github.com/Microsoft/DockerTools/issues/75
@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 运行 命令。
覆盖此行为
docker run -it --rm -e ARG1=newvalue -e ARG2=newvalue my_docker_image
我有一个 .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?
}
您可以结合使用 ENTRYPOINT
设置命令和 CMD
设置默认选项。
例如,对于 ASP.NET 核心应用程序:
ENTRYPOINT ["dotnet", "app.dll"]
CMD ["argument"]
如果你运行没有命令的容器,它会在容器启动时执行这个命令:
dotnet app.dll argument
并且 args
数组将有一个条目,"argument"。但是您可以通过命令 o docker run
来覆盖 CMD
定义:
docker run app arg1 arg2
一种方法是读入环境变量。您不会修改 Dockerfile 来执行此操作。相反,假设您 运行 按如下方式设置您的容器:
$ FOO="bar"
$ docker run -e FOO=$FOO devlife/myapp
您现在需要弄清楚的是如何在您的 dotnetcore 应用程序中读取 FOO 环境变量。我会尝试此处记录的方法:
我使用了可以通过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;
}
}
}
Docker 的 VS 工具似乎默默地覆盖了 CMD 和 ENTRYPOINT 参数。请参阅 How to pass command line when debugging docker-compose project in Visual Studio? and https://github.com/Microsoft/DockerTools/issues/75
@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 运行 命令。
覆盖此行为
docker run -it --rm -e ARG1=newvalue -e ARG2=newvalue my_docker_image