【发布时间】:2018-07-08 18:27:51
【问题描述】:
我有一个 Dockerfile,它有 3 个约束:
1.) 出于安全考虑,Dockerfile 中的最终 USER 语句必须是 USER tomcat(它是基于 tomcat:8.5.23-jre8-alpine 映像构建的)
2.) 它不能在/root/ 目录或$JAVA_HOME 上运行chmod
3.) 它必须能够修改入口点中的$JAVA_HOME/lib/security 目录,而不是 Dockerfile 中的目录(因为证书是在容器启动时传入的)
到现在为止
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 所暗示的那样。我知道我的所有文件都在正确的位置,因为当我从 Dockerfile 中删除 USER tomcat 时,一切正常。我在设置入口点的权限时缺少什么?
【问题讨论】:
标签: docker sh chmod keytool chown