Docker搭建cups打印机服务器

Docker搭建cups打印机服务器

记忆の风
2022-06-23 / 0 评论 / 78 阅读 / 正在检测是否收录...

1、Docker搭建脚本如下:

X86机器脚本如下:

docker run -d --name=airprint 
--net="host" 
--privileged=true 
-e "CUPS_USER_ADMIN"="admin" 
-e "CUPS_USER_PASSWORD"="pass" 
-e TZ="Asia/Shanghai" 
-e HOST_OS="Synology" 
-e "TCP_PORT_631"="631" 
-v "/airprint_data/config":"/config" 
-v /dev:/dev 
-v "/airprint_data/services":"/etc/avahi/services" 
-v /var/run/dbus:/var/run/dbus 
"mnbf9rca/cups-google-print"
docker run \
       --name=cups \
       --restart=always \
       --net=host \
       --privileged=true \
       -v /var/run/dbus:/var/run/dbus \
       -v /airprint_data/config:/config \
       -v /airprint_data/services:/services \
       --device /dev/bus \
       --device /dev/usb \
       -e CUPSADMIN="admin" \
       -e CUPSPASSWORD="password" \
       tigerj/cups-airprint

注释:root是后端账号,password是密码。

后面步骤都一样,参考老版步骤,选择驱动,共享打印机,直到cups里能打印出测试页面。这时如果去电脑或者手机的打印服务里搜索打印机是搜索不到的。接下来执行命令

docker exec cups service dbus start
docker exec cups service avahi-daemon start

执行之后去电脑或者手机系统自带的打印服务里搜索打印机,怎么样,是不是搜索到了?

2、如何进容器里升级LSB

我现在推荐的方法是直接用新建的容器名,如上面的“cups”,直接执行

sudo docker exec -it cups /bin/bash

省去了docker ps查询容器id。
新建的容器首先执行

sudo apt-get update
然后sudo apt-get install lsb安装lsb。

这个过程更加网速不同,安装需要大概20-30分钟左右。

3、添加打印机驱动

因为各个品牌打印机驱动不同,像佳能,有区分liunx32位,liunx64为,liunx arm64位等,下载的有区分debian跟centos(RPM)。像ubuntu就可以直接使用debian的驱动。
只要先在docker里面wget XXXX.deb,然后再进行安装。

sudo dpkg -i XXXX.deb

如此便已经安装好驱动了。现在进入cups后端进行添加驱动吧。

4、问题解答:

打印机如果断电再开机, 发送打印任务就无法打印了,估计是容器识别不到打印机 必须重启cups。
例如:
(1)我家云装的是灯大的小钢炮系统,管理热插拔的是mdev, 解决方法是 利用mdev程序检测到打印机接入自动执行脚本让cups重启,
在/etc/mdev.conf 文件的最底下添加一行

usb/lp0       0:0 660   @/root/cupsstart.sh

然后再在root目录里添加一个脚本名字 cupsstart.sh 内容

#!/bin/sh
docker restart cups

保存后,把脚本文件的权限改成0777

chmod 777 cupsstart.sh

这样,mdev程序检测到打印机接入,就会触发执行脚本,脚本执行cups重启,很完美,无论cups容器有没有打开,只要打印机通电,容器都会启动或者重启。

(PS:后来发现这段代码有个小瑕疵,会导致后面无法再添加新打印机,不过估计这不是问题,因为家里也就一台打印机,原因是,再添加打印机的时候会导致/dev/usb/lp0 这个节点重新挂载,从而触发脚本重启cups,导致添加打印机界面无法进入,这是个死循环,我找到了完美的解决方法)

方法一:就是不用节点名字/usb/lp0来触发 改为打印机的型号参数 即用

$PRODUCT=3f0/3b17/100    0:0    660      @/root/cupsstart.sh

代替上面那行代码,此处3f0/3b17/100 是打印机的型号参数,可以执行lsusb命令查看。

(2)如果你的设备是armbian系统的话估计要用udev实现开机重启cups(注意:此法只针对docker版cups,如果是原生armbian直装cups,应该不存在这些问题)
在/etc/udev/rules.d目录下新建一条规则,如m1005.rules
内容如下:

ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_VENDOR_ID}=="03f0", ENV{ID_MODEL_ID}=="3b17", RUN+="/root/cupsstart.sh"

ACTION=="remove", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{PRODUCT}=="3f0/3b17/100", RUN+="/root/cupsstop.sh"
注:"3f0/3b17/100"为打印机型号,需要自行更换。其中add段代码中的03f0 3b17 两个数据要跟你你的实际修改,这两个参数可以通过执行lsusb查看到

然后在/root目录里建立两个脚本:cupsstart.sh和cupsstop.sh

#!/bin/sh
docker restart cups
docker exec cups cupsaccept M1005
docker exec cups service dbus start
docker exec cups service avahi-daemon start

这个脚本实现系统一发现打印机接入,就重启cups容器,并设置打印机接受打印任务,另外将avahi服务启动起来。

#!/bin/sh
docker exec cups cupsreject M1005

这个脚本是实现当打印机断电了,设置打印机拒绝打印任务,为什么要这么设置呢,因为打印机断电之后重新上电,cups会接受打印任务,但是却不打印,这时如果重启,重复发送的打印任务全部会打印出来,为了避免这种情况发生,需要在打印机断电之后设置cups拒绝打印任务。
好了这样就完美实现,打印机上电自动启动cups,断电cups拒绝打印任务,并且完美支持airprint,安卓,ios,电脑都能直接搜索到打印机。

(3)openwrt安装的docker, openwrt管理热插拔的是hotplug。
先到目录/etc/hotplug.d/usb,里面有一个10-usb_printer的文件,打开后,修改里面的内容为:

#!/bin/sh
if [ x"$INTERFACE" = x"7/1/1" ] || [ x"$INTERFACE" = x"7/1/2" ]; then
        /usr/bin/usb_printer_hotplug "$PRODUCT" "$ACTION"
fi
sleep 10
    /root/cupsstart.sh

然后到/root目录添加脚本cupsstart.sh

#!/bin/sh
docker restart cups

保存后,把脚本文件的权限改成0777

chmod 777 cupsstart.sh
注:N1等盒子使用的cups,多hp驱动,优先使用。
docker run \
       --name=cups \
       --restart=always \
       --net=host \
       -v /var/run/dbus:/var/run/dbus \
       -v /airprint_data/config:/config \
       -v /airprint_data/services:/services \
       --device /dev/bus \
       --device /dev/usb \
       -e CUPSADMIN="admin" \
       -e CUPSPASSWORD="password" \
       jysky007/cups:v1
0

评论 (0)

取消