Dockerfile如何添加localhost别名

Dockerfile如何添加localhost别名?

您好我需要在Dockerfile添加localhost别名我做到以下几点:

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 

没有其他logging

有谁知道我该怎么做? 我需要在Dockerfile做这个,因为外部服务运行这个Dockerfile ,我不从命令行运行它。

在我的情况下,它是一个PHP应用程序,在Bitbucket存储库中。 有一个新function叫做PIPELINES 。 它在Docker镜像上运行应用程序构build。

在我的情况下,这个应用程序连接到mysql服务器,我不能改变configuration(这将打破生产)。 在那个docker上的图像,我已经build立了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 

Dockerpipe理你的/etc/hosts文件。 /etc/host是不会工作的。

但是,在运行docker createdocker run时,可以使用--add-host选项将其他主机添加到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参数中使用它。 例如,如果我的本地networking上的Docker主机是192.168.1.43,我可以docker run --add-host locdev:192.168.1.43 ... 在这一点上, locdev将从容器内parsing回该ip。

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

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

这将永远是你的主机地址。