Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 主机和容器之间的OSX Docker桌面文件共享不';t通过docker compose与/etc/hosts协作_Macos_Docker_Docker Compose_Hosts - Fatal编程技术网

Macos 主机和容器之间的OSX Docker桌面文件共享不';t通过docker compose与/etc/hosts协作

Macos 主机和容器之间的OSX Docker桌面文件共享不';t通过docker compose与/etc/hosts协作,macos,docker,docker-compose,hosts,Macos,Docker,Docker Compose,Hosts,在运行时,我尝试修改容器中的/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会

在运行时,我尝试修改容器中的/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会有新的产品线

它在linux上运行良好


谢谢你的帮助

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

对于您正在展示的内容,您根本不需要
/etc/hosts
。如果您正在Docker Compose中运行容器,那么主机名
db
将引用在
Docker Compose.yml
文件中声明为
db:
的容器。这是开箱即用的;要使此功能正常工作,您根本不需要做任何事情

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


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

可能是我有不同的情况,我需要通过别名从主机访问容器,并且容器具有动态IP。因此,我的变通方法可以帮助我在机器的/etc/hosts中使用别名。我需要在URL路径中使用别名来打开web。它确实可以在linux上运行,但我需要与OSX兼容(在MACOS/etc/host上,目前只是复制,我无法编辑主机版本的文件),您根本无法在OS X上直接访问容器IP地址,而且在linux上这样做并不受鼓励。但是,您可以在所有平台上可靠地访问主机IP地址上使用
ports:
发布的端口(或者
localhost
如果您在同一系统的容器外部),这是访问容器的标准方式。我的意思是,我使用URL访问web界面,我可以通过IP访问,但这个项目有一些基于主机名的逻辑。我确实需要使用/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