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

gcxthw6b  于 2022-11-22  发布在  Docker
关注(0)|答案(6)|浏览(161)

我使用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地址的特定主机名?

vwoqyblh

vwoqyblh1#

这在Dockerfile中通常是不可能的。
根据软件的不同,您可能可以做一些变通方法。

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

通过在安装软件的同一个RUN命令中设置主机名,它将在容器的同一层中发生。Docker稍后将覆盖主机名,您将不得不在运行时重新设置它,但您的软件可能会接受这一点。
如果你必须做很多这样的工作,你可以尝试使用Packer来构建容器。它可以构建Docker容器,但是不使用多个层。这使得重建速度更慢,下载构建的映像更快,并且在将映像冻结到容器之前,可以更方便地对映像进行多个操作。

qni6mghb

qni6mghb2#

作为 解决 方法 , 您 可以 使用 docker-composedocker stack 来 构建 具有 特定 hostname 的 容器 , 例如

version: '3'
services:
  all:
    image: testimage
    container_name: myname
    hostname: myhost
    build:
      context: .

中 的 每 一 个
然后 运行 为 :

docker-compose --build up

格式
或 使用 Docker stacks

docker stack deploy -c docker-compose.yml mystack

格式

vlurs2pr

vlurs2pr3#

/etc/hosts没有帮助的情况下,我替换了hostname二进制文件。

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

...

RUN mv /usr/bin/hostname{.bkp,}
ecr0jaav

ecr0jaav4#

我认为以下命令更好,因为Docker容器通常没有安装'hostname',因此我将使用head命令:

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

2nbm6dog5#

如果要在构建时指定主机名,现在它在这个pull请求下实现:你可以投票支持它尽快合并。

axr492tv

axr492tv6#

可能太晚了,但是...
准备您自己的脚本名为“hostname”(回显任何您想要的),将其复制到映像中的某个位置,并在dockerfile中插入ENV PATH=:$PATH
看起来工作得很好。至少在iRedMail:-)
如果需要,您可以通过实现-a、-f或-d选项来轻松扩展脚本。

相关问题