У меня есть Dockerfile с тремя ограничениями:
1.) Последний оператор USER в Dockerfile должен быть USER tomcat
в целях безопасности (он построен на образе tomcat: 8.5.23-jre8-alpine)
2.) Он не может запустить chmod в каталоге /root/
или $JAVA_HOME
3.) Он должен иметь возможность изменять каталог $JAVA_HOME/lib/security
в точке входа, а не в файле Docker (поскольку сертификаты передаются при запуске контейнера)
На данный момент у меня есть
FROM tomcat:8.5.23-jre8-alpine
#### OTHER IMAGE COMMANDS ####
COPY ./entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chown root:root /usr/local/bin/entrypoint.sh
RUN chmod 4755 /usr/local/bin/entrypoint.sh
USER tomcat
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["catalina.sh", "run"]
Я решил, что предоставление права собственности на файл root и chmod 4755 позволит пользователю tomcat выполнить точку входа, но при этом точка входа будет запущена как root, чтобы он мог изменять файловую систему по своему усмотрению. Однако, когда я запускаю эту строку в точке входа
$JAVA_HOME/bin/keytool -import -alias ca_local -keystore $JAVA_HOME/lib/security/cacerts -storepass XXXXX -noprompt -trustcacerts -file /usr/local/tomcat/certificates/ca-local.cer
Я получаю следующую ошибку:
keytool error: java.io.FileNotFoundException: /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts (Permission denied)
Похоже, что точка входа на самом деле не работает от имени пользователя root, как предполагал chown / chmod. Я знаю, что все мои файлы находятся в правильных местах, потому что, когда я удаляю USER tomcat
из файла Docker, все работает нормально. Что мне не хватает в настройке разрешения точки входа?