docker 容器除錯技巧

DHclly發表於2024-07-23

有時候docker容器可能因為對映不對,或者內部檔案錯誤等等,會出現一啟動就掛掉的情況,這種往往就是容器啟動入口的程式有問題,但是因為一啟動就掛,有時候日誌啥的都看不到。這時候就可以透過 command 指令去覆蓋掉預設Dockerfile 裡面的 CMD 定義的入口(EntryPoint 定義的也類似)。

覆蓋方式有兩種

一種是 command: ["sleep","infinity"] 讓主執行緒無限休眠,那麼程式也就不會停止,那麼docker 容器也就不會停掉。這樣就可以透過 docker exec -it xxx bash 進入容器檢視了。

另一個命令是 command: ["tail","-f","/dev/null"] 作用也是同理。

但是如果是用 docker swarm 或者 k8s 部署的除錯的時候要注意, 因為這時候會有容器健康檢測重啟策略,用了上述命令,因為覆蓋了預設的程式啟動入口,那麼健康檢測邏輯就會失敗,容器處於unhealthy 狀態,然後就觸發重啟策略。

所以記得註釋掉相關配置,如下示例:

version: "3.5"

services:
    nginx:
        hostname: nginx
        image: nginx
        ports:
            - target: 80
              published: 80
              mode: host
        deploy:
            mode: global
            # restart_policy:
            #     condition: on-failure
        networks:
            - overlay
        # 加此命令進行除錯容器的時候,不要開啟 healthcheck 和 restart_policy 策略,
        # 否則容器處於 unhealthy 狀態,會不斷重啟
        command: ["sleep","infinity"]
        # healthcheck:
        #     test: bash /opt/nginx/check.sh
        #     interval: 20s
        #     timeout: 10s
        #     retries: 3
        logging:
            driver: "json-file"
            options:
                max-size: "2000k"
                max-file: "10"

相關文章