Skip to main content

docker-development

Use when working with ANY Docker task: writing Dockerfiles, configuring docker-compose/compose.yml, multi-stage builds, docker-bake.hcl, container security audits, .dockerignore optimization, or CI/CD container testing. Triggers on: Dockerfile, docker-compose, container, image build, multi-stage, docker bake, compose.

Informações da origem

Repositório
netresearch/docker-development-skill
Última atividade na origem
23 de outubro de 2026 às 21:40
Idioma detectado do SKILL.md
inglês
Estrelas
24
Forks
2

Opções de instalação

Por padrão, está selecionado o prompt que primeiro revisa a origem. Você pode mudar para um comando direto ou baixar uma cópia local.

Revise os arquivos de origem

Leia o SKILL.md e os arquivos complementares exibidos pelo SkillsMP antes de decidir se vai instalar.

Explorador de arquivos
15 arquivos

Exibindo SKILL.md

SKILL.md
Instruções da origem · Visualização somente leitura
name
docker-development
description
Use when working with ANY Docker task: writing Dockerfiles, configuring docker-compose/compose.yml, multi-stage builds, docker-bake.hcl, container security audits, .dockerignore optimization, or CI/CD container testing. Triggers on: Dockerfile, docker-compose, container, image build, multi-stage, docker bake, compose.
license
(MIT AND CC-BY-SA-4.0)
compatibility
Requires docker, docker compose.
metadata
{"version":"1.17.1","repository":"https://github.com/netresearch/docker-development-skill","author":"Netresearch DTT GmbH"}
allowed-tools
["Bash(docker version:*)","Bash(docker info:*)","Bash(docker ps:*)","Bash(docker images:*)","Bash(docker inspect:*)","Bash(docker history:*)","Bash(docker logs:*)","Bash(grep:*)","Read","Glob","Grep"]
# Docker Development ## Core Principles 1. **Minimal** -- Alpine/distroless, multi-stage 2. **Secure** -- Non-root USER, no layer secrets, pin versions 3. **Testable** -- entrypoint bypass, DNS mocking 4. **Cache-efficient** -- deps first, clean in-layer ## Quick Reference ### Multi-Stage Build (Node.js) ```dockerfile FROM node:24-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . FROM node:24-alpine RUN addgroup -g 1001 app && adduser -u 1001 -G app -D app USER app COPY --from=builder /app . HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget -qO- http://localhost:3000/health || exit 1 CMD ["node", "server.js"] ``` ### Multi-Stage Build (Go -- scratch/distroless) ```dockerfile FROM golang:1.26-alpine AS builder WORKDIR /app COPY go.* ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -o /app/server . FROM gcr.io/distroless/static:nonroot COPY --from=builder /app/server /server CMD ["/server"] ``` ### Layer Optimization ```dockerfile RUN apt-get update && \ apt-get install -y --no-install-recommends curl && \ rm -rf /var/lib/apt/lists/* ``` ### Build Cache: Copy Dependency Files First ```dockerfile COPY package*.json ./ RUN npm ci COPY . . ``` Manifests before source keeps install layers cached. ### BuildKit Secrets ```dockerfile RUN --mount=type=secret,id=ssh_key,dst=/root/.ssh/id_rsa git clone git@github.com:org/repo.git ``` `ARG` leaks via `docker history` **and** SLSA provenance -- `references/build-secret-leaks.md` ### Docker Bake (Multi-Platform) ```hcl target "app" { platforms = ["linux/amd64", "linux/arm64"] } ``` CI builds go through Bake and `netresearch/.github/.github/workflows/build-container-bake.yml@main`, one image or several. The reusable adds a GHA cache per target, so the HCL declares none; a scheduled rebuild passes `cache: false` -- `references/bake-ci-cache.md` ## Security Anti-Patterns | Anti-pattern | Fix | |---|---| | `FROM image:latest` | Pin version: `image:1.2.3-alpine` | | No `USER` directive | `adduser` + `USER appuser` | | `chmod 777` | Use specific permissions: `chmod 550` | | `privileged: true` in compose | Remove or use specific `cap_add` | | `volumes: [/:/host]` | Mount only needed paths | | `ports: ["0.0.0.0:3000:3000"]` | Bind to `127.0.0.1:3000:3000` | | `ENV DB_PASSWORD=secret` | Use `--mount=type=secret` or compose secrets | ## CI Testing Gotchas 1. **Bypass entrypoint**: `docker run --rm --entrypoint php myimage -v` 2. **Mock upstream DNS**: `docker run --rm --add-host backend:127.0.0.1 nginx-image nginx -t` 3. **Compose validation**: `cp .env.example .env` before `docker compose config` 4. **Secret scanning**: exclude `.env.example`, README, docs 5. **Root-owned artifacts**: bind-mount dirs (`EACCES`) -- `references/bind-mount-ownership.md` ## .dockerignore Exclude: `.git`, `node_modules`/`vendor`, `.env*`, `*.pem`, `*.key` ## Compose Essentials - startup ordering: `depends_on.condition: service_healthy` + `healthcheck` `start_period` - `networks.internal: true` isolates databases - `profiles: [debug]`: start only with `--profile debug`. `down` and `--remove-orphans` ignore a disabled profile's containers, so a service you stop enabling keeps running -- `docker compose --profile '*' down`, or `docker compose down <service>` (`references/compose-runtime-lifecycle.md`) - logging drivers block by default: a stalled remote endpoint (`awslogs`, ...) stalls the app's writes; `mode: non-blocking` + `max-buffer-size` drops lines instead, protecting a running container only (`references/compose-runtime-lifecycle.md`) - shared image ref: define ONCE per file as top-level extension field + anchor -- `x-app-image: &app-image registry/app:${APP_IMAGE_VERSION:-85}`, services use `image: *app-image`. The field must sit ABOVE `services:` — an alias is only valid after its anchor in document order. `:-` defaults cover unset AND empty vars (a bare omitted tag silently resolves `:latest`). Anchors are file-local: every overlay file needs its own. Verify both paths: `APP_IMAGE_VERSION= docker compose config` and with an override ## References - `references/bake-ci-cache.md` -- the shared bake reusable; `-f docker-bake.hcl` beside a compose file; GHA cache scope per target; uncached scheduled rebuild that still writes the cache; helper steps in bake-action's directory - `references/ci-testing.md` -- CI testing patterns for Docker images; busybox `sh` vs bash in `-c` strings; `timeout` around `docker compose run` leaves the container running when PID 1 ignores the signal - `references/dind-testing-patterns.md` -- Docker-in-Docker testing patterns - `references/bind-mount-ownership.md` -- root-owned bind-mount artifacts; a tmpfs on a parent path hiding a volume below it - `references/gpg-verification.md` -- gpgv patterns; stale keybox locks - `references/registry-catalogue-and-pin-rot.md` -- catalogue probes; pin rot - `references/build-secret-leaks.md` -- `ARG` in provenance - `references/php-fpm-worker-starvation.md` -- keepalive pins php-fpm - `references/engine-and-image-upgrades.md` -- `MinAPIVersion` cuts off socket-reading sidecars; probe-container upgrade check; a base image changing its `USER`; PHP 8.5 OPcache built into the core - `references/database-container-readiness.md` -- seeded DB images log `ready for connections` twice; verify the seed, not the log - `references/compose-runtime-lifecycle.md` -- a disabled profile's container survives `down` and `up --remove-orphans`; blocking vs non-blocking log delivery and what non-blocking does not protect - `references/image-ca-trust.md` -- after a CA compromise: measure the published image's `ca-certificates` version and root subjects; `grep` for a CA name in the bundle always returns 0
Ver no GitHub