我想在“docker build”期间更新我的/etc/hosts
文件。
我在Dockerfile中添加了以下行,但它既没有更新RUN echo "192.168.33.11 mynginx" >> /etc/hosts
文件也没有给出任何错误。
/etc/hosts
我需要更新aws s3 sync s3://<yourbucket> .
。任何人都可以建议吗?
答案 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 34078和this 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)
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
hosts
中添加以下行,将Dockerfile
文件复制到容器中COPY hosts /etc/hosts_extra
ENTRYPOINT
或CMD
或CRON
作业,则将以下命令行合并到其中,或至少在正在运行的容器中运行该命令行:cat /etc/hosts_extra >> etc/hosts;
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
您可以使用以下命令进行检查:
如果 sh 不适合您,则可以尝试 bash 或 / bin / sh 或 / bin / bash < / strong>
答案 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"
答案 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