docker

  • Composer 2 is not a minor upgrade

    A dependency resolver rewritten and parallel downloads, so install went from ninety seconds to eleven. And a plugin API that broke three packages.

  • Secrets that are not in the repository and not in the image

    The database password was in the repository, then in the image, then in an environment variable readable by anything that could run ps. Where it went next.

  • One secret source, injected at runtime, never on disk

    The audit asked where the database password is and there were five answers, all of them true. Enumerating the copies is the first hour and is usually the…

  • Compose in CI, and the service the tests need

    The tests need MySQL and Redis, and CI gives you an empty machine. Service containers, where they differ from compose, and the readiness nothing does for you.

  • BuildKit cache mounts survive between builds

    Caching a package manager’s downloads in a layer bloats the image and is invalidated by anything above it. A cache mount lives outside the image entirely. The syntax…

  • docker system df before docker system prune

    A development machine accumulates dangling layers, stopped containers and orphaned volumes, and none of it is visible until the disk fills. -a –volumes deletes the database volume of…

  • A self-hosted runner, and what it is allowed to reach

    The hosted runner cannot reach the private network, which is the whole problem — and a runner inside it is a machine running other people’s code.

  • Binding a published port to localhost, because UFW will not save you

    Docker writes its own iptables rules ahead of the chain UFW manages, so a published port is reachable from the internet regardless of what the firewall says. The…

  • Log rotation on json-file, which has no default limit

    The default logging driver writes to a file that grows without bound, so a chatty container fills the host disk over a fortnight and nothing warns first. Setting…

  • An init process, or PID 1 ignores your signals

    PID 1 in Linux gets no default signal handlers, so a shell script as the entrypoint ignores SIGTERM entirely and docker stop waits ten seconds before killing it.…