主机和容器之间的 OSX Docker 桌面文件共享不适用于通过 docker-compose 的 /etc/hosts


service:
volumes:
- ~/.gitconfig:/root/.gitconfig
- ~/.pgpass:/root/.pgpass
- $SSH_AUTH_SOCK:/ssh-agent
- /etc/hosts:/etc/hosts
environment:
- SSH_AUTH_SOCK=/ssh-agent

在运行时,我尝试修改容器内的/etc/hosts

#!/bin/sh
alias_host_name="db"
container_ip=$(hostname -I|awk -F  '{ print $(NF) }')
echo "Set route: $alias_host_name -> $container_ip"
grep -q $alias_host_name /etc/hosts
hosts_have_alias=$(echo $?)
if [ $hosts_have_alias -ne 0 ]; then
# no data for alias_host_name
echo "$container_ip $alias_host_name" >> /etc/hosts
else
# data for alias_host_name already exists
cp /etc/hosts ~/hosts.new
reg_exp_ip="((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5]).){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])"
sed -ri "s/$reg_exp_ip t$alias_host_name/$container_ip $alias_host_name/" ~/hosts.new
sed -ri "s/$reg_exp_ip $alias_host_name/$container_ip $alias_host_name/" ~/hosts.new
cat ~/hosts.new > /etc/hosts
fi

所以我希望/etc/hosts 会有新行

它在Linux上工作正常

谢谢你的帮助!

Docker 为您管理/etc/hosts文件。 不能在映像中提供它或绑定装载它。/etc/resolv.conf也是如此,这是Docker为容器提供网络环境的一部分。

对于您展示的内容,您根本不需要/etc/hosts。 如果在 Docker Compose 中运行容器,它会自动在容器之间提供 DNS 解析,因此主机名db引用在docker-compose.yml文件中声明为db:的容器。 这是开箱即用的;您无需执行任何操作即可使此功能正常工作。

如果需要为容器指定备用名称,可以在docker-compose.yml文件中为其声明aliases:。 不过,需要这个有点不寻常。

严重依赖/etc/hosts通常不是最佳做法。 在多个环境中保持主机文件同步是很困难的,在你隐藏已存在的主机名的示例中,不同程序中的行为可能会有所不同(取决于它是使用系统解析程序还是仅使用真正的 DNS(。 但是,如果必须,您可以在docker-compose.yml文件中指定extra_hosts:,让 Docker 为您设置它。

最新更新