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 为您设置它。