如何在“ Docker build”期间更新 Docker 映像中的/etc/hosts 文件

我想更新我的 /etc/hosts文件在“码头建设”。

我在 Dockerfile 添加了以下内容,但它既没有更新 ABc0文件,也没有出现任何错误。

RUN echo "192.168.33.11    mynginx" >> /etc/hosts

我需要更新 /etc/hosts。有人能对此提出建议吗?

242549 次浏览

使用最新版本的 docker,这可以通过 docker-compose 及其 extra_hosts指令来完成

添加主机名映射。
使用与 客户端 --add-host参数相同的值(应该已经可用于 docker 1.8)。

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

简而言之: 在运行容器时修改它的 /etc/hosts,而不是在构建它时修改它。


对于 Docker17.x + ,您有一个 docker build --add-host提到的 下面,但是,正如在 第34078期这个答案中所注释的:

构建期间的 --add-host特性旨在允许在构建期间重写主机,但不能在映像中持久存储该配置。

上面提到的解决方案确实指的是我上面建议的码头作业方案:

  • 运行一个内部 DNS; 您可以将默认 DNS 服务器设置为在守护进程中使用; 这样,每个启动的容器都将在默认情况下自动使用配置的 DNS
  • 使用 docker 撰写并向您的开发人员提供 docker-compose.yml
    Docker 撰写文件允许您指定在启动容器时应该使用的所有选项,因此开发人员可以直接使用 docker 撰写来启动容器,并提供他们需要设置的所有选项。

下面的工作为我安装的文件在多克运行,而不是多克构建

docker service create --name <name>  --mount type=bind,source=/etc/hosts,dst=/etc/hosts   <image>

RUN步骤中不能使用 echo修改映像中的主机文件,因为在从映像启动容器时,docker 守护进程将维护该文件(/etc/hosts)及其内容(hosts 条目)。

然而,可以使用以下方法来实现同样的目标:

ENTRYPOINT ["/bin/sh", "-c" , "echo 192.168.254.10   database-server >> /etc/hosts && echo 192.168.239.62   redis-ms-server >> /etc/hosts && exec java -jar ./botblocker.jar " ]

这里需要注意的关键是按照 docker 文档的建议使用 exec命令。使用 执行委员会将使 java 命令成为容器的 PID 1。Docker 中断只会回应这个。

参见 https://docs.docker.com/engine/reference/builder/#entrypoint

只是一个运行容器的快速答案,使用:

docker exec -it <container name> /bin/bash

一旦集装箱打开:

cd ..

那么

`cd etc`

然后你就可以了

cat hosts

或:

apt-get update
apt-get vim

或者任何你喜欢的编辑器,然后在 vim 中打开它,这里你可以修改你的启动 ip 到0.0.0.0

我认为 Docker 最近增加了 --add-host标志,这是真正伟大的 Docker 构建。

[编辑] 因此,这个特性在 < a href = “ https://docs.docker.com/release-note/docker-ce/# 17040-ce-2017.04.05”rel = “ noReferrer”> 17.04.0-ce 上更新

有关如何使用带有 --add-host标志的 docker build的详细信息,请访问: https://docs.docker.com/edge/engine/reference/commandline/build/

由于这仍然是谷歌的第一个答案,我将提供可能的解决方案。

给你获得的命令对我来说非常有用(Docker 1.13.1,Ubuntu 16.04) :

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name>' >> /etc/hosts"

如果这对任何人都有用的话,那么 HOSTALIASES env 变量对我来说是有用的:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases

您可以在运行 docker 时使用以下命令

docker run [OPTIONS] --add-host example.com:127.0.0.1 <your-image-name>:<your tag>

在这里,我映射 example.com到本地主机 127.0.0.1及其工作。

Tis is me Dockefile
FROM XXXXX
ENV DNS_1="10.0.0.1 TEST1.COM"
ENV DNS_1="10.0.0.1 TEST2.COM"
CMD ["bash","change_hosts.sh"]`


#cat change_hosts.sh
su - root -c "env | grep DNS | akw -F "=" '{print $2}' >> /etc/hosts"
  • 信息
  • 用户必须

您可以在 Docker 运行期间使用 主持人选项。

适用于您的案例: Docker run —— add-host mynginx: 192.168.33.11[ image _ name ] : [ tag ]

这将更新您的 /etc/hosts

你可使用以下命令检查:

  • Docker exec-it [ Container _ id ] sh

如果 不适合你,那么你可以尝试 Bash[垃圾桶]/bin/bash

  • Cat/etc/hosts

我只是创建了一个 sh 脚本并在 start docker 上运行它。

在这个脚本中,我启动所有服务并更新主机文件:

在 Dockerfile 上:

CMD /tmp/init_commands.sh & sleep infinity

Init _ commands. sh

any other commands...
echo "192.168.11.5    XXXXXXX" >> /etc/hosts
echo "192.168.11.6    XXXXXXY" >> /etc/hosts
echo "192.168.11.7    XXXXXXZ" >> /etc/hosts