● UBUNTU, YOUR WAY
Pick your packages. Make yourself at home. Turn a few thoughtful choices into a Dockerfile you understand.
01 / CONFIGURE
Changing a recipe replaces your configuration. Make/CMake need your source files; adjust the executable name.
Release tags are explicit, but mutable. A digest pins image content, not apt package versions. Get a real digest using docker buildx imagetools inspect ubuntu:24.04. Match it to the selected release and architecture; cross-architecture execution may need emulation.
docker buildx imagetools inspect ubuntu:24.04
A curated catalog, not every Ubuntu package. Versions come from Ubuntu's archive and vary by release/architecture. Unavailable catalog entries are disabled; remove old selections after switching release.
Separate with spaces or commas. Plain names only. Availability is not checked online; review Ubuntu Packages. Some tools live in Universe and have different support coverage.
--no-install-recommends
Update and install always share one RUN. Non-root configuration automatically includes passwd for account creation. No upgrades or third-party repositories are added.
passwd
Names and IDs must be new in the base image. We fail explicitly on collisions, never remove or renumber existing users. Ubuntu may already use ID 1000; 10001 is a safer default, not a guarantee. No password, sudo grants or extra groups are created.
Linux permissions use numeric IDs, not matching names. Bind mounts retain host ownership and override image contents; COPY --chown cannot fix a mounted directory. Use IDs that match your intended host setup and are unused in the base. Rootless Docker and Docker Desktop can map identities differently.
A dedicated absolute app directory. The app user owns it; copied files get the same UID/GID. System directories are intentionally disallowed.
Review the generated .dockerignore before building. Never include secrets. Source programs and build scripts are code: build only trusted projects.
Fixed recipes only, no arbitrary shell field. Build tools stay in this single-stage image. Builds run as your configured user and need a Makefile or CMakeLists.txt.
One KEY=value per line. These are visible in the image: never enter passwords, tokens or secrets. HOME is managed by your user settings.
EXPOSE is documentation, not port publishing. Your app must listen on 0.0.0.0 inside the container.
One executable followed by separate arguments: ["python3","app.py"]. Exec form does not expand $VARIABLES, pipes or redirects. An explicit ["sh","-c","…"] deliberately invokes a shell; only use trusted code.
["python3","app.py"]
["sh","-c","…"]
When set, startup command items become arguments to the entrypoint. Scripts need executable permissions and a valid Linux shebang.
Commands target a local Docker installation. This site generates files only: it cannot build, execute, upload or publish an image.