如何在没有反向代理容器的情况下使用 docker-compose 部署启用 HTTPS 的 Jenkins 容器?

How do I deploy HTTPS enabled Jenkins container using docker-compose WITHOUT a reverse proxy container?

我需要使用 docker-compose 部署启用 https 的 Jenkins 容器,而不使用像 Nginx 这样的反向代理,我该如何完成?

我已阅读 this post, this blog post, and this blog post 所有 要求我使用 java 参数部署 .war 文件,例如 --httpPort--httpsPort.

我应该把这些选项放在 docker-compose 文件的什么地方?我还有一个 Dockerfile,其中我 运行 安装了一些命令 post,是否可以将这些选项放在那里?

这是我当前的 docker-compose 文件,可以使用。请注意,我并没有尝试调整此文件中的 http 或 https 端口:

version: '3.7'
services:
  jenkins:
    #image: jenkins/jenkins:lts
    build:
        context: ./
        dockerfile: jenkins.Dockerfile
    privileged: true
    user: root
    expose:
      - 8080
    ports:
      - 50000:50000
    container_name: jenkins
    volumes:
      - ./jenkins_data:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      DOCKER_SOCKET: /var/run/docker.sock
    privileged: true
    networks:
      - jenkins_nw
    restart: unless-stopped

networks:
  jenkins_nw:
    driver: bridge

这是我的 jenkins.Dockerfile:

FROM jenkins/jenkins:lts

ENV http_proxy http://our.proxy.com:2222
ENV https_proxy http://our.proxy.com:2222

USER root


COPY ["./certs/ourrootchain.cer", "/var/jenkins_home"]
RUN \
    cd /tmp \
    && keytool -keystore /opt/java/openjdk/lib/security/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias ourrootchain -file /var/jenkins_home/ourrootchain.cer


RUN apt-get update && apt-get install tcpdump procps net-tools -y

疑难解答

我认为我需要将我的 pkcs12 文件导入密钥库。我在网上阅读的所有指南都指出我需要创建一个新的密钥库。是否可以将我的 pkcs12 导入现有的密钥库?

有什么地方可以定义 运行 中的 java 命令吗?

更新:

我不是 java 专家,所以我不知道“-D”用于虚拟机选项。我现在将“JAVA_OPTS”调整为如下所示 JAVA_OPTS: "-DhttpsPort=8443 -DhttpsCertificate=/var/jenkins_certs/jenkins.crt -DhttpsPrivateKey=/var/jenkins_certs/jenkins.key。我还调整了我的 Dockerfile 以创建 /var/jenkins_certs 目录,并复制实际的证书和私钥。容器部署成功,使用 ps -aux | grep java 我可以看到我的选项实际上正在被使用。然而 netstat -tulpn 仍然显示只有“8080”是开放的。为什么Jenkins容器拒绝使用HTTPS或者不开放我配置的HTTPS端口?

我找到了 this docker hub image jenkins-ssl 查看 the github 我发现他们如何配置他们的证书并添加“JENKINS_OPTS”语句来实际更改我需要的参数。 我在 Dockerfile 中编辑了以下几行,以使用我的自定义证书使其最终运行!

#Commenting this out
#ENV JENKINS_OPTS --httpPort=-1 --httpsPort=8443 --httpsCertificate="$CERT_FOLDER/jenkins.pem" --httpsPrivateKey="$CERT_FOLDER/jenkins.key"

#Copy over custom certs change permissions to jenkins:jenkins
COPY ["./certs/", "/var/jenkins_certs"]
RUN chown -R jenkins:jenkins "/var/jenkins_certs"

#Update root ca with custom trust chain (For web only)
RUN cp /var/jenkins_certs/attrootchain.cer /usr/local/share/ca-certificates && update-ca-certificates

#Update root ca with custom trust chain (for java env)
RUN keytool -keystore /opt/java/openjdk/lib/security/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias ourrootchain -file /var/jenkins_certs/ourrootchain.cer

#run Jenkins options using the custom cert and key
ENV JENKINS_OPTS --httpPort=-1 --httpsPort=8443 --httpsCertificate="/var/jenkins_certs/jenkins.crt" --httpsPrivateKey="/var/jenkins_certs/jenkins.key"

然后运行docker build -t jenkins-ssl ./

现在我可以在我的 docker-compose 文件中使用此图像。或者 运行 作为一个简单的 docker 运行 语句,如下所示:

docker run --name jenkins-ssl -p 443:8443 -p 50000:50000 jenkins-ssl