a5baef73d9
- backend: appuser UID/GID 1001 via useradd, USER directive, --chown on COPY - frontend builder: appuser UID/GID 1001 via adduser, USER directive - frontend prod: switch to nginxinc/nginx-unprivileged:alpine (nginx UID 101), listen on 8080 - docker-compose: explicit user: for all services (70:70 db, 1001:1001 backend/frontend-dev, 101:101 frontend-prod) - nginx.conf: listen 8080 to match unprivileged image Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1.4 KiB
1.4 KiB
2026-04-13 — Rootless containers
Timestamp: 2026-04-13T00:00:00
Summary
All containers now run as non-root users with explicit UID:GID assignments enforced in both Dockerfiles and docker-compose files.
User mapping
| Service | User | UID:GID | Notes |
|---|---|---|---|
db |
postgres |
70:70 |
Fixed by postgres:16-alpine; image owns PGDATA as 70:70 so named-volume seeding works |
backend |
appuser |
1001:1001 |
Created via useradd in runtime stage |
frontend (prod) |
nginx |
101:101 |
Switched to nginxinc/nginx-unprivileged:alpine; listens on 8080 |
frontend (dev) |
appuser |
1001:1001 |
Created via adduser in builder stage |
Files Modified
backend/Dockerfile— addedgroupadd/useraddfor appuser (1001:1001),--chownon allCOPYdirectives,USER appuserfrontend/Dockerfile— builder stage: addedaddgroup/adduserfor appuser (1001:1001),USER appuser; prod stage: switched tonginxinc/nginx-unprivileged:alpine,EXPOSE 8080frontend/nginx.conf— changedlisten 80→listen 8080to match unprivileged image defaultdocker-compose.yml— addeduser: "70:70"todb,user: "1001:1001"tobackend,user: "101:101"tofrontend; updated frontend port mapping to"80:8080"docker-compose.dev.yml— addeduser: "1001:1001"tobackendandfrontendoverridesTODO.md— marked rootless containers item as completed