我有一个 .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?
}
答案 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)
用于Docker的VS Tools似乎默默地覆盖了CMD和ENTRYPOINT参数。请参阅How to pass command line when debugging docker-compose project in Visual Studio?和https://github.com/Microsoft/DockerTools/issues/75
答案 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