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之后,这个指定的配置便生效了。

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