gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:47:06 26 4
gpt4 key购买 nike

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

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

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

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

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运行capitalmatch / tinybuilder tar -cC / rootfs。 | docker 进口-大写匹配/小

最终的容器是从“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`文件进行了正确填充,并且一切正常,因此我怀疑这是妨碍容器构建的方式。

最佳答案

每次根据容器的运行方式重新生成/etc/hosts
此外,如果您在Dockerfile中的文件中添加了一些内容,这将一直持续到所有层的构建过程结束,但在启动容器时将被清除掉。

Editing networking config files

Starting with Docker v.1.2.0, you can now edit /etc/hosts, /etc/hostname and /etc/resolve.conf in a running container. This is useful if you need to install bind or other services that might override one of those files.

Note, however, that changes to these files will not be saved by docker commit, nor will they be saved during docker run. That means they won't be saved in the image, nor will they persist when a container is restarted; they will only "stick" in a running container.

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


如果容器中的 /etc/hosts文件不包含预期的条目,则意味着您可能未正确初始化容器。
请提供信息,您实际上是如何运行容器的,或者为了简化起见,只是准备了 docker-compose.yml文件。

关于docker - 为什么我的Docker容器中的/etc/hosts文件为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30874184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com