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

Sypalo.com

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

Идея запуска 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, где размещен исходный код.