Skip to content
Agentmart
Submit a tool

docker-python

Dockerfile best practices for Python projects.

Skill by hugobatista

IndexedMIT★ 1
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/hugobatista-docker-python

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Dockerfile best practices for Python projects. Covers non-root user (ARG UID/GID/APP_USER), COPY --chown, runtime-writable files, and entrypoint diagnostics.

Use cases: devops, writing

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/docker-python

What's inside

Skill name
docker-python
Description
Dockerfile best practices for Python projects. Covers non-root user (ARG UID/GID/APP_USER), COPY --chown, runtime-writable files, and entrypoint diagnostics.
License
MIT
Instructions
83 lines in SKILL.md · view on GitHub

Files (4)

  • SKILL.md
  • Dockerfile.tmpl · assets/
  • config.toml.example · assets/
  • ghcr.yml.tmpl · assets/

SKILL.md (first lines)

## Dockerfile

Read `assets/Dockerfile.tmpl`, replace `appname`, and write it to the project root.

Key patterns:
- uv image pinned to `tag@sha256:digest` — guarantees the exact uv version; update the digest when a new stable release has been available for > 30 days
- `ARG UID=1000 GID=1000 APP_USER=appuser` — configurable at build time via `--build-arg UID=568`
- Privileged RUN (package installs, user creation, app directory) happens **before** `USER`
- `COPY --chown=${UID}:${GID}` sets ownership at build time — no runtime `chown` needed
- `/app` is pre-created and chowned before any copy so the working directory is writable
- Runtime-writable config files (e.g. `config.js`) should be pre-created with `chmod 666` so `docker-compose user:` overrides still work
- `USER ${APP_USER}` is the last step before `ENTRYPOINT`

## Bind mounts

For host bind mounts in docker-compose, users must `chown` the host directory to the container UID:

```bash
sudo chown -R 1000:1000 /host/path
```

To use a custom UID, add `user: "<UID>:<GID>"` in docker-compose and ensure runtime-writable files have `chmod 666` set at build time.

## .dockerignore

```dockerignore
.git/
__pycache__/
*.pyc
.venv/
.env
dist/
*.egg-info/
.mypy_cache/
.pytest_cache/
.coverage
```

## Dependency pinning

- **Docker images**: pin all `FROM` lines to `tag@sha256:digest`. Tags are mutable; digests guarantee the exact image.
  ```dockerfile
  FROM python:3.13.12-slim@sha256:f1927c75e81efd1e091dbd64b6c0ecaa5630b38635a3d1c04034ac636e1f94c8 AS builder
  ```
- **NPM dependencies**: use `npm ci --ignore-scripts` in Dockerfile stages to block postinstall attacks.
  ```dockerfile
  RUN npm ci --prefer-offline --ignore-scripts
  ```
- **Python dependencies**: export from lockfile with `uv export` and install with `pip install --require-hashes` to verify every package hash.
  ```dockerfile
  RUN uv export --no-dev --no-emit-project -o requirements.txt
  RUN pip install --no-cache --require-hashes -r ./requirements.txt
  ```

## GitHub Actions workflow

When setting up Docker for a project, offer to create a GHCR publish workflow. Ask the user: *"Do you want to set up a GitHub Actions workflow to build and push this image to GHCR?"*

If yes:

1. Ask the user: *"Will this project be hosted on GitHub?"* If no, skip this section.
2. Read `config.toml` from this directory. If it exists, extract `github_owner` and `github_url_base` for defaults. If not, ask the user for these values and write them to `config.toml` (one-time setup).
3. Ask the user for the **GitHub owner** (default: `<github_owner from config>`)
4. Ask the user for the **URL base** for badge links:
   - `go.<owner>.com/gh` (default, e.g. `https://<github_url_base from config>`)
   - `github.com/<owner>` (e.g. `https://github.com/<github_owner from config>`)
   - Custom — user provides their own
4. Ask the user for the **repo name** (read from `pyproject.toml` `[project].name` if it's a Python project; otherwise ask directly)

Read `assets/ghcr.yml.tmpl`, then write it to `.github/workflows/ghcr.yml` (no substitutions needed).

Add the following badge to `README.md`:

```
[![GHCR Tag](https://img.shields.io/github/v/tag/<owner>/<repo>?logo=docker&logoColor=white&label=GHCR)](<base>/<repo>/packages)
```

Create the directory before writing:
```
mkdir -p .github/workflows
```

From hugobatista/agent-skills, MIT.

More from hugobatista/agent-skills

Signals

Stars
1
Forks
0
Open issues
0
Last commit (this folder)
Sep 20, 2026 (1 month ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from hugobatista

Cite this page

docker-python skill. Agent Mart. https://agentmart.dev/skills/hugobatista-docker-python (last updated 2026-10-24)