2016-07-12

Docker Container 啟動後立即結束的解決方法

阿舍之前在用 Ubuntu 的 Docker Image,還是其它某些的 Linux 發行版本的 Docker Image 的時候,都會遇到 Conatiner 一起動後就會結束掉的情形,那個時候的阿舍不是這麼的瞭解 Docker,就以為,Container 和虛擬機器一樣,一開起來之後,就會像實體機器一樣的一直跑著,所以,對於 Container 一啟動後就會自動結束這件事不太能理解哩 ...


後來,經過歲月的成長,阿舍終於明白了,為什麼阿舍的 Ubuntu 的 Docker Image 會啟動後就結束的原因哩 ... 其實,是因為 Docker Container 本身只是一支 Process (處理程序,可以簡單的把它想成是某一支執行中的程式),而一般的 Process 起動後,如果不是 Deamon 或是 Service 的話,在啟動後,執行完該執行的東西後,就會結束這支 Process 的哩 ...

以像 Ubuntu 官方提供的這種 Linux 發行版本的 Docker Image 來說,大部份就都是一個沒有任何 Deamon 或 Service 的 Docker Image,所以,用這種 Docker Image 所執行的 Docker Conatiner 就當然會在啟動後,就自動結束了 ...

但是,為什麼大部份的 Linux 發行版本都會是像 Ubuntu 官方的 Docker Image 一樣,這麼的 "單純" 呢 ? 關於這個問題,阿舍也曾經有困惑過,阿舍就有想過說,為什麼連個 SSH 都不給它預先安裝和啟用呢? 有了預先啟用的 SSHD 之後,就不會一啟動就結束,所以,阿舍不懂,為何不呢 ?

後來,等阿舍自己 Build 過幾次 Docker Image 後,大概就能夠明白了哩 ! 因為,在多數的情況下,這些 Linux 發行版本的 Docker Image 是被用來當做「基底」的,以阿舍自己為例,阿舍要自己弄一佪 Nginx 的 Docker Image 的話,就會需要選一個 Linux 發行版本來當作業系統,然後,往上加裝 Nginx,而這個時候,如果這個 Linux 發行版本的 Docker Image 裡有一些阿舍用不到的東西在跑的話,那阿舍就還要去把它移除或變更設定,這樣,事情就會變得比較麻煩哩 ! 所以說,像 Ubuntu 這種會被拿來當「基底」的 Docker Image 的 Container 就比較會發生一啟動就結束的情形哩 ...

那麼要怎麼解決這個問題,不然,都沒辦法進去做設定哩 ? 關於這個問題,阿舍後來都是用 docker build 來建立和啟動一個有 SSH Deamon 的 Ubuntu 的 Docker Container 後,才用 docker exec 指令來連進去安裝和測試軟體哩 ! 不過,如果,有點懶得自己用 docker build 來建立的話,也是可以用下面指令來找到有 SSHD 的 Ubuntu 的 Docker Image 的,只是,不是 Ubuntu 官方推出的 ~~

$ sudo docker search ubuntu | grep ssh

下面這個 Dockerfile 的內容,是阿舍製作有 SSHD 的 Ubuntu Docker Image 時所使用的,就提供參考囉 ! (註: 使用前,請先自備 sshd_config 檔,還有,就是,如果還沒用過 Dockerfile 的話,不建議直接服用哩 ... )


FROM ubuntu

RUN apt-get update && apt-get install openssh-server -y
RUN apt-get install git -y
RUN mkdir /var/run/sshd
RUN echo 'root:123456' | chpasswd
RUN useradd git
RUN mkdir -p /home/ayubiz/.ssh

ADD sshd_config /etc/ssh/sshd_config

VOLUME /home/ayubiz
EXPOSE 10022
CMD ["/usr/sbin/sshd", "-D"]

推薦閱讀


有疑問? 問題還是沒解決嗎? 歡迎下方留言提問和討論 😁

1 則留言 :

猴子(淺水藍) 提到...

如果docker執行後馬上結束, 可以用docker log 去看它執行的log

張貼留言

歡迎留言提問和討論 .... 😁