Dockerfile如何添加localhost别名

时间:2016-10-12 16:46:52

标签: docker

Dockerfile如何添加localhost别名?

您好我需要在localhost中添加Dockerfile别名 我做了以下事情:

RUN echo '127.0.0.1 locdev' >> /etc/hosts

但是当我转到图像bash控制台时

$ docker exec -it my-image bash

并尝试ping该主机确实会抛出错误

$ ping locdev
ping: unknown host

/etc/hosts包含哪些内容?

$ cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4  62a5e2d10730

没有其他记录

有谁知道我该怎么做?我需要在Dockerfile中执行此操作,因为外部服务运行此docker并且我不从命令行运行它。

在我的情况下,它是PHP应用程序,它存放在Bitbucket存储库中。有一项名为PIPELINES的新功能。它在Docker图像上运行应用程序构建。

在我的情况下,此应用程序连接到mysql服务器,我无法更改配置(它将中断生产)。在该docker镜像上我设置了mysql服务器。所以localhost有效,但我需要为localhost添加此别名,以免中断生产服务器;

Dockerfile片段:

RUN \
 aliases="127.0.0.1 localhost locdev" &&\
 sed "1s/.*/$aliases/" /etc/hosts
RUN cat /etc/hosts

我的docker build输出示例:

Step 10 : RUN aliases="127.0.0.1 localhost locdev" && sed "1s/.*/$aliases/" /etc/hosts
 ---> Running in 11ac105d632d
127.0.0.1 localhost locdev
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      383850eeb47b
 ---> 0248977e48bd
Removing intermediate container 11ac105d632d
Step 11 : RUN cat /etc/hosts
 ---> Running in 20fc2f40b5a9
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      383850eeb47b
 ---> c9e47ee296c5
Removing intermediate container 20fc2f40b5a9
Successfully built c9e47ee296c5

2 个答案:

答案 0 :(得分:7)

Docker为您管理/etc/hosts文件。/etc/host无效。

但是,在运行--add-hostdocker create时,您可以使用docker run选项向Docker的DNS服务发现中添加其他主机。

这来自docker run --help

的输出
  --add-host value              Add a custom host-to-IP mapping (host:ip) (default [])

但请记住,容器内的127.0.0.1不会将您带到容器主机,但由于它有自己的127.0.0.1接口,因此会将您置于容器中。

您的docker主机的eth0 IP地址可以从容器内部路由。您可以在--add-host参数中使用它。例如,如果我的本地网络上的Docker主机是192.168.1.43,我可以docker run --add-host locdev:192.168.1.43 ...。此时,locdev将从容器内部解析回该IP。

答案 1 :(得分:0)

比使用eth0(或主机上的其他界面)中的地址更好,只需使用Docker容器内的默认网关地址即可。这是容器所连接的主机上Docker维护的桥的地址。你可以这样做:

ip route | awk '$1 == "default" {print $3}'

这将始终是您主人的地址。