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

dem*_*ong 19 docker dockerfile

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

我想安装一些需要可解析主机名作为非环回地址的软件.如果我使用-h选项运行docker镜像

docker run -i -t -h myhost centos:6 /bin/bash
Run Code Online (Sandbox Code Playgroud)

然后我可以安装该软件,因为容器中的/ 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
Run Code Online (Sandbox Code Playgroud)

但是如果我从Dockerfile创建一个图像,我就无法使用相同的方法.我测试了使用以下Dockerfile创建图像

FROM centos:6

ENV HOSTNAME myhost
RUN ping myhost
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

如何使用一些特定的主机名解析为动态容器IP地址?

Nat*_*rot 12

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

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

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

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

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


ken*_*orb 8

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

version: '3'
services:
  all:
    image: testimage
    container_name: myname
    hostname: myhost
    build:
      context: .
Run Code Online (Sandbox Code Playgroud)

然后运行为:

docker-compose --build up
Run Code Online (Sandbox Code Playgroud)

或使用Docker 堆栈

docker stack deploy -c docker-compose.yml mystack
Run Code Online (Sandbox Code Playgroud)


Chr*_*rio 5

/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,}
Run Code Online (Sandbox Code Playgroud)

  • 现在是 2020 年:) 我已经阅读和测试了几个小时,这是唯一有效的。旧但金。 (2认同)