为什么/ etc / hosts文件在我的docker容器中为空?

时间:2015-06-16 17:22:53

标签: docker

我在包含单个Haskell应用程序的https://github.com/snoyberg/haskell-scratch之后创建了一个最小的docker容器。运行时,应用程序工作正常,但它无法从/etc/hosts解析主机,因为它是空的,这意味着链接无法正常工作(或者至少我需要使用不切实际的数字地址......)。

我可以看到容器配置中HostsPath指向的文件已正确填充,但似乎在容器启动时会被覆盖。

在Mac OS X Yosemite上,docker版本为1.6.2。

Container分为几个阶段。第一阶段使用特殊填充的文件系统构建容器:

FROM ubuntu:trusty  
MAINTAINER arnaud@capital-match.com

RUN apt-get install -qqy libgmp-dev netbase

ADD . /

RUN chmod +x /create_rootfs.sh
RUN /create_rootfs.sh 

create_rootfs.sh文件包含以下内容:

 #!/bin/sh

 ROOTFS=/rootfs

 echo "Creating directories"

 mkdir -p /rootfs/bin
 mkdir -p /rootfs/lib
 mkdir /rootfs/lib/x86_64-linux-gnu
 mkdir /rootfs/lib64
 mkdir -p /rootfs/usr/lib/x86_64-linux-gnu/gconv
 # mkdir -p /rootfs/etc

 echo "Copying library files"

 cp -L /bin/sh /rootfs/bin/
 #cp -L /etc/protocols /rootfs/etc
 #cp -L /etc/services /rootfs/etc
 cp -L /lib/x86_64-linux-gnu/libc.so.6 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib/x86_64-linux-gnu/libdl.so.2 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib/x86_64-linux-gnu/libm.so.6 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib/x86_64-linux-gnu/libpthread.so.0 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib/x86_64-linux-gnu/libutil.so.1 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib/x86_64-linux-gnu/librt.so.1 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib/x86_64-linux-gnu/libz.so.1 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib/x86_64-linux-gnu/libnss_files.so.2 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib/x86_64-linux-gnu/libnss_dns.so.2 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib/x86_64-linux-gnu/libresolv.so.2 /rootfs/lib/x86_64-linux-gnu/
 cp -L /lib64/ld-linux-x86-64.so.2 /rootfs/lib64/
 cp -L /usr/lib/x86_64-linux-gnu/gconv/UTF-16.so /rootfs/usr/lib/x86_64-linux-gnu/gconv/
 cp -L /usr/lib/x86_64-linux-gnu/gconv/UTF-32.so /rootfs/usr/lib/x86_64-linux-gnu/gconv/
 cp -L /usr/lib/x86_64-linux-gnu/gconv/UTF-7.so /rootfs/usr/lib/x86_64-linux-gnu/gconv/
 cp -L /usr/lib/x86_64-linux-gnu/gconv/gconv-modules /rootfs/usr/lib/x86_64-linux-gnu/gconv/
 cp -L /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache /rootfs/usr/lib/x86_64-linux-gnu/gconv/
 cp -L /usr/lib/x86_64-linux-gnu/libgmp.so.10 /rootfs/usr/lib/x86_64-linux-gnu/

然后我导出这个文件系统的内容构建一个

docker run capitalmatch / tinybuilder tar -cC / rootfs。 | docker import - capitalmatch / tiny

最终容器是根据" tiny"构建的,添加了一些.tar.gz个文件。然后运行:

docker run --link stunnel:monitor capitalmatch/app

stunnel容器的运行方式为:

docker run --name=stunnel -p 5555:5555 -v $(pwd)/stunnel:/etc/stunnel capitalmatch/stunnel

我希望/etc/hosts包含monitor的条目,在安装之前确实如此。当我运行另一个用更多经典"方式,例如基于ubuntu:trusty, I found the / etc / hosts`文件要正确填充,一切正常,所以我怀疑它是容器构建的方式阻碍了。

2 个答案:

答案 0 :(得分:5)

每次根据您运行容器的方式重新生成

/etc/hosts

此外,如果你在Dockerfile中把这个东西放到这个文件中......这将持续到所有图层的构建过程结束,但是当容器启动时会被删除。

  

编辑网络配置文件

     

从Docker v.1.2.0开始,您现在可以在正在运行的容器中编辑/ etc / hosts,/ etc / hostname和/etc/resolve.conf。如果您需要安装可能覆盖其中一个文件的bind或其他服务,这将非常有用。

     

但请注意,对这些文件的更改不会通过docker commit保存,也不会在docker run期间保存。这意味着它们不会保存在图像中,也不会在重新启动容器时持续存在;他们只会“坚持”在一个正在运行的容器中。

     

来源:https://docs.docker.com/articles/networking/#editing-networking-config-files

如果容器中的/etc/hosts文件不包含预期的条目,这意味着您可能没有正确初始化容器。

请提供有关如何实际运行容器或简化的信息,请准备好docker-compose.yml文件。

答案 1 :(得分:0)

我没有答案,但我有一个解决方法:使用

 FROM busybox
 ...

一切正常。