Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
74f9daa
feat: add custom root CA certificate import support
Piyush0049 Feb 13, 2026
b474ae5
fix: force LF line endings for scripts and Dockerfiles
Piyush0049 Feb 13, 2026
c161d52
fix: refine CA cert import and improve script robustness
Piyush0049 Feb 13, 2026
4bc1903
feat: add support for custom root CA certificates
Piyush0049 Feb 13, 2026
f050b58
fix: restore files and apply clean custom CA cert feature
Piyush0049 Feb 13, 2026
f6a80a6
fix: resolve JAVA_HOME inside container in CA cert test
Piyush0049 Feb 13, 2026
a6daba6
fix: use keytool instead of openssl for test cert generation
Piyush0049 Feb 13, 2026
15f288b
fix: run cert generation as root to avoid permission denied
Piyush0049 Feb 13, 2026
d0e9b6b
Merge remote-tracking branch 'upstream/master' into feature/custom-ca…
Piyush0049 Feb 14, 2026
d5aab3a
fix: address CI test failures with improved robustness and permissions
Piyush0049 Feb 14, 2026
bf2bc9d
Merge branch 'master' into feature/custom-ca-cert-import
Piyush0049 Feb 15, 2026
287486e
Merge branch 'master' into feature/custom-ca-cert-import
Piyush0049 Feb 15, 2026
96d58c0
Merge branch 'master' into feature/custom-ca-cert-import
Piyush0049 Feb 20, 2026
2368d53
Merge branch 'master' into feature/custom-ca-cert-import
Piyush0049 Mar 6, 2026
a9e5b71
refactor: remove CA cert import feature per reviewer feedback
Piyush0049 Mar 6, 2026
fa410e0
fix: simplify CA certificate init-container test
Piyush0049 Mar 6, 2026
9d373c7
Merge branch 'master' into feature/custom-ca-cert-import
Piyush0049 Mar 16, 2026
bf4eb34
Merge branch 'master' into feature/custom-ca-cert-import
Piyush0049 Mar 16, 2026
6b54858
Merge branch 'master' into feature/custom-ca-cert-import
lemeurherve May 22, 2026
0bb6014
final jenkins.io link
lemeurherve Jun 19, 2026
3d6655e
Merge branch 'master' into feature/custom-ca-cert-import
lemeurherve Jun 19, 2026
a9d359e
Merge branch 'master' into feature/custom-ca-cert-import
lemeurherve Jun 24, 2026
9c28382
Merge branch 'master' into feature/custom-ca-cert-import
lemeurherve Jul 7, 2026
ab2b064
Merge branch 'master' into feature/custom-ca-cert-import
lemeurherve Jul 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
* text=auto eol=lf
*.sh text eol=lf
jenkins-support text eol=lf
Dockerfile* text eol=lf
*.sh binary
# Ignore the binary line above, it was a mistake in my thought process.
# Better:
*.sh text eol=lf
jenkins-support text eol=lf
Dockerfile* text eol=lf
*.key text eol=lf
*.gpg text eol=lf
*.adoc text eol=lf
*.md text eol=lf
*.txt text eol=lf
*.xml text eol=lf
*.groovy text eol=lf
*.ps1 text eol=crlf
*.psm1 text eol=crlf
Makefile text eol=lf
Jenkinsfile text eol=lf
docker-bake.hcl text eol=lf
89 changes: 47 additions & 42 deletions alpine/hotspot/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ COPY jdk-download-url.sh /usr/bin/jdk-download-url.sh
COPY jdk-download.sh /usr/bin/jdk-download.sh

RUN apk add --no-cache \
ca-certificates \
gnupg \
jq \
curl \
&& rm -fr /var/cache/apk/* \
&& /usr/bin/jdk-download.sh alpine
ca-certificates \
gnupg \
jq \
curl \
&& rm -fr /var/cache/apk/* \
&& /usr/bin/jdk-download.sh alpine

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove these changes to white space. They distract from the other changes.


ENV PATH="/opt/jdk-${JAVA_VERSION}/bin:${PATH}"

Expand All @@ -24,22 +24,22 @@ ENV PATH="/opt/jdk-${JAVA_VERSION}/bin:${PATH}"
# while still saving space (approx 200mb from the full distribution)
# hadolint ignore=SC2086
RUN java_major_version="$(jlink --version 2>&1 | cut -c1-2)"; \
if [ "$java_major_version" = "25" ]; then \
cp -r "/opt/jdk-${JAVA_VERSION}" /javaruntime; \
else \
case "$java_major_version" in \
"17") options="--compress=2" ;; \
"21") options="--compress=zip-6" ;; \
*) echo "ERROR: unmanaged jlink version pattern" && exit 1 ;; \
esac; \
jlink \
--strip-java-debug-attributes \
${options} \
--add-modules ALL-MODULE-PATH \
--no-man-pages \
--no-header-files \
--output /javaruntime; \
fi
if [ "$java_major_version" = "25" ]; then \
cp -r "/opt/jdk-${JAVA_VERSION}" /javaruntime; \
else \
case "$java_major_version" in \
"17") options="--compress=2" ;; \
"21") options="--compress=zip-6" ;; \
*) echo "ERROR: unmanaged jlink version pattern" && exit 1 ;; \
esac; \
jlink \
--strip-java-debug-attributes \
${options} \
--add-modules ALL-MODULE-PATH \
--no-man-pages \
--no-header-files \
--output /javaruntime; \
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove these changes to white space. They distract from the other changes.


# Jenkins version being bundled in this docker image
ARG JENKINS_VERSION=2.549
Expand All @@ -58,18 +58,18 @@ RUN curl -fsSL "${WAR_URL}" -o /war/jenkins.war \
FROM alpine:"${ALPINE_TAG}" AS controller

RUN apk add --no-cache \
bash \
coreutils \
curl \
git \
git-lfs \
musl-locales \
musl-locales-lang \
openssh-client \
tini \
ttf-dejavu \
tzdata \
unzip \
bash \
coreutils \
curl \
git \
git-lfs \
musl-locales \
musl-locales-lang \
openssh-client \
tini \
ttf-dejavu \
tzdata \
unzip \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove these changes to white space. They distract from the other changes.

&& git lfs install

ENV LANG=C.UTF-8
Expand Down Expand Up @@ -132,10 +132,15 @@ ENV PATH="${JAVA_HOME}/bin:${PATH}"
COPY --from=jre-and-war /javaruntime $JAVA_HOME
COPY --from=jre-and-war /war/jenkins.war /usr/share/jenkins/jenkins.war

# Allow the jenkins user to import custom CA certificates at runtime
RUN cp "${JAVA_HOME}/lib/security/cacerts" "${JAVA_HOME}/lib/security/cacerts.original" \
&& chown ${user}:${group} "${JAVA_HOME}/lib/security/cacerts"

USER ${user}

COPY jenkins-support /usr/local/bin/jenkins-support
COPY jenkins.sh /usr/local/bin/jenkins.sh
COPY import-custom-certs.sh /usr/local/bin/import-custom-certs.sh
COPY jenkins-plugin-cli.sh /bin/jenkins-plugin-cli

ARG JENKINS_VERSION=2.549
Expand All @@ -144,11 +149,11 @@ ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"]

# metadata labels
LABEL \
org.opencontainers.image.vendor="Jenkins project" \
org.opencontainers.image.title="Official Jenkins Docker image" \
org.opencontainers.image.description="The Jenkins Continuous Integration and Delivery server" \
org.opencontainers.image.version="${JENKINS_VERSION}" \
org.opencontainers.image.url="https://www.jenkins.io/" \
org.opencontainers.image.source="https://github.com/jenkinsci/docker" \
org.opencontainers.image.revision="${COMMIT_SHA}" \
org.opencontainers.image.licenses="MIT"
org.opencontainers.image.vendor="Jenkins project" \
org.opencontainers.image.title="Official Jenkins Docker image" \
org.opencontainers.image.description="The Jenkins Continuous Integration and Delivery server" \
org.opencontainers.image.version="${JENKINS_VERSION}" \
org.opencontainers.image.url="https://www.jenkins.io/" \
org.opencontainers.image.source="https://github.com/jenkinsci/docker" \
org.opencontainers.image.revision="${COMMIT_SHA}" \
org.opencontainers.image.licenses="MIT"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove these changes to white space. They distract from the other changes.

81 changes: 43 additions & 38 deletions debian/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ COPY jdk-download.sh /usr/bin/jdk-download.sh

RUN apt-get update \
&& apt-get install --no-install-recommends -y \
ca-certificates \
curl \
gnupg \
jq \
ca-certificates \
curl \
gnupg \
jq \
&& rm -rf /var/lib/apt/lists/* \
&& /usr/bin/jdk-download.sh

Expand All @@ -28,22 +28,22 @@ ENV PATH="/opt/jdk-${JAVA_VERSION}/bin:${PATH}"
# while still saving space (approx 200mb from the full distribution)
# hadolint ignore=SC2086
RUN java_major_version="$(jlink --version 2>&1 | cut -c1-2)"; \
if [ "$java_major_version" = "25" ]; then \
cp -r "/opt/jdk-${JAVA_VERSION}" /javaruntime; \
else \
case "$java_major_version" in \
"17") options="--compress=2" ;; \
"21") options="--compress=zip-6" ;; \
*) echo "ERROR: unmanaged jlink version pattern" && exit 1 ;; \
esac; \
jlink \
--strip-java-debug-attributes \
${options} \
--add-modules ALL-MODULE-PATH \
--no-man-pages \
--no-header-files \
--output /javaruntime; \
fi
if [ "$java_major_version" = "25" ]; then \
cp -r "/opt/jdk-${JAVA_VERSION}" /javaruntime; \
else \
case "$java_major_version" in \
"17") options="--compress=2" ;; \
"21") options="--compress=zip-6" ;; \
*) echo "ERROR: unmanaged jlink version pattern" && exit 1 ;; \
esac; \
jlink \
--strip-java-debug-attributes \
${options} \
--add-modules ALL-MODULE-PATH \
--no-man-pages \
--no-header-files \
--output /javaruntime; \
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove these changes to white space. They distract from the other changes.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review! I'll revert the unnecessary whitespace changes and the .gitattributes file to keep the PR clean.


# Jenkins version being bundled in this docker image
ARG JENKINS_VERSION=2.549
Expand All @@ -63,16 +63,16 @@ FROM debian:"${DEBIAN_RELEASE_LINE}-${DEBIAN_VERSION}${DEBIAN_VARIANT}" AS contr

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
git \
libfontconfig1 \
libfreetype6 \
procps \
ssh-client \
tini \
unzip \
tzdata \
ca-certificates \
curl \
git \
libfontconfig1 \
libfreetype6 \
procps \
ssh-client \
tini \
unzip \
tzdata \
&& rm -rf /var/lib/apt/lists/*

# Git LFS is not available from a package manager on all the platforms we support
Expand Down Expand Up @@ -145,10 +145,15 @@ ENV PATH="${JAVA_HOME}/bin:${PATH}"
COPY --from=jre-and-war /javaruntime $JAVA_HOME
COPY --from=jre-and-war /war/jenkins.war /usr/share/jenkins/jenkins.war

# Allow the jenkins user to import custom CA certificates at runtime
RUN cp "${JAVA_HOME}/lib/security/cacerts" "${JAVA_HOME}/lib/security/cacerts.original" \
&& chown ${user}:${group} "${JAVA_HOME}/lib/security/cacerts"

USER ${user}

COPY jenkins-support /usr/local/bin/jenkins-support
COPY jenkins.sh /usr/local/bin/jenkins.sh
COPY import-custom-certs.sh /usr/local/bin/import-custom-certs.sh
COPY jenkins-plugin-cli.sh /bin/jenkins-plugin-cli

ARG JENKINS_VERSION=2.549
Expand All @@ -157,11 +162,11 @@ ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/jenkins.sh"]

# metadata labels
LABEL \
org.opencontainers.image.vendor="Jenkins project" \
org.opencontainers.image.title="Official Jenkins Docker image" \
org.opencontainers.image.description="The Jenkins Continuous Integration and Delivery server" \
org.opencontainers.image.version="${JENKINS_VERSION}" \
org.opencontainers.image.url="https://www.jenkins.io/" \
org.opencontainers.image.source="https://github.com/jenkinsci/docker" \
org.opencontainers.image.revision="${COMMIT_SHA}" \
org.opencontainers.image.licenses="MIT"
org.opencontainers.image.vendor="Jenkins project" \
org.opencontainers.image.title="Official Jenkins Docker image" \
org.opencontainers.image.description="The Jenkins Continuous Integration and Delivery server" \
org.opencontainers.image.version="${JENKINS_VERSION}" \
org.opencontainers.image.url="https://www.jenkins.io/" \
org.opencontainers.image.source="https://github.com/jenkinsci/docker" \
org.opencontainers.image.revision="${COMMIT_SHA}" \
org.opencontainers.image.licenses="MIT"
Empty file added import-custom-certs.sh
Empty file.
5 changes: 5 additions & 0 deletions jenkins.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ fi
: "${COPY_REFERENCE_FILE_LOG:="${JENKINS_HOME}/copy_reference_file.log"}"
: "${REF:="/usr/share/jenkins/ref"}"

# Import custom CA certificates if the script exists
if [ -f /usr/local/bin/import-custom-certs.sh ]; then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this condition? Either the script is part of the image or it is not. I suggest to remove the condition which makes no sense.

Did you use an LLM for this (curious question, won't block your contribution but will help us to focus the review)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You are correct. Since the script is explicitly copied in the dockerfile, the file existence check is redundant.. I will remove it.
Regarding your question: yes, I used an LLM to help draft the implementation

bash /usr/local/bin/import-custom-certs.sh
fi

if ! [ -r "${JENKINS_HOME}" ] || ! [ -w "${JENKINS_HOME}" ]; then
echo "INSTALL WARNING: User: ${USER} missing rw permissions on JENKINS_HOME: ${JENKINS_HOME}"
fi
Expand Down
79 changes: 42 additions & 37 deletions rhel/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ COPY jdk-download-url.sh /usr/bin/jdk-download-url.sh
COPY jdk-download.sh /usr/bin/jdk-download.sh

RUN dnf install --disableplugin=subscription-manager --setopt=install_weak_deps=0 --setopt=tsflags=nodocs --allowerasing -y \
ca-certificates \
curl \
jq \
&& dnf clean --disableplugin=subscription-manager all \
&& /usr/bin/jdk-download.sh
ca-certificates \
curl \
jq \
&& dnf clean --disableplugin=subscription-manager all \
&& /usr/bin/jdk-download.sh

ENV PATH="/opt/jdk-${JAVA_VERSION}/bin:${PATH}"

Expand All @@ -23,22 +23,22 @@ ENV PATH="/opt/jdk-${JAVA_VERSION}/bin:${PATH}"
# while still saving space (approx 200mb from the full distribution)
# hadolint ignore=SC2086
RUN java_major_version="$(jlink --version 2>&1 | cut -c1-2)"; \
if [ "$java_major_version" = "25" ]; then \
cp -r "/opt/jdk-${JAVA_VERSION}" /javaruntime; \
else \
case "$java_major_version" in \
"17") options="--compress=2" ;; \
"21") options="--compress=zip-6" ;; \
*) echo "ERROR: unmanaged jlink version pattern" && exit 1 ;; \
esac; \
jlink \
--strip-java-debug-attributes \
${options} \
--add-modules ALL-MODULE-PATH \
--no-man-pages \
--no-header-files \
--output /javaruntime; \
fi
if [ "$java_major_version" = "25" ]; then \
cp -r "/opt/jdk-${JAVA_VERSION}" /javaruntime; \
else \
case "$java_major_version" in \
"17") options="--compress=2" ;; \
"21") options="--compress=zip-6" ;; \
*) echo "ERROR: unmanaged jlink version pattern" && exit 1 ;; \
esac; \
jlink \
--strip-java-debug-attributes \
${options} \
--add-modules ALL-MODULE-PATH \
--no-man-pages \
--no-header-files \
--output /javaruntime; \
fi

# Jenkins version being bundled in this docker image
ARG JENKINS_VERSION=2.549
Expand All @@ -62,14 +62,14 @@ ARG TARGETARCH
ARG COMMIT_SHA

RUN dnf install --disableplugin=subscription-manager --setopt=install_weak_deps=0 --setopt=tsflags=nodocs -y \
fontconfig \
freetype \
git \
git-lfs \
unzip \
which \
tzdata \
&& dnf clean --disableplugin=subscription-manager all
fontconfig \
freetype \
git \
git-lfs \
unzip \
which \
tzdata \
&& dnf clean --disableplugin=subscription-manager all

ARG user=jenkins
ARG group=jenkins
Expand Down Expand Up @@ -136,10 +136,15 @@ ENV PATH="${JAVA_HOME}/bin:${PATH}"
COPY --from=jre-and-war /javaruntime $JAVA_HOME
COPY --from=jre-and-war /war/jenkins.war /usr/share/jenkins/jenkins.war

# Allow the jenkins user to import custom CA certificates at runtime
RUN cp "${JAVA_HOME}/lib/security/cacerts" "${JAVA_HOME}/lib/security/cacerts.original" \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the intent of this instruction exactly? I don't see why duplicating certificates and changing permissions has any reason to be?

@Piyush0049 Piyush0049 Feb 19, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I realize the chown introduces a security concern, if Jenkins is compromised, the attacker gains write access to the truststore. A safer alternative would be to copy cacerts to JENKINS_HOME at startup and point the JVM at that copy via -Djavax.net.ssl.trustStore, keeping the system keystore root-owned. Would you prefer that approach?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I'm asking about the purpose of this line change:

  • Why making a backup of the certificates? What is the exact use case or reason? (at first sight, it makes no sense to me so an explanation is expected)
  • And then why even using the chown command? What problem does it solve exactly?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We’re using chown so the non-root jenkins user actually has permission to update the system truststore (cacerts) at runtime. Without this, the keytool command in our entrypoint just hits a permissions wall and fails. I’ve also added a cacerts.original backup as a safety net, just in case we need to roll back to the default upstream state.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doing such a backup is more a VM/bare metal behavior. In a container image, usually aimed at being immutable, it's better to use volumes. Your proposal above to copy the cert store at runtime makes better sense.

I'm more worried by the permissions change to jenkins. It's opening a security door which we might now want to open.

I wonder if, instead, documenting how to generate the new cacert would'nt be better instead? (either with docker run commands like your bats test and showing an example with a Dockerfile since such certificate are usually not updated often: baking them in user custom image could help them while keeping the cacert with proper root permissions

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both approaches sound good to me. Once everyone align on the final scope, let me know and I'll get started on the changes.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe worth a page in www.jenkins.io instead? WDYT @krisstern @timja @MarkEWaite ?

I like the idea of documentation, especially with the idea of Docker compose. There are other places on jenkins.io that would benefit from more use of Docker compose. This would be a good step towards wider use of Docker compose in the Jenkins documentation.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the alignment everyone! I'll:

  • Update this PR to include just the validation test (per @timja's suggestion)
  • Open a separate PR on jenkins.io with the full documentation page covering the Docker Compose and Kubernetes init-container approaches
  • Add a brief "Custom CA Certificates" section in the README here linking to the jenkins.io docs page

Would that work?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the alignment everyone! I'll:

  • Update this PR to include just the validation test (per @timja's suggestion)
  • Open a separate PR on jenkins.io with the full documentation page covering the Docker Compose and Kubernetes init-container approaches
  • Add a brief "Custom CA Certificates" section in the README here linking to the jenkins.io docs page

Would that work?

@MarkEWaite @timja @krisstern @dduportal Hi everyone, just a gentle ping on this! Please let me know if this plan looks good to you all. I'd love to get started on these changes once we have alignment.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That looks good to me, thanks!

&& chown ${user}:${group} "${JAVA_HOME}/lib/security/cacerts"

USER ${user}

COPY jenkins-support /usr/local/bin/jenkins-support
COPY jenkins.sh /usr/local/bin/jenkins.sh
COPY import-custom-certs.sh /usr/local/bin/import-custom-certs.sh
COPY jenkins-plugin-cli.sh /bin/jenkins-plugin-cli

ARG JENKINS_VERSION=2.549
Expand All @@ -148,11 +153,11 @@ ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"]

# metadata labels
LABEL \
org.opencontainers.image.vendor="Jenkins project" \
org.opencontainers.image.title="Official Jenkins Docker image" \
org.opencontainers.image.description="The Jenkins Continuous Integration and Delivery server" \
org.opencontainers.image.version="${JENKINS_VERSION}" \
org.opencontainers.image.url="https://www.jenkins.io/" \
org.opencontainers.image.source="https://github.com/jenkinsci/docker" \
org.opencontainers.image.revision="${COMMIT_SHA}" \
org.opencontainers.image.licenses="MIT"
org.opencontainers.image.vendor="Jenkins project" \
org.opencontainers.image.title="Official Jenkins Docker image" \
org.opencontainers.image.description="The Jenkins Continuous Integration and Delivery server" \
org.opencontainers.image.version="${JENKINS_VERSION}" \
org.opencontainers.image.url="https://www.jenkins.io/" \
org.opencontainers.image.source="https://github.com/jenkinsci/docker" \
org.opencontainers.image.revision="${COMMIT_SHA}" \
org.opencontainers.image.licenses="MIT"