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

时间:2016-07-11 08:57:43

标签: docker dockerfile hosts

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

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

/etc/hosts

我需要更新aws s3 sync s3://<yourbucket> .。任何人都可以建议吗?

12 个答案:

答案 0 :(得分:88)

使用更新版本的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撰写并为您的开发者提供docker-compose.yml   docker compose文件允许您指定启动容器时应该使用的所有选项,因此开发人员可以使用docker进行组合以使用他们需要设置的所有选项启动容器。
  •   

答案 1 :(得分:18)

您无法在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

答案 2 :(得分:14)

我认为docker最近在docker build中添加了--add-host标志,这非常棒。

[编辑] 因此,此功能已在17.04.0-ce

上更新

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

答案 3 :(得分:8)

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

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

完整答案

  1. 准备要添加到docker容器的hosts文件;
1.2.3.4 abc.tv
5.6.7.8 domain.xyz
1.3.5.7 odd.org
2.4.6.8 even.net
  1. 通过在hosts中添加以下行,将Dockerfile文件复制到容器中
COPY hosts /etc/hosts_extra
  1. 如果您知道如何使用ENTRYPOINTCMDCRON作业,则将以下命令行合并到其中,或至少在正在运行的容器中运行该命令行:
cat /etc/hosts_extra >> etc/hosts;
  1. 您无法在Dockerfile中添加以下内容,因为修改将丢失:
RUN cat /etc/hosts_extra >> etc/hosts;

答案 6 :(得分:2)

您可以在docker运行期间使用-add-host 选项。

根据您的情况使用: docker run --add-host mynginx:192.168.33.11 [image_name]:[tag]

这将更新您的 / etc / hosts

您可以使用以下命令进行检查:

  • docker exec -it [container_id] sh

如果 sh 不适合您,则可以尝试 bash / bin / sh / bin / bash < / strong>

  • cd等
  • 猫主人

答案 7 :(得分:1)

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

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

在这里,我正在将example.com映射到本地主机127.0.0.1并正常工作。

答案 8 :(得分:0)

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

快速解答

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

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

答案 9 :(得分:0)

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

答案 10 :(得分:-1)

通过在docker run而不是docker build

期间挂载文件为我工作
docker service create --name <name>  --mount type=bind,source=/etc/hosts,dst=/etc/hosts   <image>

答案 11 :(得分:-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