我想在“docker build”期间更新我的/etc/hosts
文件。
我在Dockerfile中添加了下面的行,但它既没有更新/etc/hosts
文件,也没有给出任何错误。
RUN echo "192.168.33.11 mynginx" >> /etc/hosts
我需要更新 /etc/hosts
。有人可以提供建议吗?
我想在“docker build”期间更新我的/etc/hosts
文件。
我在Dockerfile中添加了下面的行,但它既没有更新/etc/hosts
文件,也没有给出任何错误。
RUN echo "192.168.33.11 mynginx" >> /etc/hosts
我需要更新 /etc/hosts
。有人可以提供建议吗?
extra_hosts
指令来完成此操作。
简而言之:在运行容器时修改其Add hostname mappings.
Use the same values as thedocker run
client--add-host
parameter (which should already be available for docker 1.8).
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
/etc/hosts
,而不是在构建容器时修改。
docker build --add-host
命令(如下所述),但正如在issue 34078和this answer中所评论的那样:
这些链接指向解决问题的策略:
--add-host
功能在构建过程中被设计为允许覆盖主机设置,但不会将该配置持久化到镜像中。
这些解决方案可以利用之前在答案中提到的
- 运行内部DNS;你可以在守护进程中设置默认的DNS服务器,这样每个启动的容器都会自动使用配置的默认DNS。
- 使用Docker Compose并为开发人员提供一个
docker-compose.yml
文件。
Docker Compose文件允许你指定启动容器时应使用的所有选项,因此开发人员只需执行docker compose up即可使用所需的所有选项启动容器。
docker-compose
方法,并使用其extra_hosts
指令。docker exec -it <容器名称> /bin/bash
在机器上打开一个 bash 实例,然后使用你喜欢的命令行编辑器(vim、emacs、nano、echo '' . >>/etc/host)更新 docker 容器主机下的 /etc/host。 - NateAGeek使用RUN
步骤中的echo
无法修改映像中的主机文件,因为当您从该映像启动容器时,Docker守护程序将维护文件(/etc/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
命令。使用exec将使Java命令成为容器的PID 1,Docker中断只会响应该进程。
请参阅https://docs.docker.com/engine/reference/builder/#entrypoint
ENTRYPOINT
不是镜像的指令。它只是在我们从该镜像运行容器时标记一个入口点,这意味着主机的入口点仅在容器运行后存在。我不认为这个要求是必要的。一定有一些误解。 - Light.G我认为Docker最近在docker build中添加了--add-host
标志,这真的很棒。
[编辑] 因此,此功能已在17.04.0-ce上进行更新。
有关如何使用--add-host
标志与docker build
的更多详细信息,请访问:https://docs.docker.com/edge/engine/reference/commandline/build/
--add-host
功能。该功能可用于添加主机名和IP地址映射。 - chutz由于这个问题仍然出现在谷歌搜索结果的第一个答案中,我来贡献一种可能的解决方案。
以下命令取自此处,出乎意料的对我很有效 (Docker 1.13.1, Ubuntu 16.04):
docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name>' >> /etc/hosts"
当运行docker时,您可以使用以下命令:
docker run [OPTIONS] --add-host example.com:127.0.0.1 <your-image-name>:<your tag>
在此示例中,我将example.com
映射到本地主机127.0.0.1
,并且它正在工作。
HOSTALIASES
环境变量对我很有用:echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases
HOSTALIASES
是一个基于 glibc 的环境变量,因此您可以在“任何”地方使用它(除非您是 root,否则它无法与 setuid 可执行文件一起使用,除非您安装了 dnsmasq,否则它也无法与 IP 地址一起使用)。 - Compholio我刚刚创建了一个 sh 脚本,并在启动 Docker 时运行它。
在这个脚本中,我启动所有服务并更新 hosts 文件:
Dockerfile 中:
CMD /tmp/init_commands.sh & sleep infinity
init_comands.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
以下方法对我有效,是在docker运行时挂载文件而不是在docker构建时进行的
docker service create --name <name> --mount type=bind,source=/etc/hosts,dst=/etc/hosts <image>
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"