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

问题描述 投票:55回答:10

我想在“docker build”期间更新我的/etc/hosts文件。

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

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

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

docker dockerfile hosts
10个回答
95
投票

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

添加主机名映射。 使用与docker run client --add-host parameter相同的值(它应该已经可用于docker 1.8)。

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

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


使用Docker 17.x +,你有一个docker build --add-host提到的below,但是,如issue 34078this answer所评论:

构建期间的--add-host功能旨在允许在构建期间覆盖主机,但不能在映像中保留该配置。

提到的解决方案确实参考了我上面提到的docker-compose:

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

-8
投票

只需使用以下命令快速回答您的容器:

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

一旦容器打开:

cd ..

然后

`cd etc`

然后你就可以了

cat hosts

要么:

apt-get update
apt-get vim

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


19
投票

您无法在echo步骤中使用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 " ]

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

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


14
投票

我认为docker最近将--add-host标志添加到docker build中,这真的很棒。

[编辑]所以这个功能在17.04.0-ce上更新了

有关如何使用docker build--add-host旗帜的更多细节,请访问:https://docs.docker.com/edge/engine/reference/commandline/build/


9
投票

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

来自here的命令令人惊讶地为我工作(Docker 1.13.1,Ubuntu 16.04):

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

2
投票

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

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

1
投票

我正在使用AWS Elasticbeanstalk + Docker + Supervisord。

Quick answer

只需在Dockerfile中添加一些代码即可。

CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;

1
投票

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

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

在这里,我将example.com映射到localhost 127.0.0.1及其工作。


-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"
  • 信息
  • 用户必须苏

-2
投票

下面通过在docker run而不是docker build期间挂载文件为我工作

docker service create --name <name>  --mount type=bind,source=/etc/hosts,dst=/etc/hosts   <image>
© www.soinside.com 2019 - 2024. All rights reserved.