Как получить доступ к сетевой директории из контейнера Docker?

Имеется сеть, в которой находится несколько сетевых принтеров. Данные принтеры доступны по путям вроде такого: \\ServerName\PrinterName (для Windows).

Я пишу приложение на Java, которое будет отправлять документы на печать путём простой записи файла в сетевую директорию.

File fileToPrint = new File(fileName);
File printerFolder = new File(printerName);

try (FileInputStream fis = new FileInputStream(fileToPrint);
     FileOutputStream fos = new FileOutputStream(printerFolder)) {
    IOUtils.copy(fis, fos);
} catch (IOException e) {
    throw new RuntimeException(e);
}

Данный код работает великолепно, когда я запускаю программу локально на своём компьютере (Windows), который находится внутри сети. Но это перестаёт работать, если я запускаю Docker-контейнер в wsl.

Мой вопрос: каким образом я могу получить доступ к сетевым директориям из контейнера Docker (в качестве базы для образа используется linux)?


Ответы (2 шт):

Автор решения: eri

В линукс нет файлового доступа к сетевым папкам виндовс. Можно подключить доступ к файлам, но не к принтеру.

Можно попытаться печатать вызвав программу smbclient с некими параметрами и писать через неё.

Типовое решение - запустить cups. В cups подключить принтер. Печать выполнять через стандартные методы языка или через IPP или LPR.

Также можно установить IPP или LPR сервер сразу на windows.

Рекомендую IPP.

→ Ссылка
Автор решения: Zhenyria

Я воспользовался CUPS-сервером. Для этого я использовал Docker image olbat/cupsd ссылка.

Подключение к серверу я выполнял при помощи библиотеки cups4j:

try (var fileInputStream = getPrintingDocumentAsStream(documentName)) {
    CupsClient cupsClient = new CupsClient(cupsServerHost, cupsServerPort);
    CupsPrinter printer = cupsClient.getPrinter(printerName);

    if (Objects.isNull(printer)) {
        throw new RuntimeException();
    }

    PrintJob printJob = new PrintJob.Builder(fileInputStream).build();

    PrintRequestResult printRequestResult = printer.print(printJob);
    if (printRequestResult.isSuccessfulResult()) {
        throw new RuntimeException();
    }
} catch (Exception e) {
    throw new RuntimeException(e.getMessage());
}
→ Ссылка