{"id":30615629,"url":"https://github.com/alexfalkowski/docker","last_synced_at":"2026-05-18T06:17:39.583Z","repository":{"id":17618215,"uuid":"295731391","full_name":"alexfalkowski/docker","owner":"alexfalkowski","description":"Common setup used for my projects.","archived":false,"fork":false,"pushed_at":"2026-04-18T08:28:10.000Z","size":1815,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-18T08:37:39.939Z","etag":null,"topics":["docker","golang","ruby"],"latest_commit_sha":null,"homepage":"https://alexfalkowski.github.io/docker","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alexfalkowski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2020-09-15T13:08:31.000Z","updated_at":"2026-04-18T08:27:39.000Z","dependencies_parsed_at":"2026-03-10T08:04:24.615Z","dependency_job_id":null,"html_url":"https://github.com/alexfalkowski/docker","commit_stats":null,"previous_names":[],"tags_count":890,"template":false,"template_full_name":null,"purl":"pkg:github/alexfalkowski/docker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexfalkowski%2Fdocker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexfalkowski%2Fdocker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexfalkowski%2Fdocker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexfalkowski%2Fdocker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alexfalkowski","download_url":"https://codeload.github.com/alexfalkowski/docker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexfalkowski%2Fdocker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32081138,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T06:27:27.065Z","status":"ssl_error","status_checked_at":"2026-04-21T06:27:21.250Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","golang","ruby"],"created_at":"2025-08-30T08:06:08.142Z","updated_at":"2026-05-18T06:17:39.576Z","avatar_url":"https://github.com/alexfalkowski.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Docker](https://www.docker.com/app/uploads/2024/01/icon-docker-square.svg)\n[![CircleCI](https://circleci.com/gh/alexfalkowski/docker.svg?style=svg)](https://circleci.com/gh/alexfalkowski/docker)\n[![Stability: Active](https://masterminds.github.io/stability/active.svg)](https://masterminds.github.io/stability/active.html)\n\n# Docker\n\nA collection of Docker images (published under `docker.io/alexfalkowski/*`) plus a `compose.yml` for running common local dependencies.\n\nThis repository is designed to be driven via `make` targets and CI runs on CircleCI.\n\n## Repository layout\n\nEach top-level directory is an image (or runtime config used by the compose stack):\n\n- Image directories:\n  - `docker/`, `go/`, `k8s/`, `release/`, `root/`, `ruby/`\n  - Each contains:\n    - `Dockerfile`\n    - `Makefile` declaring `IMAGE` and `VERSION`\n    - `.hadolint.yaml` (image-specific hadolint rule suppressions)\n    - `scripts/install-image-tool.d/` snippets for image-specific tool installs, when needed\n- Local dependency stack:\n  - `compose.yml`\n  - `grafana/`, `otelcol/`, `prometheus/`, `status/` (config mounted into compose services)\n- Shared build targets:\n  - `make/docker.mk` (used by all image Makefiles)\n- Helper scripts:\n  - `scripts/compose` (prefers `podman compose`, falls back to `docker compose`)\n  - `scripts/clean` (prunes unused images)\n  - `scripts/clean-go` (shared Go cache cleanup runner: `clean-go`)\n  - `scripts/install-go-tool` (shared Go build-time installer runner: `install-go-tool \u003cmodule\u003e \u003cversion\u003e`)\n  - `scripts/install-image-tool` (shared image build-time installer runner: `install-image-tool \u003ctool\u003e [version]`)\n  - `scripts/install-image-tool.d/` (shared install snippets used by multiple images)\n  - `scripts/lint` (runs hadolint + shellcheck)\n\n## Prerequisites\n\n- GNU Make 4 or newer\n  - On macOS, install GNU Make and use `gmake`; the system `/usr/bin/make` 3.81 cannot parse the shared `bin/` make fragments.\n- `git`\n- `docker` or `podman`\n- `hadolint` and `shellcheck` (required for `make lint`)\n\nExamples below use `make`; substitute `gmake` if GNU Make is installed under that name.\n\n### Submodule (required)\n\nThe top-level `Makefile` includes make fragments from the `bin/` submodule. If `bin/` is missing, most `make` targets will fail.\n\n```sh\ngit submodule sync\ngit submodule update --init\n```\n\n## Make targets\n\nList available targets:\n\n```sh\nmake\n# or\nmake help\n```\n\nOn macOS with Homebrew GNU Make:\n\n```sh\ngmake help\n```\n\n### Lint\n\nLint everything (Dockerfiles + shell scripts):\n\n```sh\nmake lint\n```\n\nWhat it does (see `scripts/lint`):\n\n- Runs `hadolint` against every `Dockerfile` in the repo (excluding `./bin`).\n- Runs `shellcheck` against:\n  - `scripts/lint`, `scripts/clean`, `scripts/clean-go`, `scripts/compose`, `scripts/install-go-tool`, `scripts/install-image-tool`\n  - `release/deploy`, `release/package`, `release/version`\n  - shared `scripts/install-image-tool.d/*` snippets\n  - per-image `scripts/install-image-tool.d/*` snippets\n\n### Build images locally\n\nEach image directory has a `Makefile` that sets `IMAGE` and `VERSION` and then includes `../make/docker.mk`.\nThe shared build targets run from the image directory but use the repository root as Docker build context so Dockerfiles can copy the shared installer script.\nDockerfiles pass tool versions directly to `install-image-tool \u003ctool\u003e [version]`; installer snippets keep defaults for manual use.\nGo tools are installed with `install-go-tool \u003cmodule\u003e \u003cversion\u003e`, which runs `go install \u003cmodule\u003e@\u003cversion\u003e`.\nGo caches are cleaned with `clean-go`.\n\nBuild an image locally:\n\n```sh\nmake -C go build-docker\n```\n\nThat produces a local image tagged like:\n\n- `alexfalkowski/go:\u003cVERSION\u003e` (based on `go/Makefile`)\n\nBuild another image:\n\n```sh\nmake -C docker build-docker\n```\n\n### Build/push platform-tagged images\n\nThe shared make targets support per-platform tags of the form `\u003cVERSION\u003e.\u003cplatform\u003e`.\n\nBuild:\n\n```sh\nmake -C go platform=amd64 build-platform-docker\nmake -C go platform=arm64 build-platform-docker\n```\n\nPush (requires DockerHub login):\n\n```sh\nmake -C go platform=amd64 push-platform-docker\nmake -C go platform=arm64 push-platform-docker\n```\n\n### Create multi-arch manifests\n\nAfter pushing platform images, publish multi-arch manifests:\n\n```sh\nmake -C go manifest-platform-docker\n```\n\nThis pushes two manifests:\n\n- `alexfalkowski/go:\u003cVERSION\u003e`\n- `alexfalkowski/go` (equivalent to `:latest`)\n\n## Compose (local dependencies)\n\nThe `compose.yml` file is intended to provide a shared set of local dependencies used by multiple projects.\n\nThe repository wraps compose via `scripts/compose`, which:\n\n- uses `podman compose` when `podman` is available\n- otherwise uses `docker compose`\n\n### Pull\n\n```sh\nmake docker-pull\n# pull a single service\nmake docker-pull service=postgres\n```\n\n### Start/stop\n\n```sh\nmake start\n# start a single service\nmake start service=redis\n\nmake stop\n```\n\n### Logs\n\n```sh\nmake logs service=postgres\n```\n\n### Included services\n\nFrom `compose.yml`:\n\n| Service | Image | Ports (host:container) | Notes |\n|---|---|---:|---|\n| `postgres` | `postgres:18-trixie` | `5432:5432` | `POSTGRES_USER=test`, `POSTGRES_PASSWORD=test` |\n| `redis` | `valkey/valkey:9` | `6379:6379` |  |\n| `aws` | `hectorvent/floci` | `4566:4566` | `SERVICES=s3,sqs,ssm` |\n| `vault` | `hashicorp/vault:1.21` | `8200:8200` | dev token: `vault-plaintext-root-token` |\n| `prometheus` | `prom/prometheus:v3` | `9090:9090` | depends on `mimir` |\n| `mimir` | `grafana/mimir` | `9009:9009` | mounts `./grafana` |\n| `loki` | `grafana/loki` | `3100:3100` | mounts `./grafana` |\n| `memcached` | `memcached:1.6` | `11211:11211` | cache backend for `tempo` |\n| `tempo` | `grafana/tempo:2.10` | `3200:3200` | depends on `memcached` |\n| `otel-collector` | `otel/opentelemetry-collector-contrib` | `4317:4317`, `4318:4318` | OTLP gRPC/HTTP ingress |\n| `grafana` | `grafana/grafana-oss` | `10000:3000` | depends on metrics/logs/traces stack |\n| `status` | `alexfalkowski/status` | `15000:8080`, `15001:6060` | mounts `./status` |\n| `flipt` | `flipt/flipt` | `8080:8080`, `9000:9000` |  |\n\nExamples:\n\n```sh\n# Connect to postgres\npsql \"postgresql://test:test@localhost:5432/postgres\"\n\n# Vault dev login\nexport VAULT_ADDR=\"http://127.0.0.1:8200\"\nvault login \"vault-plaintext-root-token\"\n\n# Grafana UI\nopen \"http://127.0.0.1:10000\"\n```\n\n## Clean unused images\n\nWarning: this is destructive.\n\n```sh\nmake clean\n```\n\nThis runs `docker image prune -a -f` (or the podman equivalent) via `scripts/clean`.\n\n## CI (CircleCI)\n\nCircleCI is configured as a setup workflow using path-filtering:\n\n- `.circleci/config.yml` maps changed paths to pipeline parameters.\n- `.circleci/continue_config.yml` contains the actual per-image build/lint/push workflows.\n\nOn `master`, CI pushes platform images and manifests (requires `DOCKERHUB_USERNAME` and `DOCKERHUB_PASS`).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexfalkowski%2Fdocker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexfalkowski%2Fdocker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexfalkowski%2Fdocker/lists"}