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

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

我可以看到HostsPath在容器configuration中指向的文件被正确填充,但似乎在容器启动的某个时刻被覆盖。

docker版在Mac OS X Yosemite上是1.6.2。

集装箱分几个阶段build造。 第一阶段使用特殊的文件系统构build一个容器:

 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/ 

然后我导出这个文件系统的内容build立一个

docker run capitalmatch / tinybuilder tar -cC / rootfs。 | docker导入 – 资本匹配/小

最终的容器是从“小”build立,添加一些.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的条目,在挂载之前确实是这样的。 当我运行另一个以更经典的方式构build的容器时,例如基于ubuntu:trusty, I found the trusty ubuntu:trusty, I found the / etc / hosts文件被正确填充,一切正常,所以我怀疑这是容器的构build方式挡道。

每次根据运行容器的方式来重新生成/etc/hosts

而且,如果你在Dockerfile中join了这个文件,这将会持续到所有图层的构build过程结束,但是当容器启动的时候会被清除。

编辑networkingconfiguration文件

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

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

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

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

请提供信息如何真正运行您的容器或简化,只需准备docker-compose.yml文件。

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

  FROM busybox ... 

一切正常。