我有一个直接安装到/ usr / local / share / ca-certificates -folder的Docker卷。
certificate-folder:/usr/local/share/ca-certificates:ro
我正在使用Tomcat进行此设置,但是其他框架也可能遇到类似的问题。 Dockerfile的基础是这样的:
FROM tomcat:8.5-jre8
# other Dockerfile configuration
CMD ["/start.sh"]
使用包含关键行的start.sh
#!/usr/bin/env bash
update-ca-certificates
# other startup related tasks
catalina.sh run
此设置的问题在于,只要我以root用户身份运行容器,它就可以正常工作。但是,如果我尝试使用类似以下的方法在Dockerfile的末尾更改为指定用户,
ENV TOMCAT_USER="tomcat" \
TOMCAT_UID="8080" \
TOMCAT_GROUP="tomcat" \
TOMCAT_GID="8080"
RUN groupadd -r --gid $TOMCAT_GID $TOMCAT_GROUP && \
useradd -r --uid $TOMCAT_UID --gid $TOMCAT_GID $TOMCAT_USER
RUN chown -R $TOMCAT_USER:$TOMCAT_GROUP /usr/local/tomcat
USER $TOMCAT_USER
所以:
因此,我最终会遇到这样的SSL问题
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
那么,如果我仍然希望以指定的$ TOMCAT_USER身份运行容器,那么解决此类问题的正确方法是什么?
最佳答案
由于update-ca-certificates
需要root权限才能更新/etc/ssl/certs
中的证书,因此我只看到三种可能的方法(和一种可行的解决方案-下面的第三种解决方案):
update-ca-certificates
,并在RUN update-ca-certificates
行之前添加USER $TOMCAT_USER
命令。 (但是,您正在使用的卷在构建时将不可用,因此无法使用…)sudo
授予$TOMCAT_USER
权限(无密码),然后将update-ca-certificates
替换为sudo update-ca-certificates
。 (但是,从安全 Angular 来看,此解决方案可能并不令人满意...)USER $TOMCAT_USER
;保留CMD ["/start.sh"]
或ENTRYPOINT ["/start.sh"]
(如果您愿意);并依靠gosu工具,该工具的主要用例就是从根用户降级为非特权用户,同时享有比sudo w.r.t.更好的行为。 TTY和信号转发。您只需要通过执行以下操作来安装
gosu
:RUN apt-get update -y -q && \
DEBIAN_FRONTEND=noninteractive \
apt-get install -y -q --no-install-recommends gosu
(因为
tomcat:8.5-jre8
基于Debian),并通过以下方式使用它:#!/usr/bin/env bash
update-ca-certificates
# other startup related tasks
exec gosu $TOMCAT_UID:$TOMCAT_GID catalina.sh run
关于docker - 将ca证书添加到以指定用户运行的Tomcat Docker容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53413071/