Как получить доступ к сетевой директории из контейнера 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 шт):
В линукс нет файлового доступа к сетевым папкам виндовс. Можно подключить доступ к файлам, но не к принтеру.
Можно попытаться печатать вызвав программу smbclient с некими параметрами и писать через неё.
Типовое решение - запустить cups. В cups подключить принтер. Печать выполнять через стандартные методы языка или через IPP или LPR.
Также можно установить IPP или LPR сервер сразу на windows.
Рекомендую IPP.
Я воспользовался 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());
}