泊坞窗:入口点未执行

时间:2018-07-16 15:38:17

标签: docker docker-compose dockerfile

我有以下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吗?

2 个答案:

答案 0 :(得分:2)

正在发生的情况是正在使用参数dotnet test.dll启动/bin/bash ./app/entrypoint.sh。然后,您的Test程序尝试解析这些参数并失败。这就是例外。

根据您要实现的目标,您可能必须删除CMDENTRYPOINT。如果 CMD打算接收ENTRYPOINT作为参数,您也可以交换entrypoint.shdotnet 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

阅读此堆栈溢出答案