- 今天在打鏡像的時候,突然發現了一個問題。docker 啓動容器dns會讀取宿主機的配置。
我的宿主機配置的dns是虛擬機的網關。可以正常上網。
基於centos7打了一個鏡像,dockerfile如下:
我在這裏指定了dns配置,然後再下面打印了一下。
效果如下:
從這可以看到,在第二步設置dns,第四步打印出的結果還是讀取的宿主機的配置。
這裏分析了一下原因:由於以Dockerfile的形式構建鏡像,其中每一個指令都是一層,它的過程是基於基礎鏡像運行一個容器,然後按指令執行,第一個指令完畢後,commit爲一個新的鏡像層,docker再運行一個基於新鏡像的容器,執行下一步指令,直到結束。這樣的好處是,假如共有四個指令,第三個失敗了,那麼可以基於第二個指令生成的鏡像繼續操作,不需要再從頭操作一遍,節省資源。
那麼,由此可見,我在第二步設置完,docker提交一個鏡像,docker接下來運行這個鏡像的時候,會讀取宿主機配置,所以我的設置也就不生效了。使用docker commit構建鏡像也是一樣的效果。
如果想讓它生效,需要在啓動命令裏指定。
使用entrypoint指令,這個指令的作用是在容器啓動時的操作,而且不會被docker run指定的參數覆蓋。(當然也可以覆蓋,在啓動的時候
docker run --entrypoint=
可以這樣指定臨時的啓動命令來覆蓋dockerfile裏的entrypoint)
可以看到,使用entrypoint之後,這個指定的配置便生效了。