有時候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"