docker 啓動容器時讀取宿主機的dns配置

  • 今天在打鏡像的時候,突然發現了一個問題。docker 啓動容器dns會讀取宿主機的配置。

我的宿主機配置的dns是虛擬機的網關。可以正常上網。

基於centos7打了一個鏡像,dockerfile如下:

我在這裏指定了dns配置,然後再下面打印了一下。

效果如下:

從這可以看到,在第二步設置dns,第四步打印出的結果還是讀取的宿主機的配置。

這裏分析了一下原因:由於以Dockerfile的形式構建鏡像,其中每一個指令都是一層,它的過程是基於基礎鏡像運行一個容器,然後按指令執行,第一個指令完畢後,commit爲一個新的鏡像層,docker再運行一個基於新鏡像的容器,執行下一步指令,直到結束。這樣的好處是,假如共有四個指令,第三個失敗了,那麼可以基於第二個指令生成的鏡像繼續操作,不需要再從頭操作一遍,節省資源。

那麼,由此可見,我在第二步設置完,docker提交一個鏡像,docker接下來運行這個鏡像的時候,會讀取宿主機配置,所以我的設置也就不生效了。使用docker commit構建鏡像也是一樣的效果。

如果想讓它生效,需要在啓動命令裏指定。

使用entrypoint指令,這個指令的作用是在容器啓動時的操作,而且不會被docker run指定的參數覆蓋。(當然也可以覆蓋,在啓動的時候

docker run --entrypoint=

可以這樣指定臨時的啓動命令來覆蓋dockerfile裏的entrypoint)

可以看到,使用entrypoint之後,這個指定的配置便生效了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章