我有以下dockerfile:
# Build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY ./entrypoint.sh ./app/
RUN chmod +x ./app/entrypoint.sh
CMD /bin/bash ./app/entrypoint.sh
ENTRYPOINT ["dotnet", "test.dll"]
,并希望entrypoint.sh正在执行。但是我得到了错误:
Unhandled Exception: System.FormatException: Value for switch '/bin/bash ./app/entrypoint.sh' is missing.
Test | at Microsoft.Extensions.Configuration.CommandLine.CommandLineConfigurationProvider.Load()
Test | at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
Test | at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
Test | at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors)
Test | at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
Test | at Test.Program.Main(String[] args) in /app/Program.cs:line 19
Identity exited with code 139
这是什么意思:开关的值丢失了,我该如何运行它?感谢您的帮助
UPDATE
请参阅此处:docker asp.net core container starting after a mysql container,以获取更多信息。对不起,类似的第二个线程。请删除该线程
更新2
这是我的入口点。
#!/bin/bash
set -e
echo -e "\nWaiting for the Database-Service..."
run_cmd="dotnet run --server.urls http://*:80"
until dotnet ef database update; do
>&2 echo "SQL Server is starting up"
sleep 1
done
>&2 echo "SQL Server is up - executing command"
exec $run_cmd
似乎dotnet ef数据库更新不起作用。所以我收到错误消息:
SQL Server is starting up
Test | Did you mean to run dotnet SDK commands? Please install dotnet SDK from:
Test | http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
那不是错误,因为找不到test.dll吗?
答案 0 :(得分:2)
正在发生的情况是正在使用参数dotnet test.dll
启动/bin/bash ./app/entrypoint.sh
。然后,您的Test
程序尝试解析这些参数并失败。这就是例外。
根据您要实现的目标,您可能必须删除CMD
或ENTRYPOINT
。如果 CMD
打算接收ENTRYPOINT
作为参数,您也可以交换entrypoint.sh
和dotnet test.dll
参数。
答案 1 :(得分:0)
因为ENTRYPOINT始终在CMD前面加上前缀,即使您更改顺序也是如此。因此启动命令变为:
dotnet test.dll /bin/bash ./app/entrypoint.sh
这当然会引发错误。因此,您应该将dockerfile更改为如下所示:
# Build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY ./entrypoint.sh ./app/
RUN chmod +x ./app/entrypoint.sh
ENTRYPOINT ["/bin/bash", "./app/entrypoint.sh"]
CMD ["dotnet", "test.dll"]
应该允许您的容器启动
这有两个原因。
从问题开始,因为已经安排了CMD和ENTRYPOINT的顺序,所以所需的命令确实是
/bin/bash ./app/entrypoint.sh dotnet test.dll
但是docker总是将ENTRYPOINT放在CMD之前,无论它们的物理排列方式如何,因此通过切换两者,我们能够获得所需的命令。请比较原始和新的dockerfile,只有一个更改。
所以这是语法问题,而不是实际的技术问题,请通过https://stackoverflow.com/a/41518225/8554496
阅读此堆栈溢出答案