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


106

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

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

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

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


您是否正在使用boot2docker执行docker构建?
VonC

不,我使用的是Linux版本的docker 1.8。
Prakash

1
当您将映像作为容器运行时,其/ etc / hosts是否不变?还是您指的是Linux主机/ etc / hosts?
VonC

4
在docker build期间成功构建了映像。但是当我使用相同的映像运行容器并检查/ etc / hosts文件时,更改不存在。
Prakash

Answers:


141

对于较新版本的docker,可以使用docker-compose及其指令来完成extra_hosts

添加主机名映射。
使用与docker runclient --add-host参数相同的值(docker 1.8应已可用)。

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

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


随着多克尔17.x +,你有docker build --add-host提到以下,但是,作为评价问题34078这个答案

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

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

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

2
我想更改docker映像中的/ etc / hosts。
Prakash

1
@PrakashSingh我同意,但这似乎并不容易。
VonC

1
@PrakashSingh您可以通过来在计算机上打开bash实例docket exec -it <container name> /bin/bash,然后使用首选的命令行编辑器(vim,emacs,nano,echo''。>> />)在/ ect / host下更新Docker的容器主机。
NateAGeek

@PrakashSingh是的,我们可以(听起来很熟悉...)。但是,当我们通过构建映像而不是运行容器来更改主机条目时,对于Docker而言,这似乎就像是一种黑客。Docker网络设计由应用程序驱动(来自docker.com)。由于主机条目是docker网络的一部分,因此从image运行容器时最好定义它。如果确实需要添加一些主机项,则不必每次都通过构建映像来添加它们,而是将它们一次添加到基本映像中。那是最佳做法。
Light.G

2
为了解决docker build期间rocker / shiny install.packages的问题--add-host:cran.rstudio.com:<IPaddress>为我解决了这个问题。
bvanlew

25

您不能使用echoin RUN步来修改映像中的主机文件,因为从映像启动容器时,docker daemon会维护文件(/ 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 " ]

这里要注意的关键是execdocker文档所建议的命令的使用。使用exec将使java命令作为容器的PID 1。Docker中断只会对此做出响应。

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


ty!这是一个很好的解决方案
xero

1
如果您正在寻找kubenetes解决方案,则可以使用hostAliases。kubernetes.io/docs/concepts/services-networking / ...就像docker组成extra_hosts一样。
Shubham Singh

更确切地说,ENTRYPOINT不是图像指示。仅当我们从该映像运行容器时,它才标记入口点,这意味着主机入口仅在容器运行后才存在。我认为该要求不是必不可少的。一定会有一些误会。
Light.G

17

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

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

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


1
--add-host功能在CentOS的Docker 12上可用。
chutz

1
我想强调一点,“添加了此标志的主机仅在构建期间使用;它不应故意保留在映像中” github.com/moby/moby/issues/34078
Sida Zhou

10

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

这里获取的命令对我来说非常有效(Docker 1.13.1,Ubuntu 16.04):

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

不相关,但仍然有价值。谢谢。
Light.G

4

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

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

3
您不是将docker与kubernetes混淆了吗?我在Docker文档中没有看到任何HOSTALIASES变量
Adrien Lemaire

4

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

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

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


3

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

快速回答

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

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

1

完整答案

  1. 准备您hosts想要添加到Docker容器的自己的文件;
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;

0

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

供您使用: docker run --add-host mynginx:192.168.33.11 [image_name]:[tag]

这将更新您的/ etc / hosts

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

  • 泊坞窗exec -it [container_id] sh

如果sh对您不起作用,则可以尝试bash/ bin / sh/ bin / bash

  • 光盘等
  • 猫主人

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

-2

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

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

使用卷添加文件会增加额外的复杂性,每个主机都必须拥有该文件。
Shubham Singh

-11

只需使用以下命令即可运行容器:

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

容器打开后:

cd ..

然后

`cd etc`

然后你可以

cat hosts

要么:

apt-get update
apt-get vim

或任何您喜欢的编辑器并在vim中打开它,在这里您可以将启动IP修改为0.0.0.0

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.