【云原生】docker中连接挂载usb存储

由于项目中有一个备份到外部存储设备的需求,我们用的是docker部署环境

设备:树莓派4B
外接存储:U盘或者移动硬盘(移动硬盘可能因为电压问题不稳定)

模块:file (api接口,主要作用是文件上传下载,管理等)

docker-compose.yml

 component_name:
    container_name: component_name
    image: image:release
    restart: always
    depends_on:
      postgresql:
        condition: service_healthy
    privileged: true
    volumes:
       - /dev:/dev
       - /home/xxxx/data:/data
    environment:
      SQL_DATABASE: file
      SQL_HOST: postgresql
      SQL_PORT: 5432
      SQL_USER: xxxx
      SQL_PASSWORD: xxxx
      DATA_PATH: /data/
      NOTIFY_AMQP_URL: "amqp://xxxx:xxxx@rabbitmq:5672"
      NOTIFY_QUEUE_NAME: fileChangelogs
      NOTIFY_AMQP_ENABLE: "on"
      GIN_MODE: debug
      SENTRY_DSN: https://xxxx
      SENTRY_RELEASE: xxxx@1.0.0
      SENTRY_ENVIRONMENT: release
      RESERVED_SPACE: 40802189312

重点就在于
privileged: true
volumes:
- /dev:/dev

privileged 用于获得宿主机root权限,可以操作/dev设备
然后volumes 将宿主机的 /dev 挂载到 docker 镜像内的/dev,这样usb设备接入的时候,就可以在docker镜像内发现了。

下面就可以在应用内利用接口+shell脚本的方式来挂载usb设备了

挂载脚本

#!/bin/sh

NEW_USB_DEVICE=`ls /dev/ | grep sd..`
FS_TYPE=`blkid|grep /dev/sd..|awk -F'TYPE=' '{print $2}'|awk '{print $1}'|sed  's/"//g'`

echo "Check New Device"
if [ ! -z ${NEW_USB_DEVICE} ]; then
	echo "Check FileSytem Type."
	mkdir /usb-dir >/dev/null 2>&1
	if [[ "${FS_TYPE}" =~ "ntfs" ]]; then
		echo "Mounting NTFS...."
		mount -t ntfs-3g /dev/${NEW_USB_DEVICE} /usb-dir
	else
		echo "Mounting ....."
		mount /dev/${NEW_USB_DEVICE} /usb-dir || mount -t ntfs-3g /dev/${NEW_USB_DEVICE} /usb-dir
	fi
else
	echo "No USB_DEVICE"
	exit 1
fi

MOUNT_INFO=$(df -h | grep "/dev/${NEW_USB_DEVICE}")

# check mounted device
echo "Check Mounted Device"
if [ ! -z "${MOUNT_INFO}" ]; then
	USB_DEVICE=$(ls /dev/| grep sd..)
	if [ ! -z $USB_DEVICE ]; then
		echo "Mount ${USB_DEVICE} Successfully"
		exit 0
	else
		umount /usb-dir
		echo "Device Not Found"
		exit 1
	fi
else
	echo "Mount ${USB_DEVICE} Failed"
	exit 1
fi

执行接口(Gin框架)

// MountUsbDevice 检查USB外置设备是否准备就绪
// @Summary 检查USB外置设备是否准备就绪
// @Description 检查USB外置设备是否准备就绪
// @Tags Backup
// @Accept application/json
// @Produce application/json
// @Param userId query string true "用户id"
// @Success 200 {object} proto.Rsp{results=proto.BackupUSBDevice} "返回值"
// @Router /space/v1/api/backup/mount [POST]
func MountUsbDevice(c *gin.Context) {
	defer c.Request.Body.Close()
	ctx := bpctx.NewCtx(c)

	//var rsp proto.Rsp
	var backupUSBDevice proto.BackupUSBDevice
	if ctx.GetUserId() != 1 {
		ctx.SendErr(proto.CodeUserIdError, nil)
	}
	// 执行挂载检测脚本
	var out bytes.Buffer
	var info bytes.Buffer

	getInfoCmd := exec.Command("sh", "/usr/bin/get_deviceinfo.sh")
	getInfoCmd.Stdout = &info
	infoErr := getInfoCmd.Run()
	if infoErr != nil {
		backupUSBDevice.DeviceName = "未知设备"
	} else {
		backupUSBDevice.DeviceName = info.String()
	}

	//执行挂载
	mountCmd := exec.Command("sh", "/usr/bin/mount_usb.sh")
	mountCmd.Stdout = &out
	err := mountCmd.Run()

	logger.LogI().Interface("stdout", out.String()).Msg("Mount Usb Device")
	if err != nil {
		ctx.SendErr(proto.CodeMountFailed, err)
		return
	} else {
		ctx.SendOk(&backupUSBDevice)
		return
	}
}
在路由器上安装 Docker 是一项相对复杂的任务,因为大多数家用路由器(如 TP-Link、华硕等)通常运行的是嵌入式系统,资源有限且操作系统封闭性强。不过,对于某些具备较高开放性的设备(例如支持 OpenWrt 或 Padavan 系统的路由器),是可以通过刷写固件的方式实现 Docker 的部署。 ### 1. 判断路由器是否支持 Docker 并非所有路由器都适合或能够运行 Docker。首先需要确认以下几点: - 路由器芯片架构是否为 x86、ARM 或其他常见架构。 - 是否有足够的内存和存储空间(Docker 至少需要 256MB 内存和数 MB 存储)。 - 是否支持第三方固件(如 OpenWrt、Padavan、DD-WRT 等)。 如果路由器本身基于 Linux 内核,并支持 USB 接口挂载存储,则更有可能成功部署 Docker。 ### 2. 安装第三方固件(如 OpenWrt) 若原厂固件不支持 Docker,需考虑刷入 OpenWrt 等可扩展固件: #### 安装步骤简要如下: 1. **备份原始固件**,以防刷机失败。 2. 访问 [OpenWrt 官网](https://openwrt.org/) 查找对应型号的固件。 3. 使用路由器管理界面或 TFTP 工具进行刷写。 4. 登录 OpenWrt 系统并配置网络。 ### 3. 安装 Docker 环境 OpenWrt 原生并不包含 Docker 支持,但可通过安装 `docker` 和 `docker-compose` 包来实现: ```bash opkg update opkg install docker docker-compose ``` 之后启动 Docker 服务: ```bash /etc/init.d/docker start ``` ### 4. 启动容器并进行交互 启动一个容器后,若希望与容器进行交互,可在命令中加入 `-i` 参数,以保持标准输入开启状态[^1]: ```bash docker start <container_id> -i ``` ### 5. 配置网络与持久化存储 Docker 在启动时会创建一个名为 `docker0` 的虚拟网桥,默认地址为 `172.17.0.1`,每个容器将被分配 IP 地址,如 `172.17.0.2`、`172.17.0.3` 等,容器之间可通过该网络互相通信[^2]。 为确保数据持久化,建议使用 `-v` 参数将宿主机目录挂载容器中: ```bash docker run -d -v /mnt/sda1:/data myapp ``` ### 6. 实际应用示例:监控路由器硬件信息 如引用[3]所述,在 TP-Link XDR6088 上安装 Docker 并部署 netdata 容器,可以实现对 CPU 温度、负载等信息的监控,并接入 Home Assistant 进行可视化展示。 示例命令如下: ```bash docker run -d --name=netdata \ -p 19999:19999 \ -v /proc:/host/proc:ro \ -v /sys:/host/sys:ro \ --cap-add=SYS_PTRACE \ netdata/netdata ``` 访问 `http://<路由器IP>:19999` 即可查看监控面板。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jaeger1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值