我想在“docker build”期间更新我的/etc/hosts
文件。
我在Dockerfile中添加了以下行,但它既没有更新/etc/hosts
文件也没有给出任何错误。
RUN echo "192.168.33.11 mynginx" >> /etc/hosts
我需要更新/etc/hosts
。任何人都可以建议吗?
使用更新版本的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 34078和this answer所评论:
构建期间的
--add-host
功能旨在允许在构建期间覆盖主机,但不能在映像中保留该配置。
提到的解决方案确实参考了我上面提到的docker-compose:
- 运行内部DNS;您可以设置要在守护程序中使用的默认DNS服务器;这样每个容器启动时默认会自动使用配置的DNS
- 使用docker compose并为开发人员提供
docker-compose.yml
。 docker compose文件允许您指定启动容器时应该使用的所有选项,因此开发人员可以使用docker compose来启动容器以及他们需要设置的所有选项。
只需使用以下命令快速回答您的容器:
docker exec -it <container name> /bin/bash
一旦容器打开:
cd ..
然后
`cd etc`
然后你就可以了
cat hosts
要么:
apt-get update
apt-get vim
或者你喜欢的任何编辑器,并在vim中打开它,在这里你可以修改说你的启动IP到0.0.0.0
您无法在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
我认为docker最近将--add-host
标志添加到docker build中,这真的很棒。
[编辑]所以这个功能在17.04.0-ce上更新了
有关如何使用docker build
与--add-host
旗帜的更多细节,请访问:https://docs.docker.com/edge/engine/reference/commandline/build/
由于这仍然是谷歌的第一个答案,我将提供可能的解决方案。
来自here的命令令人惊讶地为我工作(Docker 1.13.1,Ubuntu 16.04):
docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"
如果这对任何人都有用,那么HOSTALIASES
env变量对我有用:
echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases
我正在使用AWS Elasticbeanstalk + Docker + Supervisord。
只需在Dockerfile
中添加一些代码即可。
CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;
您可以在运行docker时使用以下命令
docker run [OPTIONS] <your-image-name>:<your tag> --add-host example.com:127.0.0.1
在这里,我将example.com
映射到localhost 127.0.0.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"
下面通过在docker run而不是docker build期间挂载文件为我工作
docker service create --name <name> --mount type=bind,source=/etc/hosts,dst=/etc/hosts <image>