Печать из контейнера Docker на Windows

Вопрос или проблема

Я пытаюсь создать контейнер на основе 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 для создания образа и запуска контейнера. В контексте работы с принтерами важно учесть несколько аспектов:

  1. Сетевые настройки

    • Вы используете --network nat, что может влиять на доступность принтеров в сети. Возможно, стоит рассмотреть использование host сети, если это применимо в вашем сценарии.
  2. Изоляция контейнера

    • Параметр --isolation=hyperv создает контейнер с высокой степенью изоляции, но это может влиять на доступ к ресурсам хоста, включая принтеры. Возможно, стоит протестировать без этой опции, чтобы проверить, повлияет ли это на доступ к печати.

Ошибка при добавлении принтера

Вы столкнулись с ошибкой при добавлении принтера HP4, при том что PM45 добавляется успешно. Ошибка Add-Printer: An error occurred while performing the specified operation может возникать по ряду причин:

  1. Несоответствие драйвера:

    • Убедитесь, что драйвер для принтера HP4 действительно доступен в контейнере. Иногда, даже если драйвер установлен, он может не иметь полных прав или не поддерживать запрашиваемые функции.
  2. Сетевые ограничения:

    • Если принтер находится в сети, убедитесь, что контейнер имеет доступ к нему. Попробуйте выполнить ping на IP-адрес принтера из контейнера, чтобы убедиться в наличии связи.
  3. Правила безопасности:

    • В случае работы с Windows-контейнерами может возникнуть ограничение на доступ к API, необходимому для взаимодействия с принтерами. Попробуйте запустить контейнер с повышенными правами, используя --privileged.

Предложения по устранению неполадок

  1. Тестирование других драйверов:

    • Попробуйте использовать другой, наиболее распространённый драйвер для HP, например, HP Universal Print Driver, который может обеспечить большую совместимость.
  2. Логирование ошибок:

    • Возможно, Docker не предоставляет достаточно информации об ошибках. Используйте команду Get-Printer в PowerShell внутри контейнера, чтобы получить список доступных принтеров и проверить, были ли изменения применены.
  3. Создание принтера вручную:

    • Если автоматическая установка через Docker не работает, попробуйте выполнить шаги по созданию принтера вручную внутри контейнера после его запуска. Это может дать дополнительные подробности об ошибках или недостатках в процессе.
  4. Конфигурация печати через пакетные скрипты:

    • Рассмотрите возможность создания отдельного скрипта, который будет запускаться при старте контейнера, и в котором будут выполняться команды по добавлению принтеров.

Заключение

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

Для дополнительной информации и примеров конфигурации вы можете обратиться к официальной документации Microsoft по печати из контейнеров, доступной по эту ссылку.

Оцените материал
Добавить комментарий

Капча загружается...