Senior DevOps Toolkit
maslennikov-ig/claude-code-orchestrator-kit
Comprehensive DevOps skill for CI/CD, infrastructure automation, containerization, and cloud platforms (AWS, GCP, Azure). Includes pipeline setup…
Publish .NET services as container images with the built-in SDK tooling (dotnet publish /t:PublishContainer, Microsoft.NET.Build.Containers) - no Dockerfile required.
$ npx skills add Aaronontheweb/dotnet-skills --skill sdk-container-publishing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Aaronontheweb/dotnet-skills sdk-container-publishing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Aaronontheweb/dotnet-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/sdk-container-publishing .claude/skills/sdk-container-publishing && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "sdk-container-publishing" agent skill from https://github.com/Aaronontheweb/dotnet-skills/tree/master/skills/sdk-container-publishing into .claude/skills/sdk-container-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-container-publishing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Aaronontheweb/dotnet-skills/tree/master/skills/sdk-container-publishingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Aaronontheweb/dotnet-skills --skill sdk-container-publishing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Aaronontheweb/dotnet-skills sdk-container-publishing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Aaronontheweb/dotnet-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/sdk-container-publishing .agents/skills/sdk-container-publishing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sdk-container-publishing" agent skill from https://github.com/Aaronontheweb/dotnet-skills/tree/master/skills/sdk-container-publishing into .agents/skills/sdk-container-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-container-publishing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Aaronontheweb/dotnet-skills --skill sdk-container-publishing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Aaronontheweb/dotnet-skills sdk-container-publishing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Aaronontheweb/dotnet-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/sdk-container-publishing .cursor/skills/sdk-container-publishing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "sdk-container-publishing" agent skill from https://github.com/Aaronontheweb/dotnet-skills/tree/master/skills/sdk-container-publishing into .cursor/skills/sdk-container-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-container-publishing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Aaronontheweb/dotnet-skills.git --path skills/sdk-container-publishing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Aaronontheweb/dotnet-skills --skill sdk-container-publishing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Aaronontheweb/dotnet-skills sdk-container-publishing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Aaronontheweb/dotnet-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/sdk-container-publishing .gemini/skills/sdk-container-publishing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "sdk-container-publishing" agent skill from https://github.com/Aaronontheweb/dotnet-skills/tree/master/skills/sdk-container-publishing into .gemini/skills/sdk-container-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-container-publishing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Aaronontheweb/dotnet-skills sdk-container-publishingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Aaronontheweb/dotnet-skills --skill sdk-container-publishing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Aaronontheweb/dotnet-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/sdk-container-publishing .github/skills/sdk-container-publishing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "sdk-container-publishing" agent skill from https://github.com/Aaronontheweb/dotnet-skills/tree/master/skills/sdk-container-publishing into .github/skills/sdk-container-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-container-publishing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Aaronontheweb/dotnet-skills --skill sdk-container-publishing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Aaronontheweb/dotnet-skills sdk-container-publishing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Aaronontheweb/dotnet-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/sdk-container-publishing .opencode/skills/sdk-container-publishing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "sdk-container-publishing" agent skill from https://github.com/Aaronontheweb/dotnet-skills/tree/master/skills/sdk-container-publishing into .opencode/skills/sdk-container-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-container-publishing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
sdk-container-publishingPublish .NET services as container images with the built-in SDK tooling (dotnet publish /t:PublishContainer, Microsoft.NET.Build.Containers) - no Dockerfile required.
SDK Container Publishing is an agent skill from Aaronontheweb/dotnet-skills. Publish .NET services as container images with the built-in SDK tooling (dotnet publish /t:PublishContainer, Microsoft.NET.Build.Containers) - no Dockerfile required. Covers the MSBuild property surface, base-image inference, self-contained and AOT implications, and CI/CD publishing.
Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/ci-cd.md`, `references/property-reference.md` and `references/real-world-examples.md`).
It sits in DevOps & Cloud, covering Containers and CI/CD. It works with .NET and Docker. The repository describes itself as: Claude Code skills and sub-agents for .NET Developers. The licence is MIT.
Read from SKILL.md and the folder at commit 46003af. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dotnetdockerpodmanFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
learn.microsoft.comgithub.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
SDK Container Publishing loads about 1.9k tokens when it runs, and up to ~6.6k if it reads all its reference files. Until then it costs about 77 tokens; SKILL.md has 782 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Aaronontheweb/dotnet-skills at commit 46003af, republished under its MIT licence (© Aaronontheweb). 782 words, ~1,875 tokens.
.claude/skills/sdk-container-publishing/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Use this skill when:
Do not use it when:
RUN step or arbitrary layer customization in the image. The SDK tooling cannot emulate RUN; write a Dockerfile instead.Since .NET 7, dotnet publish builds a container image natively. The Microsoft.NET.Build.Containers tooling ships with the SDK, so no Dockerfile is required and no Docker install is needed to produce an image. Docker or Podman is only required to run the image locally. This is documented in the containerize with dotnet publish tutorial.
The quickest path is one command:
dotnet publish /t:PublishContainer -c ReleaseThat compiles the app and emits an image in one step. The image name defaults to the project's AssemblyName. Override it with ContainerRepository (renamed from ContainerImageName in earlier versions - see the sdk-container-builds customization notes).
The tooling writes the image in one of three ways. Pick based on where the image ends up.
| Mode | When to use |
|---|---|
| Local daemon (default) | Local dev. Pushes to the running Docker or Podman daemon with no extra config. |
| Tarball | You want a file to scan, transfer, or load later. Set ContainerArchiveOutputPath to a .tar.gz path, then docker load -i or podman load -i. Useful in security scanning workflows. |
| Registry push | Shipping. Set ContainerRegistry (for example ghcr.io or an internal registry) and the image is pushed directly. |
See the containerize a .NET app reference for the full property surface.
AssemblyName. Set ContainerRepository to override.mcr.microsoft.com/dotnet/runtime-deps, ASP.NET Core gets dotnet/aspnet, other apps get dotnet/runtime, tagged for the TFM. Since SDK 8.0.200 the inference is size and security aware: musl RIDs pick Alpine variants, PublishAot=true picks the chiseled AOT runtime-deps variant. See the base image inference notes.latest, not the version. If your publish relies on the version tag you must set ContainerImageTag explicitly. This is a real footgun in CI - see the tag drift entry in references/troubleshooting.md.ContainerBaseImage to a specific nanoserver tag (for example mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-ltsc2022). See the Windows note.ContainerRuntimeIdentifiers (semicolon-delimited, a subset of RuntimeIdentifiers). The output is an OCI image index. Supported from SDK 8.0.405, 9.0.102, and 9.0.2xx onward.DOTNET_CONTAINER_INSECURE_REGISTRIES env var (comma-separated) starting in SDK 9.0.100. Since .NET 8.0.400 the SDK reads standard Docker / Podman config to decide HTTP vs HTTPS.Most of our services only override what they need and let the SDK infer the rest. A minimal csproj looks like this:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ContainerRepository>my-service</ContainerRepository>
<ContainerImageTags>$(VersionPrefix);latest</ContainerImageTags>
</PropertyGroup>
<ItemGroup>
<ContainerPort Include="8080" Type="tcp" />
</ItemGroup>
</Project>Notes:
ContainerRegistry, no ContainerBaseImage, no ContainerUser. The SDK defaults these correctly for most ASP.NET services.ContainerPort items expose ports without a Dockerfile.latest.For the full property catalog, see references/property-reference.md.
In CI, publish against a registry and tag with the release name. The tag-driven pattern we use:
dotnet publish src/MyService/MyService.csproj \
-p:VersionPrefix=${{ github.ref_name }} \
-p:ContainerRegistry=docker.example.internal \
-p:ContainerImageTag=${{ github.ref_name }} \
-c Release /t:PublishContainerNote ContainerImageTag is set explicitly because the SDK defaults to latest, not the version. See references/ci-cd.md for the full workflow and registry auth notes.
If you centralize image settings across a repo, put them in a Directory.Build.props with CI conditionals. We do this for version tags, labels, and the ContainerPublishInParallel=false anti-race flag. See references/real-world-examples.md.
The common failures (tag drift, wrong image name or registry, unavailable RUN, no daemon on the build host, insecure registry rejection, parallel-publish races, and multi-target publishing) are covered in depth in references/troubleshooting.md. Ask the reader to consult it rather than duplicating the full text here; the short version is: set ContainerImageTag explicitly, set ContainerRepository and ContainerRegistry explicitly, and use ContainerArchiveOutputPath when no daemon is available.
Self-contained projects default to the runtime-deps base image. AOT projects get a chiseled AOT runtime-deps variant for smaller, more secure images. See references/self-contained-and-aot.md.
Confirm the image built and exists:
# Image in the local daemon
docker images | grep <repository>
# Tarball produced
ls -la <ContainerArchiveOutputPath>
# Push succeeded (registry mode)
docker pull <ContainerRegistry>/<ContainerRepository>:<tag>dotnet-skills:testcontainers - running containers in testsdotnet-skills:aot-trimming - AOT and trimming, relevant to base-image selection© Aaronontheweb, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references) in skills/sdk-container-publishing of Aaronontheweb/dotnet-skills.
Open the folder on GitHubat commit 46003af
SDK Container Publishing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| SDK Container Publishing this skillAaronontheweb/dotnet-skills | 1.2k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Senior DevOps Toolkitmaslennikov-ig/claude-code-orchestrator-kit | 260 | 6 repos | ~1.1k | Automated safety check: Notes | Custom licence | |
| GitHub Actions CreatorFNOSP/FlyNarwhal | 509 | 1 repos | ~2.4k | Automated safety check: Pass | AGPL-3.0 | |
| Dockerfile And Readme Templatingdotnet/dotnet-docker | 4.9k | — | ~563 | Automated safety check: Pass | MIT | |
| Swig CI Reproswig/swig | 6.3k | — | ~1.2k | Automated safety check: Pass | Custom licence | |
| Porting Changesdotnet/dotnet-docker | 4.9k | — | ~781 | Automated safety check: Pass | MIT |
maslennikov-ig/claude-code-orchestrator-kit
Comprehensive DevOps skill for CI/CD, infrastructure automation, containerization, and cloud platforms (AWS, GCP, Azure). Includes pipeline setup…
FNOSP/FlyNarwhal
A skill your agent uses when the user wants to create, generate, or set up a GitHub Actions workflow.
dotnet/dotnet-docker
Modify Cottle templates that generate Dockerfiles and READMEs in dotnet/dotnet-docker.
swig/swig
Reproduce a GitHub Actions Linux CI failure locally when it does not happen on your machine: a podman/docker image that mirrors the ubuntu-22.04 runner by reusing the real Tools/CI-linux-.sh install…
dotnet/dotnet-docker
Plan and move changes between branches in dotnet/dotnet-docker.
dotnet/skills
Configures automatic crash dumps or captures dumps from running processes for modern .NET apps on Linux, macOS and Windows, including Docker and Kubernetes.
Aaronontheweb/dotnet-skills
Guides making .NET libraries trimming-safe and Native-AOT compatible: the MSBuild properties, trimming attributes, warning codes and a playbook of safe patterns.
Aaronontheweb/dotnet-skills
Write and simplify C property-based, model-based, and executable specification tests with CsCheck.
Aaronontheweb/dotnet-skills
Shows how to build entity actors with Akka.Hosting so the same code runs in local unit tests and in a sharded cluster in production.
Aaronontheweb/dotnet-skills
Guidance for Akka.NET actor systems covering EventStream versus DistributedPubSub, supervision, Props versus DependencyResolver, work distribution and testable cluster code.
Aaronontheweb/dotnet-skills
Sets up Akka.Management and Cluster.Bootstrap so Akka.NET clusters form through service discovery on Kubernetes, Azure or config instead of static seed nodes.
Aaronontheweb/dotnet-skills
Shows how to test Akka.NET actors with Akka.Hosting.TestKit: swapping services for fakes, using TestProbes, and checking persistence, plus when the older TestKit still fits.
Categories
Publish .NET services as container images with the built-in SDK tooling (dotnet publish /t:PublishContainer, Microsoft.NET.Build.Containers) - no Dockerfile required. SDK Container Publishing is an agent skill from Aaronontheweb/dotnet-skills.Containers) - no Dockerfile required.
SDK Container Publishing fits situations like: tasks that involve Containers; tasks that involve CI/CD.
Run `npx skills add Aaronontheweb/dotnet-skills --skill sdk-container-publishing -a claude-code`. Or copy the skill folder (skills/sdk-container-publishing in Aaronontheweb/dotnet-skills) into .claude/skills/sdk-container-publishing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Aaronontheweb/dotnet-skills --skill sdk-container-publishing -a codex`. Or copy the skill folder (skills/sdk-container-publishing in Aaronontheweb/dotnet-skills) into .agents/skills/sdk-container-publishing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Aaronontheweb/dotnet-skills --skill sdk-container-publishing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sdk-container-publishing, .gemini/skills/sdk-container-publishing, .github/skills/sdk-container-publishing and .opencode/skills/sdk-container-publishing in your project.
Going by SKILL.md and its folder, SDK Container Publishing needs the command-line tools its instructions call (dotnet, docker and podman). Our summary lists: Docker.
SKILL.md names 2 domains. As links in the text: learn.microsoft.com and github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
SDK Container Publishing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.9k tokens (SKILL.md is roughly 7.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 4.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with SDK Container Publishing: Senior DevOps Toolkit (maslennikov-ig/claude-code-orchestrator-kit, 260 stars), GitHub Actions Creator (FNOSP/FlyNarwhal, 509 stars), Dockerfile And Readme Templating (dotnet/dotnet-docker, 4.9k stars) and Swig CI Repro (swig/swig, 6.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Aaronontheweb (a GitHub user) maintains it in Aaronontheweb/dotnet-skills, which has 1,206 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on October 10, 2026.
Source: Aaronontheweb/dotnet-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.