java - 当 Java 应用程序被 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"]
...我在命令中包括--device=/dev/ttyACM0:/dev/ttyACM0
(并且,暂时抓住稻草,--privileged
)docker run
。
当应用程序启动时,记录确认/dev/ttyACM0
发现正常。但是当应用程序尝试从串行端口读取时,它会收到连续的零。(注意:在将应用程序移至 Docker 之前曾多次看到此问题,这表明 USB 端口已在使用中。)
如果我注释掉USER spring:spring
(即允许包含的应用程序以 root 身份运行)一切都很好。
如何在没有 root 权限的情况下完成这项工作?
解决方案
推荐阅读
- xna - 在顶点着色器novadays中使用纹理的方法是什么?
- android - React Native app.json 重复资源
- android - Xamarin.Android、AndroidManifest.xml、AndroidManifestMerger、xmlns:tools 架构,始终手动替换
- c++ - [hh:mm:ss:msms] 格式的时间戳 C++
- embedded-linux - 关于 yocto /etc/os-release 版本控制
- python - 深度卷积训练损失没有减少
- javascript - React Semantic UI Form,提交表单后不向用户提供保存密码
- python - 尝试在产品页面上抓取尺寸时出现 Python 超时错误
- c# - AsNoTracking() 不返回未保存的更改
- python - 查找子字符串避免使用递归函数