如何在RHEL8容器中用TLS Toolkit配置NiFi的HTTPS
解决NiFi容器化HTTPS配置的两个关键问题
我来帮你一步步搞定这两个困扰你的问题,先从Dockerfile里的文件复制异常说起:
问题1:构建阶段复制证书到conf目录后,ls看不到文件
这其实是apache/nifi官方镜像的一个特性:它的/opt/nifi/nifi-current/conf目录被声明为VOLUME。在Docker构建阶段,对VOLUME目录的修改不会被保留到最终镜像中——容器启动时,Docker会自动挂载一个空的卷(或之前关联的数据卷)覆盖这个目录,导致你构建时复制的文件“消失”了。
解决方案:在容器启动时复制证书+修改配置
我们需要把证书生成到非VOLUME目录,然后在容器启动脚本里完成证书复制和HTTPS配置,而不是在构建阶段做这些操作。
第一步:修改Dockerfile
FROM apache/nifi:latest USER root WORKDIR /opt/nifi/nifi-current # 用tls-toolkit生成证书到临时目录(避开VOLUME),指定自定义密码可选(这里用nifi123为例) RUN /opt/nifi/nifi-toolkit-current/bin/tls-toolkit.sh standalone \ -n "localhost" \ -C "CN=user_1, OU=NiFi" \ -P nifi123 \ -o /tmp/nifi-certs # 复制自定义启动脚本到容器内 COPY --chown=nifi:nifi start-nifi-with-https.sh /opt/nifi/nifi-current/bin/ RUN chmod +x /opt/nifi/nifi-current/bin/start-nifi-with-https.sh EXPOSE 19443 USER nifi ENTRYPOINT ["/opt/nifi/nifi-current/bin/start-nifi-with-https.sh"]
第二步:编写启动脚本start-nifi-with-https.sh
在本地创建这个脚本,和Dockerfile放在同一目录下:
#!/bin/bash set -e # 1. 把生成的证书复制到conf目录 cp -fv /tmp/nifi-certs/localhost/* /opt/nifi/nifi-current/conf/ # 2. 修改nifi.properties,禁用HTTP,启用HTTPS CONF_FILE="/opt/nifi/nifi-current/conf/nifi.properties" # 清空HTTP端口,禁用HTTP连接器 sed -i 's/^nifi.web.http.port=.*/nifi.web.http.port=/' "$CONF_FILE" sed -i 's/^nifi.web.http.host=.*/nifi.web.http.host=/' "$CONF_FILE" # 设置HTTPS端口(当前用19443,后续改9443只需改这里) sed -i 's/^nifi.web.https.port=.*/nifi.web.https.port=19443/' "$CONF_FILE" # 配置密钥库/信任库路径和密码(和tls-toolkit指定的密码一致) sed -i 's/^nifi.security.keystore=.*/nifi.security.keystore=./conf/keystore.jks/' "$CONF_FILE" sed -i 's/^nifi.security.keystoreType=.*/nifi.security.keystoreType=JKS/' "$CONF_FILE" sed -i 's/^nifi.security.keystorePasswd=.*/nifi.security.keystorePasswd=nifi123/' "$CONF_FILE" sed -i 's/^nifi.security.truststore=.*/nifi.security.truststore=./conf/truststore.jks/' "$CONF_FILE" sed -i 's/^nifi.security.truststoreType=.*/nifi.security.truststoreType=JKS/' "$CONF_FILE" sed -i 's/^nifi.security.truststorePasswd=.*/nifi.security.truststorePasswd=nifi123/' "$CONF_FILE" # 3. 启动NiFi(用run模式让进程前台运行,符合容器规范) /opt/nifi/nifi-current/bin/nifi.sh run
第三步:构建并启动容器
# 构建镜像 docker build -t my_nifi . # 启动容器(不要设置NIFI_WEB_HTTP_PORT环境变量!) docker run --name my_nifi -p 19443:19443 -d my_nifi
问题2:手动复制后重启,出现HTTP/HTTPS冲突错误
这个问题的核心是:你启动容器时还设置了NIFI_WEB_HTTP_PORT='19443'环境变量,它会强制覆盖nifi.properties里的HTTP配置,导致NiFi同时尝试启动HTTP和HTTPS连接器。
解决方案:彻底禁用HTTP
- 移除启动命令中的
-e NIFI_WEB_HTTP_PORT='19443'参数 - 确保nifi.properties中以下配置正确:
nifi.web.http.port= nifi.web.http.host= nifi.web.https.port=19443
按上面的启动脚本配置后,这些都会自动处理,不需要手动修改。
后续切换到9443的注意事项
只需要做两处修改:
- 启动脚本里的
nifi.web.https.port=19443改成9443 - 启动容器时的端口映射改成
-p 9443:9443
内容的提问来源于stack exchange,提问作者Blueko
相关产品推荐
相关产品推荐

