一千萬個為什麽

搜索

Docker容器始終停止並啟動



我使用docker撰寫構建兩個容器,一個是使用pm2的nodejs,另一個是nginx。

nginx運行良好,但是使用pm2的節點j繼續重新啟動:它運行一秒鐘,然後停止約10秒,然後再次啟動並運行一秒鐘,如您所見,這是 docker ps的輸出-a </代碼>:

docker ps -a

我已經使用了 docker attach'ID',但它仍然重新啟動。

使用 docker日誌什麽都沒有顯示,但jenkins說pm2已經成功啟動了:

jenkins output log

這是我的Dockerfile的內容:

FROM node:8    
MAINTAINER test    
RUN npm install -g pm2

WORKDIR /var/www/marketing    

EXPOSE 80    

RUN npm install    
RUN pm2 start npm -- stage

如果您有任何人可以幫助我,如果您有任何要求,我會更新這個問題。 謝謝

轉載註明原文: Docker容器始終停止並啟動

一共有 3 個回答:

您應該至少保留一個在前臺運行的服務以保持容器運行,您可以使用 ENTRYPOINTCMD 或兩者來執行此操作。欲了解更多信息,請查看 Dockerfile:ENTRYPOINT vs CMD

您還可以使用docker hub中的pm2 docker鏡像,這將節省您的時間,並且您可以檢查Dockerfile以查看它是如何寫入的。 例如,檢查 keymetrics/pm2-docker-alpine項目

為了使錯誤消息具有可視性,將卷掛載到容器,以便在崩潰後可以使用日誌...否則問題一旦崩潰,日誌就會消失...例如,此docker-compose.yaml摘錄是如何掛載卷

  nodejs-enduser:
    image: your-image-name
    restart: always
    volumes:
      - /pathA:/pathB  

pathA是啟動容器的主機上某個日誌目錄的完整路徑

pathB是從容器內寫入的路徑進程

如果你使用supervisord來包裝你的docker launch,那麽它的配置文件定義了標準out/stderr被寫入的地方...那是/ pathB ...然後容器內的應用程序只是寫入stdout/stderr

另一種方法是啟動一個空容器,然後運行一次,然後使用 docker exec -ti container-id bash 登錄到容器中。然後手動發出Dockerfile命令來安裝並執行應用程序(nodejs)你可以在那裏看到錯誤......這裏是Dockerfile,它沒有任何容器

FROM ubuntu:16.04

ENV TERM linux
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update
RUN apt-get install -y wget  curl   net-tools

# COPY .bashrc /root/
#  list your normal Dockerfile code COPY steps here 

CMD ["/bin/bash"]

現在構建上面的Dockerfile

docker build --tag stens_ubuntu .

並運行

docker run -d  stens_ubuntu  sleep infinity

現在登錄到它

docker exec -it $( docker ps | grep stens_ubuntu | cut -d' ' -f1 )  bash

在這裏你正在運行容器內的命令提示符下,你現在發出你需要運行你的原始Dockerfile中列出的普通應用程序的命令......美現在你正在交互式地看到錯誤發生......直到它崩潰該消息將被顯示

Docker監視由ENTRYPOINT或CMD啟動的進程,並且由於在Dockerfile中沒有這樣的條目,您的容器將在其生命周期的早期終止。

另請註意,通過ENTRYPOINT或CMD啟動的進程應該在前臺中運行,不能作為守護進程啟動。