如何在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器。
对于任何有兴趣或愿意帮助回购的人在这里。
在/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,}