Идея запуска PowerCLI с необходимыми модулями в контейнере Docker у меня назревала уже давно, и, наконец, я решил эту проблему.
Одной из причин было то, что PowerShell «сломался» на моем компьютере с Windows 10, точнее, он работает, но команда Get-Credential возвращает ошибку. Вторая причина - просто желание экспериментировать на тему.
Оказалось, правда не так просто, подробности ниже. Чтобы запустить PowerShell в контейнере Docker с предварительно загруженными модулями, необходимо выполнить следующие шаги:
- Включить поддержку виртуализации в BIOS
- Установить Hyper-V, вы можете сделать это так:
- Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
или так so:
DISM / Online / Enable-Feature / All / FeatureName: Microsoft-Hyper-V - Установить Docker Desktop for Windows
- Создайте пустую папку, скажем D:\powershell-docker
- Добавьте необходимые модули в подпапку D:\powershell-docker\Modules
- Создайте 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
- Откроем CMD или PowerShell и переходим в D:\powershell-docker
- Собираем контейнер docker build -t powershell-docker
- Запускаем контейнер: 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, где размещен исходный код.