首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自码头容器中的SYN_SENT无头LibreOffice。

来自码头容器中的SYN_SENT无头LibreOffice。
EN

Stack Overflow用户
提问于 2018-02-07 18:16:07
回答 1查看 1.1K关注 0票数 3

我试图让LibreOffice在容器中以无头模式运行,这样我就可以在windows上使用它进行文档转换。

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

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

生成LibreOffice在端口8100上侦听的运行实例。

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#代码片段。

码头文件

代码语言:javascript
复制
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"]

停靠命令

代码语言:javascript
复制
docker build -t libreoffice .
docker run -d -v C:\FileRepository:C:\FileRepository --name some-office -p 8100:8100 libreoffice

C#

代码语言:javascript
复制
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)显示:

代码语言:javascript
复制
>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显示:

代码语言:javascript
复制
>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状态也只持续几秒钟。我对码头很陌生,所以我在创建和运行容器的方式上可能做错了什么。任何帮助都会很好!

环境

  • Windows 10
  • 码头工人17.12.0-ce-win47 (15139)
  • LibreOffice 5.4.4.2
  • 码头网络主机nat

船坞ps

代码语言:javascript
复制
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

码头检查

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 21:34:34

弄明白了。

连接到容器显示,我可以通过telnet连接到容器中的LibreOffice。

代码语言:javascript
复制
docker exec -ti some-office cmd

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

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

代码语言:javascript
复制
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并重新生成

代码语言:javascript
复制
CMD ["-accept=\"socket,host=0.0.0.0,port=8100;urp;\"", "-headless", "-nofirststartwizard"]

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

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48670724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档