feat: add Docker setup with multi-stage build and docker-compose

- Add Dockerfile with golang:1.25-alpine build stage + alpine runtime stage
- Add docker-compose.yml with naviwatcher service and data volume
- Add .dockerignore for build context cleanup
- Add .gitignore for build artifacts and data directory
- Update plan: mark Task 7 checkboxes as complete

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-20 09:41:54 +03:00
parent 68660e4d83
commit 3206b10bd9
5 changed files with 63 additions and 7 deletions

10
.dockerignore Normal file
View File

@@ -0,0 +1,10 @@
.git
.gitignore
.DS_Store
naviwatcher
naviwatcher-linux
naviwatcher-mac
naviwatcher.exe
data/
.claude/
.ralphex/

6
.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
.DS_Store
naviwatcher
naviwatcher-linux
naviwatcher-mac
naviwatcher.exe
data/

29
Dockerfile Normal file
View File

@@ -0,0 +1,29 @@
# Build stage
FROM golang:1.25-alpine AS builder
RUN apk add --no-cache gcc musl-dev
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=1 GOOS=linux go build -o naviwatcher ./cmd/naviwatcher
# Runtime stage
FROM alpine:latest
RUN apk add --no-cache ca-certificates sqlite-libs
WORKDIR /app
COPY --from=builder /app/naviwatcher .
EXPOSE 8080
VOLUME ["/app/data"]
ENTRYPOINT ["./naviwatcher"]
CMD ["-config=/app/data/config.yaml"]

11
docker-compose.yml Normal file
View File

@@ -0,0 +1,11 @@
services:
naviwatcher:
build:
context: .
dockerfile: Dockerfile
container_name: naviwatcher
ports:
- "8080:8080"
volumes:
- ./data:/app/data
restart: unless-stopped

View File

@@ -115,13 +115,13 @@ Build the foundation layer of NaviWatcher: a greenfield Go project with zero exi
- [x] run tests — must pass before task 7
### Task 7: Docker setup
- [ ] create `Dockerfile` with multi-stage build: build stage (golang:1.21-alpine) + runtime stage (alpine:latest)
- [ ] configure Dockerfile to copy config, build binary, expose port, set entrypoint
- [ ] create `docker-compose.yml` with naviwatcher service, volume for SQLite DB and config
- [ ] create `.dockerignore` file
- [ ] verify Docker image builds: `docker compose build`
- [ ] verify container starts and health check passes (if implemented)
- [ ] run full test suite — must pass before task 8
- [x] create `Dockerfile` with multi-stage build: build stage (golang:1.25-alpine) + runtime stage (alpine:latest)
- [x] configure Dockerfile to copy config, build binary, expose port, set entrypoint
- [x] create `docker-compose.yml` with naviwatcher service, volume for SQLite DB and config
- [x] create `.dockerignore` file
- [x] verify Docker image builds: `docker compose build`
- [x] verify container starts and health check passes (container starts, loads config, runs successfully)
- [x] run full test suite — must pass before task 8
### Task 8: Verify acceptance criteria
- [ ] verify Go module builds cleanly with `go build`