一尘不染

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

docker

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


阅读 762

收藏
2020-06-17

共1个答案

一尘不染

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

根据软件的不同,您也许可以执行某种解决方法。例如,您可以尝试类似

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

通过在安装软件时在同一RUN命令中设置主机名,主机名将在容器的同一层内发生。Docker稍后将覆盖主机名,您必须在运行时重新设置主机名,但是您的软件可能还可以。

如果您必须执行很多操作,则可以尝试使用Packer构建容器。它可以构建Docker容器,但不使用多层。这使得重建速度较慢,下载构建的图像的速度更快,并且在将图像冻结到容器之前对图像执行多项操作更加方便。

2020-06-17