Sypalo.com
  • en
  • ru
  • Инвестирование
  • ДевОпс
  • Фото
  • Фильмы
  • Контакты
  1. Главная
  2. ДевОпс

Как запустить PowerShell Core в Docker контейнере со сторонними модулями

Sergey Sypalo Sypalo.com

page.title 2019-04-25 10 октября 2020

Идея запуска PowerCLI с необходимыми модулями в контейнере Docker у меня назревала уже давно, и, наконец, я решил эту проблему.

Одной из причин было то, что PowerShell «сломался» на моем компьютере с Windows 10, точнее, он работает, но команда Get-Credential возвращает ошибку. Вторая причина - просто желание экспериментировать на тему.

Оказалось, правда не так просто, подробности ниже. Чтобы запустить PowerShell в контейнере Docker с предварительно загруженными модулями, необходимо выполнить следующие шаги:

  1. Включить поддержку виртуализации в BIOS
  2. Установить Hyper-V, вы можете сделать это так:
  3. Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
    или так so:
    DISM / Online / Enable-Feature / All / FeatureName: Microsoft-Hyper-V
  4. Установить Docker Desktop for Windows
  5. Создайте пустую папку, скажем D:\powershell-docker
  6. Добавьте необходимые модули в подпапку D:\powershell-docker\Modules
  7. Создайте Dockerfile в D:\powershell-docker следующего содержания:
    # Используем существующий Docker образ PowerShell в качестве основы
    FROM mcr.microsoft.com/powershell
    
    # Копировать инструменты управления Cisco UCS в стандартное расположение модулей
    COPY ./Modules ./usr/local/share/powershell/Modules
    
    # Создаем всю структуру каталогов, после чего добавляем путь к модулям в сам файл конфигурации
    RUN mkdir -p /root/.config/powershell/
    RUN echo "Import-Module Cisco.UCSManager"> /root/.config/powershell/Microsoft.PowerShell_profile.ps1
    
  8. Откроем CMD или PowerShell и переходим в D:\powershell-docker
  9. Собираем контейнер docker build -t powershell-docker
  10. Запускаем контейнер: docker run -it powershell-docker

Основная проблема заключалась в том, что когда PowerShell Core запускал контейнер, он создавал новый сеанс и импорт модулей через ENTRYPOINT или CMD ни к чему не приводил, модули были доступны через Get-Module -ListAvailable, но их приходилось импортировать вручную, потому что автозагрузка не работала при использовании команд из доступных, но не импортированных модулей.

Другая найденная странность/ошибка заключается в том, что переменная $profile (если вы просто видите значение этой переменной в контейнере с PowerShell Core, указывает на путь /root/.config/powershell/Microsoft.PowerShell_profile.ps1, но этот файл не существует.

Как я уже говорил выше, нет смысла переопределять профиль, так как в начале нового сеанса $ profile снова будет указывать на то же самое. Поэтому в качестве опции можно создать этот путь и файл и указать в нем список импортируемых модулей, что было сделано выше в Dockerfile.

Я надеюсь, что информация была полезной, если у вас есть какие-либо вопросы, задавайте их в комментариях и отправляйте какие-либо улучшения кода в виде push-запроса на github, где размещен исходный код.


О нас

Sergey Sypalo and Jane Sypalo

Привет, мы Сергей и Женя, брат и сестра, добро пожаловать на наш сайт. Мы имеем более чем 15-летний опыт работы в DevOps, искусстве и фотографии и хотим поделиться им с вами.

Теги

  1. #автоматизация
  2. #амазон
  3. #апгрейд
  4. #безопасность
  5. #виртуализация
  6. #вмваря
  7. #девопс
  8. #докер
  9. #есиксай
  10. #контейнеры
  11. #линукс
  12. #облако
  13. #павершелл
  14. #скрипты
NordVPN - самый быстрый VPN в мире
Sypalo.com © 2020