繁体   English   中英

Docker 化 Java 应用程序时串行端口访问失败

[英]Serial port access fails when Java app is Dockerized

我的 Spring Boot 应用程序使用 jSerialComm 库 (v2.6.0) 通过 USB 端口进行串行通信。 jSerialComm 文档指出了将用户添加到多个组的重要性:

Linux 用户注意事项:串行端口访问仅限于 Linux 中的某些用户和组。 要启用用户访问,您必须打开终端并输入以下命令,然后 jSerialComm 才能访问系统上的端口。 如果某些命令失败,请不要担心。 并非所有这些组都存在于每个 Linux 发行版中。 (请注意,此过程只能为每个用户执行一次):

sudo usermod -a -G uucp 用户名

sudo usermod -a -G 拨出用户名

sudo usermod -a -G 锁定用户名

sudo usermod -a -G tty 用户名

所以我写了 Dockerfile 如下:

FROM adoptopenjdk:11-jre-hotspot

# Run application as non-root user to help to mitigate some risks
RUN groupadd -r spring && useradd -r spring -g spring && \
 usermod -a -G uucp spring && \
 usermod -a -G dialout spring && \
 usermod -a -G tty spring
# `lock` group doesn't seem to exist, hence commented-out:
# usermod -a -G lock spring
USER spring:spring

COPY /Java/tempctrl/build/libs/*.jar app.jar

EXPOSE 80

ENTRYPOINT ["java", "-jar", "/app.jar"]

...我在--privileged docker run命令中包含--device=/dev/ttyACM0:/dev/ttyACM0 (并且,暂时抓住稻草, --privileged )。

当应用程序启动时,日志记录确认/dev/ttyACM0已找到。 但是当应用程序尝试从串行端口读取时,它会收到连续的零。 (注意:在将应用程序移至 Docker 之前看过几次,这表明 USB 端口已在使用中。)

如果我注释掉USER spring:spring (即允许包含的应用程序以 root 身份运行),一切都很好。

如何在没有 root 权限的情况下进行这项工作?

根据Docker 文档,与--device共享的设备似乎是 root 拥有的(参见链接中的图像)。

或许你可以试试chown吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM