如何在"docker build"期间更新Docker镜像中的/ etc/hosts文件

Pra*_*ash 86 hosts docker dockerfile

我想/etc/hosts在"docker build"期间更新我的文件.

我在Dockerfile中添加了以下行,但它既没有更新/etc/hosts文件也没有给出任何错误.

RUN echo "192.168.33.11    mynginx" >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)

我需要更新/etc/hosts.任何人都可以建议吗?

Von*_*onC 121

使用更新版本的docker,可以使用docker-compose及其extra_hosts指令完成

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

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"
Run Code Online (Sandbox Code Playgroud)

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

  • 我想更改 docker 映像中的 /etc/hosts。 (7认同)
  • @PrakashSingh 您可以通过`docket exec -it <container name> /bin/bash` 在机器上打开一个 bash 实例,然后使用您首选的命令行编辑器(vim、emacs、纳米,回声''。>>/>)。 (2认同)
  • 为了解决docker build期间rocker / shiny install.packages的问题--add-host:cran.rstudio.com:<IPaddress>为我解决了这个问题。 (2认同)

Shu*_*ngh 22

您无法使用echoin RUN步骤修改映像中的主机文件,因为当您从映像启动容器时,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 " ]
Run Code Online (Sandbox Code Playgroud)

这里要注意的关键是使用exec命令作为docker文档建议.使用exec会使java命令成为容器的PID 1.Docker中断只会响应.

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

  • 如果您正在寻找 kubenetes 解决方案,您可以使用 hostAliases。https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ 就像 docker 撰写 extra_hosts 一样。 (2认同)

Bil*_*eng 16

我认为docker最近--add-host为docker build 添加了标志,这真的很棒.

[编辑]因此该功能于17.04.0-ce更新

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

  • CentOS 上的 Docker 12 上提供了 `--add-host` 功能。 (3认同)
  • 我想强调的是“添加此标志的主机仅在构建期间使用;它故意不应该保留在图像中” https://github.com/moby/moby/issues/34078 (3认同)

小智 9

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

这里获取的命令令人惊讶地为我工作(Docker 1.13.1,Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"
Run Code Online (Sandbox Code Playgroud)

  • 当您重新启动容器时,这将被原始容器**覆盖**! (2认同)

Asa*_*eel 6

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

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

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


小智 5

如果这对任何人都有用,那么HOSTALIASESenv 变量对我有用:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases
Run Code Online (Sandbox Code Playgroud)

  • 您不会将 docker 与 kubernetes 混淆吗?我在 docker 文档中没有看到任何 HOSTALIASES 变量 (9认同)