Вопрос или проблема
Я пытаюсь создать контейнер на основе Windows для размещения сервиса, который может печатать.
Мой хост контейнера – Windows Server 2022. У меня установлена последняя версия Docker Desktop, и я использую её для сборки образа:
docker build -t my-app-server-image .
и это для запуска контейнера:
docker run --rm --network nat --name my-container --hostname my-docker --isolation=hyperv -it my-app-server-image cmd
Вот соответствующая часть файла docker. Шаги установки моего приложения опущены:
FROM mcr.microsoft.com/windows/server:ltsc2022
SHELL ["cmd", "/S", "/C"]
#...установить мое приложение...
RUN powershell -Command \
Add-PrinterPort -Name '192.168.21.75' -PrinterHostAddress '192.168.21.75';
Add-PrinterDriver -Name 'Generic / Text Only' -InfPath 'C:\windows\inf\prnge001.inf'; \
Add-Printer -Name 'PM45' -DriverName 'Generic / Text Only' -PortName '192.168.21.75';
Add-PrinterPort -Name '192.168.20.36' -PrinterHostAddress '192.168.20.36';
Add-PrinterDriver -Name 'Microsoft PCL6 Class Driver' -InfPath 'C:\windows\inf\prnms005.inf';
Add-Printer -Name HP4 -DriverName 'Microsoft PCL6 Class Driver' -PortName '192.168.20.36';
Это завершается ошибкой на последней строке (“Add-Printer -Name HP4…”) с сообщением об ошибке:
“Add-Printer: Произошла ошибка при выполнении указанной операции. См. детали ошибки для получения дополнительной информации.”
Но, конечно, деталей ошибки нет.
Принтер PM45 создается успешно, и я могу печатать с его помощью в контейнере, если собираю образ без попытки создать принтер HP4.
Я пробовал комбинации создания порта как локального порта или TCP-порта, ссылаясь непосредственно на принтер (по IP-адресу, как показано выше), или ссылаясь на очередь печати на промежуточном печатном сервере. Я пробовал использовать “Microsoft enhanced Point and Print compatibility driver” и “Microsoft IPP Class Driver” (принтер поддерживает печать IPP и настроен соответствующим образом).
Я пробовал эти различные комбинации из не-контейнера и успешно создавал принтер и печатал. Есть что-то в контейнере Windows, что мешает мне.
Я искал информацию в интернете о печати из контейнера Windows. Вот ссылка от Microsoft, которая, похоже, предполагает, что это возможно:
https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/print-spooler
Но у меня был лишь ограниченный успех. Если кто-то смог создать принтер в контейнере Windows и напечатать что-то, кроме простого текстового документа, мне было бы интересно узнать, как вы это сделали.
Ответ или решение
Печать из контейнера Windows Docker
Печать из контейнера Windows Docker может вызвать сложности, особенно когда дело касается установки и настройки принтеров. В этом ответе мы рассмотрим, как корректно настроить печать в Windows-контейнере, основываясь на ваших описаниях и ошибках.
Инициализация контейнера
Вы используете Windows Server 2022 в качестве хоста и Docker Desktop для создания образа и запуска контейнера. В контексте работы с принтерами важно учесть несколько аспектов:
-
Сетевые настройки
- Вы используете
--network nat
, что может влиять на доступность принтеров в сети. Возможно, стоит рассмотреть использованиеhost
сети, если это применимо в вашем сценарии.
- Вы используете
-
Изоляция контейнера
- Параметр
--isolation=hyperv
создает контейнер с высокой степенью изоляции, но это может влиять на доступ к ресурсам хоста, включая принтеры. Возможно, стоит протестировать без этой опции, чтобы проверить, повлияет ли это на доступ к печати.
- Параметр
Ошибка при добавлении принтера
Вы столкнулись с ошибкой при добавлении принтера HP4
, при том что PM45
добавляется успешно. Ошибка Add-Printer: An error occurred while performing the specified operation
может возникать по ряду причин:
-
Несоответствие драйвера:
- Убедитесь, что драйвер для принтера
HP4
действительно доступен в контейнере. Иногда, даже если драйвер установлен, он может не иметь полных прав или не поддерживать запрашиваемые функции.
- Убедитесь, что драйвер для принтера
-
Сетевые ограничения:
- Если принтер находится в сети, убедитесь, что контейнер имеет доступ к нему. Попробуйте выполнить ping на IP-адрес принтера из контейнера, чтобы убедиться в наличии связи.
-
Правила безопасности:
- В случае работы с Windows-контейнерами может возникнуть ограничение на доступ к API, необходимому для взаимодействия с принтерами. Попробуйте запустить контейнер с повышенными правами, используя
--privileged
.
- В случае работы с Windows-контейнерами может возникнуть ограничение на доступ к API, необходимому для взаимодействия с принтерами. Попробуйте запустить контейнер с повышенными правами, используя
Предложения по устранению неполадок
-
Тестирование других драйверов:
- Попробуйте использовать другой, наиболее распространённый драйвер для HP, например,
HP Universal Print Driver
, который может обеспечить большую совместимость.
- Попробуйте использовать другой, наиболее распространённый драйвер для HP, например,
-
Логирование ошибок:
- Возможно, Docker не предоставляет достаточно информации об ошибках. Используйте команду
Get-Printer
в PowerShell внутри контейнера, чтобы получить список доступных принтеров и проверить, были ли изменения применены.
- Возможно, Docker не предоставляет достаточно информации об ошибках. Используйте команду
-
Создание принтера вручную:
- Если автоматическая установка через Docker не работает, попробуйте выполнить шаги по созданию принтера вручную внутри контейнера после его запуска. Это может дать дополнительные подробности об ошибках или недостатках в процессе.
-
Конфигурация печати через пакетные скрипты:
- Рассмотрите возможность создания отдельного скрипта, который будет запускаться при старте контейнера, и в котором будут выполняться команды по добавлению принтеров.
Заключение
Настройка печати в Windows Docker контейнерах требует тщательной отладки и тестирования. Если вы можете успешно создавать и использовать один принтер, но сталкиваетесь с проблемами при добавлении другого, стоит сосредоточиться на драйверах, сетевых настройках и правах доступа. Подобные конфигурации также могут сильно отличаться в зависимости от сетевого окружения и конкретных характеристик принтеров. Старайтесь проводить систематическое тестирование и вносить изменения по одному, чтобы изолировать проблему.
Для дополнительной информации и примеров конфигурации вы можете обратиться к официальной документации Microsoft по печати из контейнеров, доступной по эту ссылку.