如何处理 Dockerfile 中的特定主机名,如 -h 选项 [英] How to handle specific hostname like -h option in Dockerfile

查看:22
本文介绍了如何处理 Dockerfile 中的特定主机名,如 -h 选项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 CentOS 7 作为 docker daemon host 和 centos:6 Docker images.

I'm using CentOS 7 as docker daemon host and centos:6 Docker images.

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

I want to install some software which requires resolvable hostname as non-loopback address. If I run a docker image with -h option like

docker run -i -t -h myhost centos:6 /bin/bash

然后我就可以安装软件了,因为容器中的/etc/hosts自动配置好了

Then I can install the software because /etc/hosts in the container automatically configured like

[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 测试了创建图像

But I cannot use same way if I create an image from Dockerfile. I tested creating an image using following Dockerfile

FROM centos:6

ENV HOSTNAME myhost
RUN ping myhost

在 docker build 过程中,分配的主机名无法解析为动态 ip addr,如下所示:

In docker build process, assigned hostname cannot be resolved as dynamic ip addr like following:

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

How can I use some specific hostname resolved as dynamic container IP addr?

推荐答案

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

This isn't generally possible in a Dockerfile.

根据软件的不同,您也许可以做一些变通方法.例如,您可以尝试类似

Depending on the software, you might be able to do some kind of work-around. For example, you could try something like

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

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

By setting the hostname within the same RUN command as you install the software, it'll happen inside the same layer of the container. Docker will later overwrite the hostname and you'll have to set it anew when running, but your software might be OK with that.

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

If you have to do a lot of this, you might try Packer for building containers. It can build Docker containers, but doesn't use multiple layers. This makes it slower to rebuild, faster to download the built images, and makes it more convenient to do multiple operations on an image before freezing it into a container.

这篇关于如何处理 Dockerfile 中的特定主机名,如 -h 选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆