Skip to content

Commit 8287967

Browse files
DSOSP blog post (#103)
* DSOSP blog post Signed-off-by: Mathieu Benoit <mathieu-benoit@hotmail.fr> * cross reference Signed-off-by: Mathieu Benoit <mathieu-benoit@hotmail.fr> --------- Signed-off-by: Mathieu Benoit <mathieu-benoit@hotmail.fr>
1 parent ba4072d commit 8287967

11 files changed

Lines changed: 215 additions & 1 deletion

File tree

357 KB
Loading
199 KB
Loading
300 KB
Loading
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
---
2+
title: Score is now onboarded into the Docker-Sponsored Open Source Program
3+
date: 2026-03-17T00:00:00-00:00
4+
draft: false
5+
description: In this article, we share the learnings and outcomes of the Docker-Sponsored Open Source (DSOS) Program that we are now using as a CNCF project
6+
image: score-dsosp.jpg
7+
author: mathieu-benoit
8+
---
9+
As CNCF Maintainers of the Score project (CNCF Sandbox), we recently embarked on a journey to strengthen our security posture by participating in the Docker Sponsored Open Source Program. This post shares our experience, learnings, and the tangible security improvements we achieved. Our goal is to inspire others to take inspirations of these security best practices by default for their own open source projects, under the CNCF umbrella and not only.
10+
11+
## The Opportunity
12+
13+
In September 2025, [the CNCF announced a partnership with Docker](https://www.cncf.io/announcements/2025/09/18/cncf-expands-infrastructure-support-for-project-maintainers-through-partnership-with-docker/) to expand infrastructure support for project maintainers through the Docker Sponsored Open Source (DSOS) Program. This program offers CNCF projects access to Docker's security scanning tools, container registry, and best practices resources, at no cost.
14+
15+
This aligned perfectly with the discussions that happened during the [Maintainer Summit NA 2025 in Atlanta](https://contribute.cncf.io/blog/2025/11/08/maintainer-summit-update-from-the-project-staff): to collaborate more across CNCF projects and demonstrate security best practices.
16+
17+
The [Docker Sponsored Open Source (DSOS) Program](https://docs.docker.com/docker-hub/repos/manage/trusted-content/dsos-program/) provides several features and benefits to non-commercial open source developers.
18+
19+
The program grants the following perks to eligible projects:
20+
- Repository logo
21+
- Verified Docker-Sponsored Open Source badge
22+
- Insights and analytics
23+
- Access to Docker Scout for software supply chain management
24+
- Removal of rate limiting for developers
25+
- Improved discoverability on Docker Hub
26+
27+
## Docker Hub
28+
29+
**Before:** Score is publishing four containers: three for the CLIs of [`score-compose`](https://github.com/score-spec/score-compose), [`score-k8s`](https://github.com/score-spec/score-k8s) and [`score-radius`](https://github.com/score-spec/score-radius); and the [`sample-score-app`](https://github.com/score-spec/sample-score-app) for demos and testing. We used to publish them in GitHub Container Registry [here](https://github.com/orgs/score-spec/packages).
30+
31+
**After:** Being part of the DSOS Program gives use the opportunity to publish them in Docker Hub, and gain more visibility and trust from the community.
32+
33+
You can now find our four container images [in Docker Hub here](https://hub.docker.com/u/scorespec).
34+
35+
![](docker-hub.jpg)
36+
37+
What's interesting from here is to get more insights about the actual usage by our community, here is an example of some insightful analytics we have access to now:
38+
39+
![](docker-hub-analytics.jpg)
40+
41+
## Docker Scout
42+
43+
**Before:** Score as a CNCF project has been following the [OpenSSF best practices](https://www.bestpractices.dev/en). We also have the [OpenSSF Scorebard GitHub Action](https://securityscorecards.dev/) running continuously. That's a good start, but Score didn't have any security scanning tool per se in place before.
44+
45+
**After:** Being part of the DSOS Program gave us the opportunity to use Docker Scout in our Pull Requests and in our container registry (Docker Hub). This is a huge win for us, getting more insights about CVEs introduced or fixed by a specific Pull Request or a specific Release.
46+
47+
The following snippet shows how we use the `docker/scout-action` step for any Pull Request, by comparing the container image from the `main` branch and the current PR's branch:
48+
49+
```yaml
50+
- name: Docker Scout Comparison between main branch and current PR branch
51+
uses: docker/scout-action@v1
52+
with:
53+
command: compare
54+
image: local://score-compose:pr-${{ github.event.number }}
55+
to: local://score-compose:main
56+
write-comment: true
57+
github-token: ${{ secrets.GITHUB_TOKEN }}
58+
organization: ${{ secrets.DOCKER_HUB_ORG }}
59+
```
60+
61+
Here is an example of the resulting comment of this `docker/scout-action` step:
62+
63+
![](docker-scout-compare.jpg)
64+
65+
We can have the details of the comparison between the two images (before versus after): size, packages updated, added or deleted, CVEs added and removed and also the compliance with our policies defined at our Docker Organization (run as non-root, no critical CVEs, no packages with AGPL v3 licences).
66+
67+
And this is not just about the container images themselves, that's also about the Go librairies used and binaries published. So insightful!
68+
69+
Furthermore, in the Docker Scout admin console, we are also able to get an entire holistic view of the CVEs, the packages, the base images and the policies across all our container images. It has never been so easy to find who is using what and in which version!
70+
71+
![](scout-dashboard.jpg)
72+
73+
## Docker Hardened Images
74+
75+
When [Docker made Hardened Images freely available under Apache 2.0](https://www.docker.com/press-release/docker-makes-hardened-images-free-open-and-transparent-for-everyone/), we saw an opportunity to simplify our security posture while maintaining compatibility with our existing `Dockerfiles` (we were already doing multi-stage builds and were using `distroless` base images) and workflows.
76+
77+
Docker Hardened Images are minimal, security-focused container base images designed to reduce inherited risk in downstream projects. They are built and maintained with security and transparency as defaults, featuring:
78+
- Minimal attack surface: Only required components are included.
79+
- Non-root execution: Images run as non-root by default.
80+
- Supply Chain Security: Includes published SBOMs and SLSA Level 3 build provenance.
81+
- Active Maintenance: Ongoing patching and rebuilds are performed as vulnerabilities are disclosed.
82+
- Open Standards: All images are reproducible, open source, and licensed under Apache 2.0, making them compatible with CNCF governance and distribution models.
83+
84+
The migration was remarkably seamless.
85+
86+
For example for the `score-radius` CLI (using [dhi.io/golang](https://dhi.io/catalog/golang) and [dhi.io/static](https://dhi.io/catalog/static)), here are the updates needed on the `Dockerfile`:
87+
88+
![](score-radius-dhi-diff.jpg)
89+
90+
In the associated PR [here](https://github.com/score-spec/score-radius/pull/28), we can see that 22 packages were removed (package manager and shell included) and that 2 CVEs were removed.
91+
92+
![](score-radius-dhi-scout-compare.jpg)
93+
94+
Another example with the `sample-score-app` (using [dhi.io/node](https://dhi.io/catalog/node)), here are the updates needed on the `Dockerfile`:
95+
96+
![](score-sample-app-dhi-diff.jpg)
97+
98+
In the associated PR [here](https://github.com/score-spec/sample-score-app/pull/58), we can see that 0.3MB was saved for the size while keeping the same number of packages and still have 0 CVEs. We could have stayed with `debian` but we decided to move to an `alpine` base image (DHI provides the [two options](https://docs.docker.com/dhi/core-concepts/glibc-musl/)).
99+
100+
![](score-sample-app-dhi-scout-compare.jpg)
101+
102+
_Note: Proud moment, we were able to do a quick walkthrough about our DHI integration during the webinar organized by the CNCF on January 23rd, 2026 associated to [this DHI announcement for the CNCF projects](https://contribute.cncf.io/blog/2026/01/21/docker-hardened-images-for-cncf-projects)._
103+
104+
## `docker/github-builder`
105+
106+
Not directly related to the DSOS Program, but we took the opportunity to use the new [`docker/github-builder` GitHub reusable workflow](https://docs.docker.com/build/ci/github-actions/github-builder/) to release our container images.
107+
108+
> This model gives you a build pipeline that is maintained in the Docker organization, uses a pinned BuildKit environment, distributes multi-platform builds across runners when that helps, and emits signed SLSA provenance that records both the source commit and the builder identity.
109+
> That tradeoff is intentional. You keep control of when the build runs and which inputs it uses, but the build implementation itself lives in the Docker-maintained workflow rather than in per-repository job steps.
110+
111+
**Before:** we were doing:
112+
113+
```yaml
114+
release-container-image:
115+
runs-on: ubuntu-latest
116+
permissions:
117+
id-token: write
118+
packages: write
119+
steps:
120+
- name: Set up Docker Buildx
121+
uses: docker/setup-buildx-action@v3
122+
- name: Login to Docker Hub (docker.io)
123+
uses: docker/login-action@v3
124+
with:
125+
registry: docker.io
126+
username: ${{ secrets.DOCKER_HUB_USERNAME }}
127+
password: ${{ secrets.DOCKER_HUB_RELEASE_TOKEN }}
128+
- name: Login to GitHub Container Registry
129+
uses: docker/login-action@v3
130+
with:
131+
registry: ghcr.io
132+
username: ${{ github.actor }}
133+
password: ${{ secrets.GITHUB_TOKEN }}
134+
- name: Build and push docker image
135+
id: build-push-container
136+
uses: docker/build-push-action@v6
137+
with:
138+
context: .
139+
platforms: linux/amd64,linux/arm64
140+
push: true
141+
provenance: mode=max
142+
sbom: true
143+
tags: |
144+
ghcr.io/score-spec/score-compose:${{ github.ref_name }}
145+
ghcr.io/score-spec/score-compose:latest
146+
docker.io/scorespec/score-compose:${{ github.ref_name }}
147+
docker.io/scorespec/score-compose:latest
148+
build-args: |
149+
"VERSION=${{ github.ref_name }}"
150+
- name: Sign container image
151+
run: |
152+
cosign sign --yes ghcr.io/score-spec/score-compose@${{ steps.build-push-container.outputs.digest }}
153+
cosign sign --yes scorespec/score-compose@${{ steps.build-push-container.outputs.digest }}
154+
```
155+
156+
**After:** that's what we are doing now:
157+
158+
```yaml
159+
release-container-image:
160+
uses: docker/github-builder/.github/workflows/build.yml@v1
161+
permissions:
162+
id-token: write
163+
packages: write
164+
with:
165+
output: image
166+
push: true
167+
platforms: linux/amd64,linux/arm64
168+
sbom: true
169+
cache: true
170+
context: .
171+
set-meta-labels: true
172+
set-meta-annotations: true
173+
build-args: |
174+
"VERSION=${{ github.ref_name }}"
175+
meta-images: |
176+
ghcr.io/score-spec/score-compose
177+
scorespec/score-compose
178+
meta-tags: |
179+
type=ref,event=tag
180+
latest
181+
secrets:
182+
registry-auths: |
183+
- registry: ghcr.io
184+
username: ${{ github.actor }}
185+
password: ${{ secrets.GITHUB_TOKEN }}
186+
- username: ${{ secrets.DOCKER_HUB_USERNAME }}
187+
password: ${{ secrets.DOCKER_HUB_RELEASE_TOKEN }}
188+
```
189+
190+
This workflow provides a trusted BuildKit instance and generates signed SLSA-compliant provenance attestations, guaranteeing the build happened from the source commit and all build steps ran in isolated sandboxed environments from immutable sources. This enables GitHub projects to follow a seamless path toward higher levels of security and trust.
191+
192+
We still get our container images signed by `cosign`. Anyone can verify the trusted signature like this:
193+
```bash
194+
cosign verify \
195+
--experimental-oci11 \
196+
--new-bundle-format \
197+
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
198+
--certificate-identity-regexp ^https://github.com/docker/github-builder/.github/workflows/build.yml.*$ \
199+
ghcr.io/score-spec/score-compose@sha256:8dc5be472c7b71d55284451fd37d95710b10b742a6d06b79a34d70131eaaa4b4
200+
```
201+
202+
## That's a wrap!
203+
204+
Being part of the Docker Sponsored Open Source (DSOS) Program has been so rewarding and has helped adopt a security by default foundation for the Score project. Using Docker Scout, Docker Hardened Images and the `docker/github-builder` has reinforced the security posture of our container images as well as demostrated broader benefits for the Score projects and repositories.
205+
206+
If you maintain a CNCF project or any open source project, we highly encourage you to explore the Docker Sponsored Open Source (DSOS) Program. The security improvements we achieved were significant, and the process was straightforward.
207+
208+
You can check out our full implementation across the different Score repositories in this [GitHub issue #376](https://github.com/score-spec/score-compose/issues/376), which tracks all the work done.
209+
210+
Attending KubeCon EU 2026 in Amsterdam? Feel free to connect with us, [we'll be there too](https://score.dev/blog/score-at-kubecon-eu-2026-in-amsterdam/)!
211+
212+
_Note: While this work was completed after I personally joined Docker, this was an initiative we wanted to pursue as CNCF project Maintainers as soon as it was [announced back in September 2025](https://www.cncf.io/announcements/2025/09/18/cncf-expands-infrastructure-support-for-project-maintainers-through-partnership-with-docker/), to improve our security posture and share best practices and learnings with the broader community._
213+
214+
Hoping that you will be able to take inspiration of one or two tips for your own projects, cheers!
139 KB
Loading
273 KB
Loading
187 KB
Loading
139 KB
Loading
179 KB
Loading
389 KB
Loading

0 commit comments

Comments
 (0)