Очередь печати принтера в контейнерах WindowsPrint Spooler in Windows Containers

Приложения с зависимостью от служб печати можно успешно включить в контейнеры Windows.Applications with a dependency on printing services can be containerized successfully with Windows containers. Для успешного включения функциональных возможностей службы принтера необходимо выполнить особые требования.There are special requirements that must be met in order to successfully enable printer service functionality. В этом руководстве объясняется, как правильно настроить развертывание.This guide explains how to properly configure your deployment.

Важно!

Несмотря на возможность получить доступ к службам печати в контейнерах, функциональные возможности будут ограничены по своей форме: некоторые действия, связанные с печатью, могут не работать.While getting access to printing services successfully in containers works, functionality is limited in form; some printing-related actions may not work. Например, приложения, зависящие от установки драйверов принтера на узле, нельзя добавить в контейнеры, так как установка драйвера в контейнере не поддерживается.For example, apps that have a dependency on installing printer drivers into the host cannot be containerized because driver installation from within a container is unsupported. Если вы нашли неподдерживаемую функцию печати, поддержка которой в контейнерах вам необходима, отправьте отзыв.Please open a feedback below if you find an unsupported printing feature that you want to be supported in containers.

УстановкаSetup

  • На узле должна быть установлена ОС Windows Server 2019 или Windows 10 Pro или Корпоративная за октябрь 2018 года или более поздней версии.The host should be Windows Server 2019 or Windows 10 Pro/Enterprise October 2018 update or newer.
  • Целевым базовым образом должен быть образ mcr.microsoft.com/windows.The mcr.microsoft.com/windows image should be the targeted base image. У других базовых образов контейнеров Windows (например, Nano Server и Windows Server Core) отсутствует роль сервера печати.Other Windows container base images (such as Nano Server and Windows Server Core) do not carry the Printing Server Role.

Изоляция Hyper-VHyper-V Isolation

Рекомендуется запускать контейнер с изоляцией Hyper-V.We recommend running your container with Hyper-V isolation. При запуске в этом режиме можно запустить любое необходимое количество контейнеров с доступом к службам печати.When run in this mode, you can have as many containers as you want running with access to the print services. При этом нет необходимости изменять службу очереди печати на узле.You do not need to modify the spooler service on the host.

Проверить функциональность можно с помощью следующего запроса PowerShell:You can verify functionality with the following PowerShell query:

PS C:\Users\Administrator> docker run -it --isolation hyperv mcr.microsoft.com/windows:1809 powershell.exe
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\> Get-Service spooler

Status   Name               DisplayName
------   ----               -----------
Running  spooler            Print Spooler


PS C:\> Get-Printer

Name                           ComputerName    Type         DriverName                PortName        Shared   Published
----                           ------------    ----         ----------                --------        ------   --------
Microsoft XPS Document Writer                  Local        Microsoft XPS Document... PORTPROMPT:     False    False
Microsoft Print to PDF                         Local        Microsoft Print To PDF    PORTPROMPT:     False    False
Fax                                            Local        Microsoft Shared Fax D... SHRFAX:         False    False


PS C:\>

Изоляция процессовProcess Isolation

Из-за общего характера ядра контейнеров, изолированных от процессов, при текущем поведении пользователи могут запускать только один экземпляр службы очереди печати принтера на узле и во всех его дочерних контейнерах.Due to the shared kernel nature of process-isolated containers, current behavior limits the user to running only one instance of the printer spooler service across the host and all its container children. Если на узле запущена очередь печати принтера, прежде чем пытаться запустить службу принтера в гостевой системе, необходимо остановить службу на узле.If the host has the printer spooler running, you must stop the service on the host before attemping to launch the printer service in the guest.

Совет

Если запустить контейнер и запросить службу очереди печати одновременно в контейнере и на узле, то оба будут сообщать о состоянии "Выполняется".If you launch a container and query for the spooler service in both the container and the host simultaneously, both will report their state as 'running'. Однако верить этому не стоит — контейнер не сможет запросить список доступных принтеров.But do not be deceived--the container will not be able to query for a list of available printers. Служба очереди печати узла не должна работать.The host's spooler service must not run.

Чтобы проверить, запущена ли на узле служба принтера, используйте приведенный ниже запрос в PowerShell.To check if the host is running the printer service, use the query in PowerShell below:

PS C:\Users\Administrator> Get-Service spooler

Status   Name               DisplayName
------   ----               -----------
Running  spooler            Print Spooler

PS C:\Users\Administrator>

Чтобы остановить службу очереди печати на узле, используйте приведенные ниже команды в PowerShell.To stop the spooler service on the host, use the following commands in PowerShell below:

Stop-Service spooler
Set-Service spooler -StartupType Disabled

Запустите контейнер и проверьте доступ к принтерам.Launch the container and verify access to the printers.

PS C:\Users\Administrator> docker run -it --isolation process mcr.microsoft.com/windows:1809 powershell.exe
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.


PS C:\> Get-Service spooler

Status   Name               DisplayName
------   ----               -----------
Running  spooler            Print Spooler


PS C:\> Get-Printer

Name                           ComputerName    Type         DriverName                PortName        Shared   Published
----                           ------------    ----         ----------                --------        ------   --------
Microsoft XPS Document Writer                  Local        Microsoft XPS Document... PORTPROMPT:     False    False
Microsoft Print to PDF                         Local        Microsoft Print To PDF    PORTPROMPT:     False    False
Fax                                            Local        Microsoft Shared Fax D... SHRFAX:         False    False


PS C:\>