Приложение My Spring Boot использует библиотеку jSerialComm (v2.6.0) для последовательной передачи данных через порт USB. В документации jSerialComm отмечается важность добавления пользователя в число групп:
Примечание для Linux пользователей: доступ к последовательному порту ограничен определенными пользователями и группами в Linux. Чтобы разрешить доступ пользователей, вы должны открыть терминал и ввести следующие команды, прежде чем jSerialComm сможет получить доступ к портам вашей системы. Не беспокойтесь, если некоторые команды не будут выполнены. Все эти группы могут существовать не в каждом Linux дистрибутиве. (Обратите внимание, что этот процесс должен выполняться только один раз для каждого пользователя):
sudo usermod -a -G uucp username
sudo usermod -a -G dialout username
sudo usermod -a -G lock username
sudo usermod -a -G tty username
Итак, я написал файл Docker следующим образом:
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
(и, временно сжимая в str aws, --privileged
) в команду docker run
.
Когда приложение запускается, регистрация подтверждает, что /dev/ttyACM0
найдено в порядке. Но когда приложение пытается прочитать данные с последовательного порта, оно получает непрерывные нули. (Примечание: видел это несколько раз, прежде чем переместить приложение на Docker, и это было симптомом c USB-порта, который уже используется.)
Если я закомментирую USER spring:spring
(то есть разрешить приложение, которое запускается как root), все в порядке.
Как я могу заставить эту работу работать без root привилегий?