我在包含单个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`文件要正确填充,一切正常,所以我怀疑它是容器构建的方式阻碍了。
答案 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
...
一切正常。