OSX Docker Общий доступ к файлам рабочего стола между хостом и контейнерами не работает с / etc / hosts через docker -compose - PullRequest
0 голосов
/ 04 февраля 2020
  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

Спасибо за помощь!

1 Ответ

0 голосов
/ 05 февраля 2020

Docker управляет файлом /etc/hosts для вас. Вы не можете предоставить его в образе или привязать к нему. Это также верно для /etc/resolv.conf и является частью того, как Docker обеспечивает сетевое окружение для контейнера.

Для того, что вы показываете, вам вообще не нужен /etc/hosts. Если вы запускаете контейнеры в Docker Compose, автоматически обеспечивает разрешение DNS между контейнерами , поэтому имя хоста db относится к контейнеру, объявленному как db: в файле docker-compose.yml. Это предоставляется из коробки; вам вообще ничего не нужно делать, чтобы эта функция работала.

Если вам нужно дать альтернативное имя контейнеру, вы можете объявить aliases: для него в docker-compose.yml файл. Хотя это было бы немного необычно.

Сильно полагаться на /etc/hosts обычно не лучшая практика. Поддерживать синхронизацию файлов хостов c в разных средах сложно, и в вашем примере, когда вы скрываете имя хоста, которое уже существует, поведение может быть различным в разных программах (в зависимости от того, использует ли он системный преобразователь или только true DNS). Однако, если вам необходимо, вы можете указать extra_hosts: в файле docker-compose.yml, чтобы Docker настроил его для вас.

...