website-and-documentation/DOCKER.md

99 lines
2.2 KiB
Markdown
Raw Normal View History

# Docker Build
This project uses a multi-stage Docker build that matches the local devbox development environment.
## Version Management
All tool versions are defined in `.env.versions` as the single source of truth:
```bash
NODE_VERSION=24.10.0
GO_VERSION=1.25.1
HUGO_VERSION=0.151.0
```
These versions are used in:
- `devbox.json` - Local development environment
- `Dockerfile` - Docker build arguments (with defaults)
- `.github/workflows/ci.yaml` - CI/CD pipeline
**Important:** When updating versions, modify `.env.versions` and sync with `devbox.json`.
## Local Build
### Using Task (recommended)
The easiest way to build the OCI image:
```bash
task build:oci-image
```
This automatically:
- Loads versions from `.env.versions`
- Builds the image with correct build arguments
- Tags with `latest` and git commit hash
To build and test:
```bash
task test:oci-image
```
### Automatic version loading
Use the helper script to load versions from `.env.versions`:
```bash
source scripts/get-versions.sh
```
This will show you the Docker build command with the correct versions.
### Manual build
```bash
docker build --network=host \
--build-arg NODE_VERSION=24.10.0 \
--build-arg GO_VERSION=1.25.1 \
--build-arg HUGO_VERSION=0.151.0 \
-t ipceicis-developerframework:latest .
```
### Test the image
```bash
docker run -d -p 8080:80 --name hugo-test ipceicis-developerframework:latest
curl http://localhost:8080
docker stop hugo-test && docker rm hugo-test
```
## CI/CD Pipeline
The GitHub Actions workflow (`.github/workflows/ci.yaml`) automatically:
1. Extracts versions from devbox environment
2. Builds multi-arch images (amd64 + arm64)
3. Pushes to the container registry with appropriate tags
### Required Secrets
Configure these secrets in your GitHub repository:
- `PACKAGES_USER`: Container registry username
- `PACKAGES_TOKEN`: Container registry token/password
## Image Structure
- **Build Stage**: Uses Node.js base image, installs Go and Hugo
- **Runtime Stage**: Uses nginx:alpine to serve static content (~50MB)
The build process:
1. Installs npm dependencies
2. Downloads Hugo modules
3. Builds static site with `hugo --gc --minify`
4. Copies built site to minimal nginx container