我将CentOS 7用作docker daemon主机和centos:6 Docker映像。
我想安装一些需要可解析主机名作为非环回地址的软件。如果我使用-h选项运行docker映像,例如
docker run -i -t -h myhost centos:6 /bin/bash
然后,我可以安装软件,因为容器中的/ etc / hosts像
[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创建映像,则无法使用相同的方式。我测试了使用以下Dockerfile创建映像
FROM centos:6 ENV HOSTNAME myhost RUN ping myhost
在docker构建过程中,无法将分配的主机名解析为动态ip addr,如下所示:
$ 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
如何使用某些解析为动态容器IP地址的特定主机名?
这在Dockerfile中通常是不可能的。
根据软件的不同,您也许可以执行某种解决方法。例如,您可以尝试类似
RUN echo $(grep $(hostname) /etc/hosts | cut -f1) my.host.name >> /etc/hosts && install-software
通过在安装软件时在同一RUN命令中设置主机名,主机名将在容器的同一层内发生。Docker稍后将覆盖主机名,您必须在运行时重新设置主机名,但是您的软件可能还可以。
如果您必须执行很多操作,则可以尝试使用Packer构建容器。它可以构建Docker容器,但不使用多层。这使得重建速度较慢,下载构建的图像的速度更快,并且在将图像冻结到容器之前对图像执行多项操作更加方便。