22

我有一个简单的 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

4 回答 4

38

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

docker run --add-host www.domain.com:8.8.8.8 ubuntu ping www.domain.com
于 2014-12-08T14:35:40.537 回答
3

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

extra_hosts:
  - "somehost:162.242.195.82"
  - "otherhost:50.31.209.229"
于 2018-06-19T11:23:22.427 回答
1

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

~/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将在您的主机/etc/hosts文件中的前 10 行之后获取所有内容|删除注释和空白行将|条目重新排序到--add-host参数中。

在前 10 行之后取所有内容的原因是为了排除主机的 localhost 和 ipv6 条目。您可能需要对此进行调整以满足您的需要。

于 2016-12-27T22:48:41.513 回答
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 之后的字符串复制并粘贴到冒号。

于 2020-02-29T18:37:26.410 回答