我使用CentOS 7作为Docker守护程序主机和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地址,如下所示:
$ 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地址的特定主机名?
6条答案
按热度按时间vwoqyblh1#
这在Dockerfile中通常是不可能的。
根据软件的不同,您可能可以做一些变通方法。
通过在安装软件的同一个RUN命令中设置主机名,它将在容器的同一层中发生。Docker稍后将覆盖主机名,您将不得不在运行时重新设置它,但您的软件可能会接受这一点。
如果你必须做很多这样的工作,你可以尝试使用Packer来构建容器。它可以构建Docker容器,但是不使用多个层。这使得重建速度更慢,下载构建的映像更快,并且在将映像冻结到容器之前,可以更方便地对映像进行多个操作。
qni6mghb2#
作为 解决 方法 , 您 可以 使用
docker-compose
或docker stack
来 构建 具有 特定hostname
的 容器 , 例如中 的 每 一 个
然后 运行 为 :
格式
或 使用 Docker stacks :
格式
vlurs2pr3#
在
/etc/hosts
没有帮助的情况下,我替换了hostname
二进制文件。ecr0jaav4#
我认为以下命令更好,因为Docker容器通常没有安装'hostname',因此我将使用head命令:
2nbm6dog5#
如果要在构建时指定主机名,现在它在这个pull请求下实现:你可以投票支持它尽快合并。
axr492tv6#
可能太晚了,但是...
准备您自己的脚本名为“hostname”(回显任何您想要的),将其复制到映像中的某个位置,并在dockerfile中插入ENV PATH=:$PATH
看起来工作得很好。至少在iRedMail:-)
如果需要,您可以通过实现-a、-f或-d选项来轻松扩展脚本。