我有一个。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?
}
我也使用了可以由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
一种方法是读取环境变量。您不会修改Dockerfile来执行此操作。而是说您按如下方式运行容器:
$ FOO="bar"
$ docker run -e FOO=$FOO devlife/myapp
现在您需要弄清楚的是如何在dotnetcore应用程序中读取FOO环境变量。我会尝试此处记录的方法:ASP .NET Core read environment variables
VS用于Docker的工具似乎悄无声息地覆盖了CMD和ENTRYPOINT参数。请参阅How to pass command line when debugging docker-compose project in Visual Studio?和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 run命令。
要覆盖此行为
docker run -it --rm -e ARG1=newvalue -e ARG2=newvalue my_docker_image