Building, using, and distributing Docker images
Docker Development
Guide for Docker-based development and image distribution.
Using Docker Directly
# Build the image
docker build -f plugins/docker-runner/Dockerfile -t astrolock:latest .
# Run a command
docker run --rm -it \
-v $(pwd):/site \
-w /site \
astrolock:latest \
astrolock help
# Start dev server
docker run --rm -it \
-v $(pwd):/site \
-w /site \
-p 4321:4321 \
astrolock:latest \
astrolock write
Docker Compose
For development workflows:
# Interactive shell
docker-compose run astrolock
# Dev server with hot reload
docker-compose up dev
# Production build
docker-compose run build
Services
| Service | Description | Command |
|---|---|---|
astrolock | Interactive CLI | docker-compose run astrolock |
dev | Dev server | docker-compose up dev |
build | Production build | docker-compose run build |
Image Details
- Node.js 18 (Alpine Linux)
- Yarn package manager
- Git, jq
- ffmpeg & lame (audio encoding)
- AWS CLI
Size: ~500MB compressed, ~1.2GB uncompressed
Volume Mounts
# Site directory
-v $(pwd):/site
# AWS credentials (read-only)
-v ~/.aws:/root/.aws:ro
# SSH keys (for Git)
-v ~/.ssh:/root/.ssh:ro
Building Custom Images
- Add Dependencies
- Build with Arguments
Edit plugins/docker-runner/Dockerfile:
RUN apk add --no-cache \
imagemagick \
ghostscriptdocker build \
--build-arg NODE_VERSION=20 \
-f plugins/docker-runner/Dockerfile \
-t astrolock:custom \
.Edit plugins/docker-runner/Dockerfile:
RUN apk add --no-cache \
imagemagick \
ghostscriptdocker build \
--build-arg NODE_VERSION=20 \
-f plugins/docker-runner/Dockerfile \
-t astrolock:custom \
.AWS ECR Distribution
Info
For distributing Docker images to your team, use AWS ECR (Elastic Container Registry).
Prerequisites
- AWS CLI configured (
aws configure) - ECR repository created (via Terraform or AWS Console)
- Docker installed
- Publish
- Pull
- Using Make
# Set your ECR details
export ECR_REGION="us-east-1"
export ECR_REGISTRY_URL="123456789012.dkr.ecr.us-east-1.amazonaws.com"
export ECR_REPOSITORY="astrolock-cli"
export IMAGE_TAG="latest"
# Build the image
docker build -f ./Dockerfile -t ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG} .
# Authenticate with ECR
aws ecr get-login-password --region ${ECR_REGION} | \
docker login --username AWS --password-stdin ${ECR_REGISTRY_URL}
# Push to ECR
docker push ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG}
echo "Published to ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG}"# Set your ECR details
export ECR_REGION="us-east-1"
export ECR_REGISTRY_URL="123456789012.dkr.ecr.us-east-1.amazonaws.com"
export ECR_REPOSITORY="astrolock-cli"
export IMAGE_TAG="latest"
# Authenticate with ECR
aws ecr get-login-password --region ${ECR_REGION} | \
docker login --username AWS --password-stdin ${ECR_REGISTRY_URL}
# Pull from ECR
docker pull ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG}
echo "Pulled ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG}"# Publish using Makefile (recommended)
make docker.build
make docker.publish
# Pull using Makefile
make docker.pull# Set your ECR details
export ECR_REGION="us-east-1"
export ECR_REGISTRY_URL="123456789012.dkr.ecr.us-east-1.amazonaws.com"
export ECR_REPOSITORY="astrolock-cli"
export IMAGE_TAG="latest"
# Build the image
docker build -f ./Dockerfile -t ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG} .
# Authenticate with ECR
aws ecr get-login-password --region ${ECR_REGION} | \
docker login --username AWS --password-stdin ${ECR_REGISTRY_URL}
# Push to ECR
docker push ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG}
echo "Published to ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG}"# Set your ECR details
export ECR_REGION="us-east-1"
export ECR_REGISTRY_URL="123456789012.dkr.ecr.us-east-1.amazonaws.com"
export ECR_REPOSITORY="astrolock-cli"
export IMAGE_TAG="latest"
# Authenticate with ECR
aws ecr get-login-password --region ${ECR_REGION} | \
docker login --username AWS --password-stdin ${ECR_REGISTRY_URL}
# Pull from ECR
docker pull ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG}
echo "Pulled ${ECR_REGISTRY_URL}/${ECR_REPOSITORY}:${IMAGE_TAG}"# Publish using Makefile (recommended)
make docker.build
make docker.publish
# Pull using Makefile
make docker.pullMulti-Stage Builds
For smaller production images:
FROM astrolock:latest AS builder
WORKDIR /site
COPY . .
RUN astrolock build
FROM nginx:alpine
COPY --from=builder /site/dist /usr/share/nginx/htmlPerformance Tips
# docker-compose.yml
volumes:
- ./:/site
- node_modules:/site/node_modules # Named volumePlatform-Specific Notes
| Platform | Notes |
|---|---|
| macOS | Docker Desktop recommended. Volume mounts slower than Linux. |
| Windows | Use WSL2 backend for better performance. |
| Linux | Native performance. No special configuration needed. |
Troubleshooting
- Permission Issues
- Port in Use
- Slow on macOS
# Fix ownership
sudo chown -R $USER:$USER .
# Or run as your user
docker run --user $(id -u):$(id -g) ...docker run -p 8080:4321 ...
# Access at http://localhost:8080Use named volumes for node_modules (configured in docker-compose.yml).
# Fix ownership
sudo chown -R $USER:$USER .
# Or run as your user
docker run --user $(id -u):$(id -g) ...docker run -p 8080:4321 ...
# Access at http://localhost:8080Use named volumes for node_modules (configured in docker-compose.yml).
Tip
Setting up CI/CD? See Deployment Automation for GitHub Actions workflows.