docker RUN附加到Dockerfile中的/ etc / hosts不起作用

时间:2014-12-08 11:43:01

标签: docker dockerfile

我有一个简单的Dockerfile但是第一个RUN命令(将主机IP地址附加到/ etc / hosts)没有效果

FROM dockerfile/java
RUN sudo echo "XX.XX.XXX.XXX some.box.com MyFriendlyBoxName" >> /etc/hosts
ADD ./somejavaapp.jar /tmp/
#CMD java -jar /tmp/somejavaapp.jar
EXPOSE 8280

我使用

构建
docker build .

然后使用

测试RUN回波线
sudo docker run -t -i <built image ID> /bin/bash

然后我进入容器但未附加/ etc / hosts文件。现在在容器中运行相同的echo ....行具有所需的效果

谁能告诉我我的dockerfile RUN有什么问题......?

4 个答案:

答案 0 :(得分:29)

每次创建新容器时,Docker都会动态生成/etc/hosts。这样它就可以联系其他人。您可以使用--add-host选项:

docker run --add-host www.domain.com:8.8.8.8 ubuntu ping www.domain.com

答案 1 :(得分:1)

如果您使用docker-compose,请使用extra_hosts

extra_hosts:
  - "somehost:162.242.195.82"
  - "otherhost:50.31.209.229"

答案 2 :(得分:0)

如果您尝试在主机和容器之间维护hosts文件条目,则另一种方法是使用映射主机的shell脚本包装您的命令&#39; /etc/hosts进入--add-host参数:

~/bin/java

#!/bin/sh

ADD_HOSTS=$(tail -n +10 /etc/hosts | egrep -v '(^#|^$)' | sed -r 's/^([a-z0-9\.\:]+)\s+(.+)$/--add-host="\2:\1"/g')

eval docker run \
    -it \
    --rm \
    $ADD_HOSTS \
    <image> \
    java $*

return $?

显然用你要做的任何东西取代java ......

解释; ADD_HOSTS会占用您主机前10行之后的所有内容。 /etc/hosts文件|删除评论和空白行|将条目重新排序为--add-host参数。

在前10行之后获取所有内容的原因是排除主机的localhost和ipv6条目。您可能需要根据自己的需要进行调整。

答案 3 :(得分:0)

我遇到了一个问题,我想为一个IP添加多个域名。实际上,由于在每次运行映像时/ etc / hosts都将被覆盖,因此没有办法进行构建。因此,似乎在docker-compose方法中使用--add-host选项或其extra_hosts外星人是唯一的方法。 但实际上,通过单个--add-host添加每个域名对我来说太麻烦了。我尝试过以下一种方法,它可以工作:

docker run --add-host "some.box.com MyFriendlyBoxName":X.X.X.X ubuntu cat /etc/hosts

实际上,它只是将--add-host之后的String复制并粘贴到冒号。