Docker, определение операционной системы хоста

Docker, определение операционной системы хоста

Я создаю настройку разработки для веб-приложения с Docker. У нас есть разработчики, работающие в Windows, Mac и Linux. Все будут использовать контейнеры Linux, но все еще есть проблемы, которые затрагивают только пользователей Windows.

Я не собираюсь запускать приложение иначе, чем в продакшне. Скорее, это инструментарий вокруг настройки разработчика должен быть другим.

Есть ли способ определить операционную систему хоста из контейнера Docker?

решение1

Вы действительно хотите это сделать?

Я знаю, что вам не понравится ответ на рамочный вопрос, но, пожалуйста, проявите терпение.

Проблемы, с которыми вы сталкиваетесь, возникают из-за того, что запуск Docker на базе Linux в Windows — это хак. Конечно, вы можете столкнуться с проблемами файловой системы Windows, но могут быть и другие проблемы, о которых я не знаю.

Теперь, как я понимаю, вы хотите добавить в свой проект специфичные для платформы обходные пути, чтобы разрешить его запуск в виртуальной машине на хостах Windows. Исходя из моего опыта, я бы рекомендовал избегать этого.

  1. Windows не является целевой платформой для вашего проекта. Добавление решений для проблем, специфичных для Windows, вносит ненужную сложность. Ненужная сложность означает увеличение стоимости обслуживания и потенциальные ошибки, которые в противном случае не возникли бы.

  2. Вы, скорее всего, столкнетесь с большим количеством проблем, вызванных несовместимостью файловой системы, которые не являются строго проблемами проекта, но все же добавляют ненужных хлопот в Windows. Например, git разваливается, когда кто-то вносит изменения в имена файлов, учитывающие только регистр, в файловых системах, чувствительных к регистру (например, Linux), а другой человек переносит эти изменения на машину Windows.

Реальным решением было бы разрабатывать в среде, максимально похожей на предполагаемую. Это означает - на реальном хосте Linux или в виртуальной машине Linux. Это гарантирует, что разработчики не будут тратить время (и деньги) на проблемы, которые существуют только на их платформе разработки. Это также гарантирует, что они не пропустят проблемы, которые не проявляются в Windows.

Вашему клиенту все равно, работает ли продукт в Linux VM на Windows. Ваши разработчики в любом случае должны быть знакомы с Linux, поскольку вы ориентируетесь на Linux как на единственную платформу.Вы действительно хотите тратить ресурсы на проблемы, которых не существует в реальных сценариях?

решение2

У меня была точно такая же проблема. Наш поток веб-разработки Angular зависит от изменений файлов, обнаруженных с помощью webpack на отображенных томах.

К сожалению, Windows не передает события файловой системы (этот fseventsпакет всегда предупреждает во время установки NPM)

решение3

Для macOS или любой другой ОС разработчики могут задать это в своем локальном профиле оболочки:

export IS_HOST_MACOS='true'
export HOST_UNAME=$(uname)

Затем перейдите в докер через:

docker run -e IS_HOST_MACOS -i HOST_UNAME

Наконец, используйте его внутри какого-нибудь скрипта Docker:

# This is meant to help developers know when the server has booted
if [ -n "${IS_HOST_MACOS+1}" ]; then
  [ "$IS_HOST_MACOS" == "true" ] && echo '{"Nginx is ready":""}';
fi

решение4

Поскольку контейнер выполняется в имитируемой среде, вы сможете различать хосты Windows и Linux по предоставленному виртуальному оборудованию.

Например, из этот ответ Я предполагаю, что Docker в Windows создаст сетевое устройство под названием «vEthernet (DockerNAT)».

У меня нет среды для тестирования, поэтому вам придется самостоятельно найти работающее решение для вашей среды(сред).

Связанный контент