initial commit
This commit is contained in:
20
Dockerfile
Normal file
20
Dockerfile
Normal file
@ -0,0 +1,20 @@
|
||||
FROM golang:alpine
|
||||
|
||||
# Install required tools
|
||||
RUN apk add --no-cache git ca-certificates bash
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy entrypoint script
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
# Default environment values (can be overridden at runtime)
|
||||
ENV GIT_REPO=""
|
||||
ENV APP_PATH="."
|
||||
ENV GIT_USERNAME=""
|
||||
ENV GIT_TOKEN=""
|
||||
ENV PACKAGES=""
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
39
README.md
Normal file
39
README.md
Normal file
@ -0,0 +1,39 @@
|
||||
# 🐳 Go Builder & Runner Docker Image
|
||||
|
||||
This Docker image is designed to **download**, **compile**, and **run** a Go program from a Git repository entirely at **container runtime**. It supports both public and private repositories and works seamlessly across multiple architectures (`amd64`, `arm64`).
|
||||
|
||||
---
|
||||
|
||||
## ✅ Features
|
||||
|
||||
- ✅ Clones a Go repository at runtime
|
||||
- ✅ Supports **private Git repositories** using `.netrc`-based auth
|
||||
- ✅ Builds and runs your Go application
|
||||
- ✅ Multi-architecture: `linux/amd64`, `linux/arm64`
|
||||
- ✅ Minimal and reproducible container setup
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Example Usage
|
||||
|
||||
```bash
|
||||
docker run --rm \
|
||||
-e GIT_REPO=https://github.com/youruser/your-go-app.git \
|
||||
-e GIT_USERNAME=yourusername \
|
||||
-e GIT_TOKEN=yourtoken \
|
||||
gorunner:latest
|
||||
```
|
||||
|
||||
## 🔧 Environment Variables
|
||||
|
||||
| Variable | Required | Description |
|
||||
| ---------------------- | -------- | ----------------------------------------------------------------------- |
|
||||
| `GIT_REPO` | ✅ Yes | The HTTPS Git URL of your Go project |
|
||||
| `GIT_USERNAME` | Optional | Your Git username (required for private repos) |
|
||||
| `GIT_TOKEN` | Optional | A personal access token or password (required for private repos) |
|
||||
| `APP_PATH` | Optional | Relative path to the Go module directory inside the repo (default: `.`) |
|
||||
| `PACKAGES` | Optional | Comma-separated list of packages to install with `apk` before execution |
|
||||
|
||||
## 📄 License
|
||||
|
||||
MIT License – feel free to modify and use.
|
50
entrypoint.sh
Normal file
50
entrypoint.sh
Normal file
@ -0,0 +1,50 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
error() {
|
||||
echo "[ERROR] $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ -z "$GIT_REPO" ]; then
|
||||
error "GIT_REPO is not set."
|
||||
fi
|
||||
|
||||
# Install runtime packages if specified
|
||||
if [ -n "$PACKAGES" ]; then
|
||||
echo "[PKG] Installing additional APK packages: $PACKAGES"
|
||||
apk update >/dev/null
|
||||
apk add --no-cache $(echo "$PACKAGES" | tr ',' ' ')
|
||||
fi
|
||||
|
||||
# Extract Git host
|
||||
GIT_HOST=$(echo "$GIT_REPO" | awk -F/ '{print $3}')
|
||||
|
||||
# Configure .netrc
|
||||
if [ -n "$GIT_USERNAME" ] && [ -n "$GIT_TOKEN" ]; then
|
||||
echo "[AUTH] Configuring .netrc for Git authentication..."
|
||||
cat <<EOF > ~/.netrc
|
||||
machine $GIT_HOST
|
||||
login $GIT_USERNAME
|
||||
password $GIT_TOKEN
|
||||
EOF
|
||||
chmod 600 ~/.netrc
|
||||
|
||||
# Prevent Git from prompting and force it to use .netrc
|
||||
export GIT_ASKPASS=true
|
||||
export GIT_TERMINAL_PROMPT=0
|
||||
fi
|
||||
|
||||
# Clean previous checkout
|
||||
rm -rf /app/repo
|
||||
|
||||
echo "[CLONE] Cloning repository: $GIT_REPO"
|
||||
git clone "$GIT_REPO" repo
|
||||
|
||||
cd repo/"${APP_PATH:-.}"
|
||||
|
||||
echo "[BUILD] Building..."
|
||||
go build -o /app/app .
|
||||
|
||||
echo "[RUN] Starting application..."
|
||||
exec /app/app
|
Reference in New Issue
Block a user