如果将hosts添加到daemon.json,则Windows Docker守护进程会崩溃

uinbv5nw  于 2023-08-03  发布在  Docker
关注(0)|答案(2)|浏览(162)

这是我第一次使用Docker。请注意,我在Windows上使用的是Docker Desktop和WSL 2。
我正在使用一个需要连接到docker守护进程以启动新容器的遗留软件。这个软件的设置说明说我需要设置DOCKER_OPTS='-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock'。到目前为止,我还没有找到在Windows中设置DOCKER_OPTS的方法,但将其添加到主机应该可以工作。
我遇到的问题是,当我尝试将主机添加到C:\Users\<User>\.docker\daemon.json文件(或通过ui)时,docker无法启动。我在hosts对象中添加什么并不重要,只是hosts对象会导致docker在启动时崩溃。
据我所知,这似乎是一个已知的问题,但我能找到的所有解决方案似乎都没有答案,或者是Linux而不是Windows。
我已经尝试使用-H命令,它看起来不像任何更改与命令。
如何在不导致docker崩溃的情况下向daemon.json文件添加主机,或者至少设置DOCKER_OPTS值?
Docker version 19.03.8,build afacb8b Windows Build 19041.329 WSL 2
我已经看过了。
DOCKER_OPTS do not work in config file /etc/default/docker
Unable to start docker after configuring hosts in daemon.json
Enable Remote Docker API on Windows Host - Adding daemon.json breaks docker
Change "hosts" / "-h" Docker for Windows in daemon.json
docker堆栈跟踪:

Docker.Core.DockerException:
Failed to start
   at Docker.LinuxkitDaemonStartup.<StartAsync>d__5.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.Desktop\LinuxkitDaemonStartup.cs:line 59
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.Engines.WSL2.LinuxWSL2Engine.<DoStartAsync>d__23.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\WSL2\LinuxWSL2Engine.cs:line 149
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.ApiServices.StateMachines.TaskExtensions.<WrapAsyncInCancellationException>d__0.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\TaskExtensions.cs:line 29
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:line 67
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:line 92
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.ApiServices.StateMachines.EngineStateMachine.<StartAsync>d__14.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\EngineStateMachine.cs:line 72
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.Engines.Engines.<RestartAsync>d__29.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\Engines.cs:line 274

字符串
编辑:看起来docker的默认行为是在启动时将host标志设置为默认值。如果你在配置文件中设置hosts对象,Docker会崩溃,因为当你试图设置已经存在的东西时,它会有一个对象冲突。我不知道为什么Docker这样做,但是是的,Docker正在按预期工作,根本不工作。
我使用的解决方案是linux,是的,这是正确的,不要使用windows,因为没有办法设置主机对象。在linux中,你可以在启动时清除启动配置,然后设置hosts对象,而不会出现问题。

xoshrz7s

xoshrz7s1#

我也遇到了这个问题。我目前的解决方法是转发到docker之外的端口。我在管理员命令提示符下运行以下命令:

netsh interface portproxy add v4tov4 listenport=2375 listenaddress=192.168.1.20 connectport=2375 connectaddress=127.0.0.1

字符串
它甚至在重启后仍然存在,您可以通过以下方式进行检查:

netsh interface portproxy show all


虽然这并不能修复docker在编辑主机文件时崩溃的问题,但它允许您将守护进程主机代理到不同的端口。

smdncfj3

smdncfj32#

我有一个类似的错误,当我试图启用连接到Docker服务器通过TCP。为此,我在/etc/docker/daemon. json文件中添加了一个“主机”配置,使用此配置Docker开始出现故障
经过研究,我在Docker官方文档中找到了以下信息:

"If you use a daemon.json file and also pass options to the dockerd command manually or using start-up scripts, and these options conflict, Docker fails to start with an error such as:"

字符串
Docker Doc
有了这些信息,我就能解决我的问题了。我修改了我的Docker启动命令(在我的例子中,我修改了/lib/systemd/system/docker.service文件),删除了-H参数,使命令保持如下所示:可执行文件开始=/usr/bin/文件夹ID
通过这种方式,我设法解决了我的问题,启动Docker,并启用连接到Docker服务器通过TCP!
在我的例子中,TCP连接非常重要,因为我在Windows上的WSL中运行Docker。(直接在Windows上使用Docker Desktop,即使与WSL集成,也会消耗更多的资源。)
希望这对你有帮助!

相关问题