Docker 容器中来自 LibreOffice Headless 的 TCP SYN_SENT。

Posted

技术标签:

【中文标题】Docker 容器中来自 LibreOffice Headless 的 TCP SYN_SENT。【英文标题】:TCP SYN_SENT from LibreOffice Headless in Docker Container. 【发布时间】:2018-02-07 18:16:07 【问题描述】:

我正在尝试让 LibreOffice 在容器内以无头模式运行,以便我可以将其用于 Windows 上的文档转换。

通过以下方式在本地运行 LibreOffice:

C:\Program Files\LibreOffice 5\program>soffice.exe -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard -headless

在端口 8100 上生成一个正在运行的 LibreOffice 实例

C:\Program Files\LibreOffice 5\program>netstat -nao|findstr -c:"8100" TCP 127.0.0.1:8100 0.0.0.0:0 LISTENING 28168

使用LibreOffice CLI,然后我可以使用 C# 成功连接到正在运行的应用程序以转换我的文档。

这一切都很好,但是当我从 Windows 容器运行相同版本的 LibreOffice 时,我的程序会挂在连接步骤上,并且永远不会超时或出错。 请参阅下面的 C# 代码 sn-p。

dockerfile

FROM microsoft/windowsservercore

ADD https://ftp.osuosl.org/pub/tdf/libreoffice/stable/5.4.4/win/x86_64/LibreOffice_5.4.4_Win_x64.msi .

RUN msiexec.exe /i LibreOffice_5.4.4_Win_x64.msi
RUN del LibreOffice_5.4.4_Win_x64.msi

EXPOSE 8100

ENTRYPOINT ["C:\\Program Files\\LibreOffice 5\\program\\soffice.exe"]
CMD ["-accept=\"socket,host=127.0.0.1,port=8100;urp;\"", "-headless", "-nofirststartwizard"]

泊坞窗命令

docker build -t libreoffice .
docker run -d -v C:\FileRepository:C:\FileRepository --name some-office -p 8100:8100 libreoffice

C#

var xLocalContext = uno.util.Bootstrap.defaultBootstrap_InitialComponentContext();

var xURLResolver = (XUnoUrlResolver)xLocalContext.getServiceManager()
    .createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", xLocalContext);

// m_ServiceConnString = uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext
// C# never returns from this line and doesn't error when LibreOffice is running via container
// The only way to recover is to kill the process.
var xRemoteContext = (XComponentContext)xURLResolver.resolve(m_ServiceConnString); 

var xRemoteFactory = (XMultiServiceFactory)xRemoteContext.getServiceManager();
 return (XComponentLoader)xRemoteFactory.createInstance("com.sun.star.frame.Desktop");

在没有容器的转换期间运行 netstat(本地 LibreOffice)显示:

>netstat -nao|findstr -c:"8100"
  TCP    127.0.0.1:8100         0.0.0.0:0              LISTENING       28168
  TCP    127.0.0.1:8100         127.0.0.1:57531        ESTABLISHED     28168
  TCP    127.0.0.1:57531        127.0.0.1:8100         ESTABLISHED     36208

在使用容器转换期间运行 netstat 显示:

>netstat -nao|findstr -c:"8100"
  TCP    127.0.0.1:8100         0.0.0.0:0              LISTENING       15924
  TCP    127.0.0.1:8100         127.0.0.1:58931        ESTABLISHED     15924
  TCP    127.0.0.1:58931        127.0.0.1:8100         ESTABLISHED     25124
  TCP    172.27.208.1:58932     172.27.216.35:8100     SYN_SENT        15924

不是网络人,我觉得这与如何与容器建立连接有关,SYN_SENT 似乎意味着连接被阻止,但我不能确定。 SYN_SENT 状态也只持续几秒钟。我是 docker 的新手,所以我可能在创建和运行容器的方式上做错了。任何帮助都会很棒!

环境

Windows 10 Docker 17.12.0-ce-win47 (15139) LibreOffice 5.4.4.2 Docker 网络托管nat

docker ps

CONTAINER ID        IMAGE               COMMAND                    CREATED             STATUS
      PORTS                    NAMES
a2ad9cc76d8b        libreoffice         "C:\\Program Files\\Li…"   45 hours ago        Up 22 minutes
      0.0.0.0:8100->8100/tcp   some-office

码头检查

docker inspect --format " .NetworkSettings.Networks.nat.IPAddress " some-office
172.27.216.35 // can't telnet to this ip with 8100 or ping.

docker inspect --format " .NetworkSettings.Networks.nat.Gateway " some-office
172.27.208.1

【问题讨论】:

【参考方案1】:

想通了。

连接到容器表明我可以通过 telnet 连接到容器中的 LibreOffice。

docker exec -ti some-office cmd

telnet 127.0.0.1 8100
e ? ?'com.sun.star.bridge.XProtocolPropertiesUrpProtocolProperties.UrpProtocol
PropertiesTidm???

但是,尝试通过容器的 IP 进行 telnet 失败。

docker exec -ti some-office cmd

C:\>telnet 172.27.216.25 8100
Connecting To 172.27.216.25...Could not open connection to the host, on port 8100: Connect failed

我将 LibreOffice 端口从 127.0.0.1 更改为 0.0.0.0,这使得 telnet 可以通过容器端口在容器内工作,也可以通过 localhost:8100 从主机工作。

更改 dockerfile 并重建

CMD ["-accept=\"socket,host=0.0.0.0,port=8100;urp;\"", "-headless", "-nofirststartwizard"]

或者通过以下方式创建容器:

docker run -d -v C:\FileRepository:C:\FileRepository --name some-office -p 8100:8100 libreoffice -accept=\"socket,host=0.0.0.0,port=8100;urp;\" -headless -nofirststartwizard

为感兴趣的人生成 Dockerfile 文件:

https://github.com/SRSsoft/libreoffice

【讨论】:

以上是关于Docker 容器中来自 LibreOffice Headless 的 TCP SYN_SENT。的主要内容,如果未能解决你的问题,请参考以下文章

子进程在 docker 容器中不起作用

无法在 LibreOffice 中检索 XShape 的容器

来自 Grafana 的电子邮件警报在 docker 容器内不起作用

没有来自 docker 容器的 php-fpm 错误日志

来自 docker 容器内部的 systemctl 因 D-Bus 连接错误而失败

Promtail 和 Grafana - 来自 docker 容器的 json 日志文件未显示