選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
2 分鐘閱讀時間 (462 個字)

修改 docker container 預設使用 stdout stderr以致不易查看的問題​

修改 docker container 預設使用 stdout stderr以致不易查看的問題​

每一個 Dockerfile 都可能或多或少地「定義」了一些應用程式本身與外在環境的關係,這次我們以 Nginx 為例,各位可以把它看做是一個輕量級的網頁伺服器。當我們把 Nginx 塞到 Docker 裡面,可能有許多細節我們不會想花時間去了解太深入,畢竟以 Scrum 的精神先讓事情發生,所以用以下的指令把它跑起來: 

docker run -d --name nginx -p 8080:80 nginx 

依這個官網 Image 預設行為,它會把 log 寫到 /var/log/nginx 目錄下,分別是外部訪問的紀錄在 access.log 以及錯誤在 error.log,但這兩個檔案又被連結到 STDOUT / STDERR 去了,好處是不太會因為檔案太大而爆掉,但壞處就是一下就捲過去了,很難在裡面慢慢查問題。這裡我們先看第一招:在這個 Image 有指令可以在「Container 內部」重啟的情況下,可以直接進到 Container 裡面,把這兩個連結刪掉,再重啟 Nginx 就好了,過程細節請參考下圖。

 但依作者的經驗,不是每一個 Image 都留有內部重啟的餘地,有時候我們得遷就一下。接下來第二招,利用映射保留 Container 所用到的磁碟空間,再把它跑起來:

當我們在當前目錄下,開了 log/nginx 子目錄,並對應到 Container 裡面的 /var/log/nginx 目錄,在此狀況下的 Nginx 就不會再產生連結,而是直接利用這磁碟空間輸出 log。以上這樣看來很不錯了?不過細究起來,「映射就不產生連結」應該也是由 Nginx Dockerfile 所決定的特性,換言之,其他的 Image 不見得能這麼容易修改,這時我們還有最後一招:找找 Docker Host(也就是「外面」)是不是有這樣的檔案?

  • /var/lib/docker/containers/<containerId>/<containerId>-json.log
雖然內容形式有些修改,但 Container 的 STDOUT / STDERR 都集中在此,資訊是不漏接的。
azure storage account
為什麼程式需要單元測試? - 視覺化篇
 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/04/25, 週四

Captcha 圖像