【问题标题】:Serial port access fails when Java app is Dockerized当 Java 应用程序被 Dockerized 时,串行端口访问失败
【发布时间】:2020-06-07 08:12:09
【问题描述】:

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

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"]

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

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

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

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

【问题讨论】:

    标签: java linux docker dockerfile


    【解决方案1】:

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

    或许你可以试试chowning it

    【讨论】:

    • 我找不到说明与 --device 共享的设备是 root 拥有的参考,我也看不到图像。您发布的链接是否正确?
    • 是的,似乎链接的哈希部分有点损坏,在添加主机设备上,它在 /dev 文件夹上运行 ls,所有设备都是 root 拥有的
    猜你喜欢
    • 2023-02-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多