我有一个容器的问题,即使它build立完美,它不正确启动。 原因是我已经添加到Dockerfile的解决方法(有一个自我configuration的/ etc / hosts路由)
RUN mkdir -p -- /lib-override /etc-override && cp /lib/libnss_files.so.2 /lib-override ADD hosts.template /etc-override/hosts RUN perl -pi -e 's:/etc/hosts:/etc-override/hosts:g' /lib-override/libnss_files.so.2 ENV LD_LIBRARY_PATH /lib-override
显然,在那里有一些错误,但我不知道如何得到更多的信息,在运行时,docker正在做什么。 例如,这工作:
$ docker run image ls usr bin ...
但是这不是:
$ docker run image ls -l $
日志中没有任何内容,我也无法调用交互式shell。 我可以用strace来看看发生了什么,但是我希望能有更好的办法。
有什么办法可以设置docker更详细?
编辑 :感谢Andrew D.我现在知道上面的代码有什么问题(我离开了,所以他的答案可以理解)。 现在问题仍然是我怎么可能debugging这样的事情,或者为什么ls -l失败,为什么ls没有。
编辑 :-D = true可能会给更多的输出,但不是在我的情况下…
Docker events命令可能会有所帮助,即使在映像启动失败之后, Docker日志命令也可以获取日志。
首先在后台启动docker events ,看看发生了什么事情。
docker events&
然后运行失败的docker run ...命令。 那么你应该在屏幕上看到如下的内容:
2015-12-22T15:13:05.503402713+02:00 xxxxxxxacd8ca86df9eac5fd5466884c0b42a06293ccff0b5101b5987f5da07d: (from xxx/xxx:latest) die
然后,您可以从之前的消息或运行命令的输出中获取启动hexID。 那么你可以使用它的日志命令:
docker logs <copy the instance id from docker events messages on screen>
您现在应该可以看到失败映像启动的一些输出。
那么到目前为止我发现的最好的是:
#stop the current demon and start it in debug modus sudo service docker stop docker -dD
刚从一个新的shell启动客户端。 误解是认为客户端实际上做了任何事情……它只是与守护进程进行通信,所以你不想debugging客户端,而是守护进程本身(通常)。
在我的情况下, -a (附加到STDOUT / STDERR)标志就足够了:
user@machine:~$ docker start -a server_name Error: The directory named as part of the path /log/log_path/app.log does not exist. For help, use /usr/bin/supervisord -h
它显示了启动错误(在我们的例子中, supervisord使用了缺less的日志path)。 我假设大多数容器启动错误也会出现在这里。
我不能回答你如何使docker输出更完整的问题,但我可以告诉你,replace.so文件中的string就地正则expression式有点疯狂:string只有这么多的空间分配给它,如果更改其他条目的文件偏移量,则该elf文件将被损坏。 在容器外部运行perl命令( 在LD_LIBRARY_PATH改变之前 )之后,尝试在你的.so文件上运行objdump或readelf – 美元变成甜甜圈,现在已经损坏了。
它在这个可悲的必要的破解工作的原因是因为“tmp”和“etc”是相同的string长度,所以没有偏移改变。 考虑目录/ dkr或类似的,如果你不想使用/ tmp。
如果您必须采取这种方法,并且您所需的path不可更改,请重build该库并更改源中/ etc / hosts的默认path。 或者更好的是,在构build修改后的libnss_altfiles.so ,将其重命名为libnss_altfiles.so ,并将nsswitch.conf更改为使用hosts: altfiles启动hosts: altfiles容器时的hosts: altfiles (除非hosts: altfiles绑定了nsswitch.conf,否则不能更改)。 这将使您可以将libnss_altfiles.so与基本系统中的常规库并行。 如果docker执行了bind-mount nsswitch.conf,那么将重build的libnss_files.so保留在您的/ lib-override目录中,以备LD_LIBRARY_PATH加载。
作为一个头条,suid / sgid二进制文件忽略LD_LIBRARY_PATH和LD_PRELOAD,所以如果你使用这些variables的话,有些东西会打破(阅读:回到使用默认的/ etc / hosts)。