2017-06-12 386 views
0

我花了週末的時間翻閱Docker文檔並玩弄應用程序和示例項目。我現在試圖編寫一個我自己的超級簡單的Web服務,並從一個容器中運行它。在容器中,我想我的應用程序(在引擎蓋下一個春天啓動的應用程序) - 所謂啓動時 - 具有以下目錄結構:我的應用程序在Docker中啓動時無法創建日誌文件

/opt/ 
    bootup/ 
     bin/ 
      bootup.jar  ==> the app 
     logs/ 
      bootup.log  ==> log file; GETS CREATED BY THE APP @ STARTUP 
     config/ 
      application.yml ==> app config file 
      logback.groovy ==> log config file 

需要注意的是,當我運行是非常重要的我應用程序本地在我的主機 - Docker之外 - 一切正常,包括創建日誌文件到我的主機的/opt/bootup/logs目錄。應用端點提供了正確的內容等等。一切都很好,很棒。

所以我創建了以下Dockerfile

FROM openjdk:8 

RUN mkdir /opt/bootup 
RUN mkdir /opt/bootup/logs 
RUN mkdir /opt/bootup/config 
RUN mkdir /opt/bootup/bin 

ADD build/libs/bootup.jar /opt/bootup/bin 
ADD application.yml /opt/bootup/config 
ADD logback.groovy /opt/bootup/config 

WORKDIR /opt/bootup/bin 

EXPOSE 9200 

ENTRYPOINT java -Dspring.config=/opt/bootup/config -jar bootup.jar 

然後我通過建立自己的形象:

docker build -t bootup . 

然後我跑我的容器:

docker run -it -p 9200:9200 -d --name bootup bootup 

我跑docker ps

CONTAINER ID  IMAGE    COMMAND ... 
3f1492790397  bootup    "/bin/sh -c 'java ..." 

到目前爲止,太棒了!

我的應用程序應該在localhost:9200處提供一個簡單的網頁,所以我打開我的瀏覽器到http://localhost:9200,我什麼也沒得到。

當我使用docker exec -it 3f1492790397 bash爲「SSH」到我的容器,我看到的一切看起來不錯,除了目錄/opt/bootup/logs,它應該有一個bootup.log文件在裏面 - 在啓動時創建的 - 反而空。

我嘗試使用docker attach 3f1492790397,然後打http://localhost:9200在我的瀏覽器,看看是否會產生一些標準輸出(我的應用程序日誌既/opt/bootup/logs/bootup.log以及控制檯),但不會產生任何輸出。

所以我認爲發生的事情是,當容器啓動時,並把應用程序在一個奇怪的狀態,甚至阻止它在我的應用程序(因爲某些原因)沒有權限來創建自己的日誌文件從完全啓動。

那麼請問:

  • 有沒有辦法,看看有什麼用戶我的應用程序的啓動?;或
  • 有沒有辦法在容器啓動的時候標準輸出?啓動後附加不幫助我,因爲我認爲當我運行docker attach命令應用程序已經窒息

在此先感謝!

+0

默認情況下,您運行docker run -it image時會附加到stdout/stderr。關於應用程序的問題,您是否檢查過該應用程序是否允許在該文件夾中寫入? – German

+0

我建立了一個項目來檢查你是否有權限問題,但是沒有。所以一切都讓我認爲你在應用程序中有一些問題。我將該示例留在:https://github.com/nitzap/so-java-docker-log – German

回答

1

我不知道爲什麼你的應用程序無法正常工作,但能回答你的問題 -

有沒有辦法,看看有什麼用戶我的應用程序的啓動?;或者

答:除非另有說明,否則Docker容器將以root身份運行。

有沒有辦法在容器啓動的時候標準輸出?啓動後安裝不幫我,因爲我覺得到時候我跑泊塢窗附加命令的應用已經哽咽

答:Docker容器傾倒標準輸出/標準錯誤到系統默認的泊塢日誌。有兩種方法可以看到這些:1是使用標誌運行容器,而不是使用-d來獲取交互式會話,該會話將列出容器中的stdout。另一種是在運行或停止的容器上使用docker logs *container_name*命令。

泊塢窗附加3f1492790397

這不會做你希望的東西。你想要的是docker exec(可能是docker exec -it bootup bash),它會給你一個在容器範圍內的shell,它可以讓你檢查你的日誌文件或嘗試使用容器內部的curl命中應用程序。

爲什麼我沒有輸出?

很難說,沒有來自早期命令的信息。您的應用程序是在0.0.0.0還是在本地主機上進行偵聽(您的筆記本電腦瀏覽器看起來像是外部機器到容器)?您的應用程序是否需要未運行的主管程序?它是否需要其他一些JAR文件位於筆記本電腦上的CLASSPATH中,但不在容器中?您是否在使用Docker-Machine運行Docker(在這種情況下localhost可能不是容器的名稱)?

相關問題