如何在Dockerfile中处理特定的主机名如-h选项

我使用CentOS 7作为docker守护进程主机和centos:6个Docker镜像。

我想安装一些需要可parsing的主机名作为非回送地址的软件。 如果我使用-h选项运行docker映像

docker run -i -t -h myhost centos:6 /bin/bash 

然后我可以安装软件,因为/ etc / hosts在容器里自动configuration好了

 [root@myhost /]# cat /etc/hosts 172.17.0.7 myhost 127.0.0.1 localhost [root@myhost /]# ping myhost PING myhost (172.17.0.7) 56(84) bytes of data. 64 bytes from myhost (172.17.0.7): icmp_seq=1 ttl=64 time=0.033 ms 

但是我不能用同样的方法,如果我从Dockerfile创build一个图像。 我testing使用下面的Dockerfile创build一个图像

 FROM centos:6 ENV HOSTNAME myhost RUN ping myhost 

在dockerbuild立过程中,分配的主机名不能被parsing为如下的dynamicIP地址:

 $ docker build -t testimage . Sending build context to Docker daemon 2.048 kB Sending build context to Docker daemon Step 0 : FROM centos:6 ---> a30bc9f3097e Step 1 : ENV HOSTNAME myhost ---> Using cache ---> e73bf592389e Step 2 : RUN ping myhost ---> Running in ca54c8eac073 ping: unknown host myhost INFO[0000] The command [/bin/sh -c ping myhost] returned a non-zero code: 2 

我如何使用一些parsing为dynamic容器IP地址的特定主机名?

这在Dockerfile中通常是不可能的。

根据软件的不同,您可能可以进行某种解决方法。 例如,你可以尝试类似的东西

 RUN echo $(grep $(hostname) /etc/hosts | cut -f1) my.host.name >> /etc/hosts && install-software 

通过在安装软件时在同一个RUN命令中设置主机名,它将发生在容器的同一层内。 Docker稍后会覆盖主机名,在运行时你必须重新设置它,但是你的软件可能没问题。

如果你必须做很多这样的事情,你可以尝试打包容器。 它可以构buildDocker容器,但不使用多个图层。 这使得重build速度更慢,下载构build图像的速度更快,并且在将图像冻结成容器之前对图像执行多个操作更方便。

我认为以下是更好的,因为docker集装箱通常没有安装“主机名”,因此我会使用head命令:

 echo $(head -1 /etc/hosts | cut -f1) $HOST_NAME >> /etc/hosts 

我最近开始了一个通过主机名来路由容器的项目,这个项目处于一个非常早期的阶段,但也许它可以帮助那些正在寻找一些更简单的路由解决scheme,而不使用更重或更慢的解决scheme作为dnsparsing器或领事通过swarm关联的关键值parsing器。

对于任何有兴趣或愿意帮助回购的人在这里。

https://github.com/Markcial/yacht

/etc/hosts不起作用的情况下,我replacehostname二进制文件。

 RUN mv /usr/bin/hostname{,.bkp}; \ echo "echo myhost.local" > /usr/bin/hostname; \ chmod +x /usr/bin/hostname ... RUN mv /usr/bin/hostname{.bkp,}