簡體   English   中英

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

[英]TCP SYN_SENT from LibreOffice Headless in Docker Container.

我試圖讓 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# 代碼片段。

文件

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");

在沒有容器(本地 LibreOffice)的情況下在轉換期間運行 netstat 顯示:

>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 的新手,所以我可能在創建和運行容器的方式上做錯了。 任何幫助都會很棒!

環境

  • 視窗 10
  • Docker 17.12.0-ce-win47 (15139)
  • LibreOffice 5.4.4.2
  • 用於托管nat Docker 網絡。

碼頭工人

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

想通了。

連接到容器表明我可以通過 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM