'Generic Commit'
All checks were successful
Docker-in-Docker Example / docker-example (push) Successful in 7s
test-actions / build (push) Successful in 3s

This commit is contained in:
Your Name 2025-06-01 11:53:25 +12:00
parent 9b670600f6
commit 031d552374
4 changed files with 276 additions and 25 deletions

View File

@ -0,0 +1,44 @@
name: Docker-in-Docker Example
run-name: Docker-in-Docker Example
on: [push]
jobs:
docker-example:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Show environment
run: |
echo "JOB_CONTAINER_NAME: ${JOB_CONTAINER_NAME}"
echo "GITHUB_WORKSPACE: ${GITHUB_WORKSPACE}"
- name: Test Docker with volumes-from
run: |
# Create a test file
echo "Hello from Gitea Actions!" > test.txt
# Run Docker container with proper volume sharing
docker run --rm \
--volumes-from="${JOB_CONTAINER_NAME}" \
alpine:latest sh -c "cd ${GITHUB_WORKSPACE} && cat test.txt"
- name: Build and run custom image
run: |
# Create a simple Dockerfile
cat > Dockerfile << 'EOF'
FROM alpine:latest
WORKDIR /app
CMD ["sh", "-c", "echo 'Container started!' && ls -la"]
EOF
# Build the image
docker build -t test-app:latest .
# Run with volume sharing
docker run --rm \
--volumes-from="${JOB_CONTAINER_NAME}" \
-w "${GITHUB_WORKSPACE}" \
test-app:latest

146
README-docker-in-docker.md Normal file
View File

@ -0,0 +1,146 @@
# Docker-in-Docker in Gitea Actions
## The Problem
When running Docker commands inside a Gitea Actions container, volume mounts don't work as expected because:
1. Gitea Actions runs your job inside a container
2. When you try to mount volumes using `docker run -v`, Docker looks for paths on the **host** system, not inside the action container
3. This causes empty or incorrect directory mounts
## The Solution
Gitea Actions provides an environment variable `JOB_CONTAINER_NAME` that contains the name of the job container. You can use `--volumes-from` to share volumes from the job container to your nested Docker containers.
## Basic Usage
Instead of:
```bash
# This won't work in Gitea Actions
docker run -v $(pwd):/workspace alpine:latest ls -la /workspace
```
Use:
```bash
# This works in Gitea Actions
docker run --volumes-from="${JOB_CONTAINER_NAME}" alpine:latest sh -c "cd ${GITHUB_WORKSPACE} && ls -la"
```
## Complete Example
```yaml
# .gitea/workflows/docker-example.yaml
name: Docker-in-Docker Example
on: [push]
jobs:
docker-build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build and run Docker container
run: |
# Build a Docker image
docker build -t my-app:latest .
# Run container with access to workspace files
docker run --rm \
--volumes-from="${JOB_CONTAINER_NAME}" \
-w "${GITHUB_WORKSPACE}" \
my-app:latest
```
## Advanced Usage
### Running Multiple Containers
```bash
# Create a network for containers to communicate
docker network create myapp-network
# Run a database container
docker run -d \
--name mydb \
--network myapp-network \
postgres:latest
# Run your app with access to workspace
docker run --rm \
--volumes-from="${JOB_CONTAINER_NAME}" \
--network myapp-network \
-w "${GITHUB_WORKSPACE}" \
-e DATABASE_URL=postgres://mydb:5432/myapp \
my-app:latest
# Cleanup
docker stop mydb
docker rm mydb
docker network rm myapp-network
```
### Using with Docker Compose
For docker-compose, you'll need to use regular `docker run` commands or configure your Gitea runner to support additional volume mounts.
## Important Notes
1. **Always use `--volumes-from="${JOB_CONTAINER_NAME}"`** when you need access to workspace files
2. **Use `${GITHUB_WORKSPACE}`** as the working directory inside your containers
3. **The `JOB_CONTAINER_NAME` variable** is only available when running in Gitea Actions, not locally
4. **For local development**, use standard volume mounts (`-v $(pwd):/workspace`)
## Debugging Tips
1. Check if you're in Gitea Actions:
```bash
if [ -n "${JOB_CONTAINER_NAME:-}" ]; then
echo "Running in Gitea Actions"
else
echo "Running locally"
fi
```
2. List available environment variables:
```bash
env | grep -E "(JOB_|GITHUB_|GITEA_)" | sort
```
3. Debug volume mounts:
```bash
# Show what's mounted in the job container
mount | grep -E "(overlay|workspace)"
```
## Common Issues
### Issue: "volume is in use" error
**Solution**: Add `--rm` flag to automatically remove containers after they exit
### Issue: Files created in Docker container have wrong permissions
**Solution**: Run containers with the same user as the job container:
```bash
docker run --rm \
--volumes-from="${JOB_CONTAINER_NAME}" \
--user "$(id -u):$(id -g)" \
alpine:latest command
```
### Issue: Need to persist data between steps
**Solution**: Create named volumes or use the workspace directory:
```bash
# Create a named volume
docker volume create mydata
# Use it in multiple steps
docker run --rm \
--volumes-from="${JOB_CONTAINER_NAME}" \
-v mydata:/data \
alpine:latest sh -c "echo 'test' > /data/file.txt"
```
## References
- [Gitea Actions Documentation](https://docs.gitea.io/en-us/actions-overview/)
- [Related GitHub Issue #189](https://gitea.com/gitea/act_runner/issues/189)

85
docker-in-docker-example.sh Executable file
View File

@ -0,0 +1,85 @@
#!/bin/bash
set -euo pipefail
echo "=== Docker-in-Docker Example for Gitea Actions ==="
echo "JOB_CONTAINER_NAME: ${JOB_CONTAINER_NAME:-not set}"
echo "GITHUB_WORKSPACE: ${GITHUB_WORKSPACE:-$(pwd)}"
echo ""
# Create a simple Dockerfile for testing
cat > Dockerfile.test << 'EOF'
FROM alpine:latest
RUN apk add --no-cache bash
WORKDIR /app
COPY . .
CMD ["bash", "-c", "echo 'Hello from Docker container!' && ls -la"]
EOF
# Create a test file
echo "This is a test file created in Gitea Actions" > test-data.txt
if [ -n "${JOB_CONTAINER_NAME:-}" ]; then
echo "Running in Gitea Actions - using --volumes-from for Docker operations"
echo ""
# Build the Docker image
echo "1. Building Docker image..."
docker build -f Dockerfile.test -t test-image:latest .
echo ""
# Run container with volumes from the job container
echo "2. Running Docker container with shared volumes..."
docker run --rm \
--volumes-from="${JOB_CONTAINER_NAME}" \
-w "${GITHUB_WORKSPACE}" \
test-image:latest
echo ""
# Example: Running a command that needs access to workspace files
echo "3. Running Alpine container to process workspace files..."
docker run --rm \
--volumes-from="${JOB_CONTAINER_NAME}" \
alpine:latest sh -c "cd ${GITHUB_WORKSPACE} && echo 'Files in workspace:' && find . -type f -name '*.txt' | head -10"
echo ""
# Example: Using docker-compose (if needed)
echo "4. Creating docker-compose.yml for multi-container setup..."
cat > docker-compose.test.yml << EOF
version: '3'
services:
app:
image: alpine:latest
volumes_from:
- ${JOB_CONTAINER_NAME}
working_dir: ${GITHUB_WORKSPACE}
command: ["sh", "-c", "echo 'Hello from docker-compose!' && ls -la"]
EOF
# Note: docker-compose with volumes_from requires special handling
echo "Note: For docker-compose, you may need to use docker run instead or configure the runner differently"
else
echo "Running locally - using standard volume mounts"
echo ""
# Build the Docker image
echo "1. Building Docker image..."
docker build -f Dockerfile.test -t test-image:latest .
echo ""
# Run container with local volume mount
echo "2. Running Docker container with local volume..."
docker run --rm -v "$(pwd):/app" test-image:latest
echo ""
# Example: Running Alpine with local mount
echo "3. Running Alpine container with local mount..."
docker run --rm -v "$(pwd):/workspace" -w /workspace alpine:latest sh -c "echo 'Files in workspace:' && find . -type f -name '*.txt' | head -10"
fi
# Cleanup
rm -f Dockerfile.test test-data.txt docker-compose.test.yml
echo ""
echo "=== Example completed successfully ==="

26
test.sh
View File

@ -50,32 +50,8 @@ if [ -n "${JOB_CONTAINER_NAME:-}" ]; then
rm -f test-file.txt rm -f test-file.txt
else else
echo "--------------------------------" echo "--------------------------------"
echo "Running locally - using direct volume mounts" echo "Running locally - no test."
echo "--------------------------------" echo "--------------------------------"
echo "ls -la ./"
docker run --rm -i --entrypoint /bin/bash -v ./:/workspace debian:latest -c "ls -la /workspace"
echo "--------------------------------"
echo "ls -la \$PWD"
docker run --rm -i --entrypoint /bin/bash -v "$PWD:/workspace" debian:latest -c "ls -la /workspace"
echo "--------------------------------"
echo "ls -la \$SCRIPT_DIR"
docker run --rm -i --entrypoint /bin/bash -v "$SCRIPT_DIR:/workspace" debian:latest -c "ls -la /workspace"
fi fi
echo "--------------------------------"
MOUNT_DIR="$SCRIPT_DIR"
if [ -n "${HOST_WORKSPACE_PATH:-}" ]; then
MOUNT_DIR=$(echo "$SCRIPT_DIR" | sed "s|^/workspace|$HOST_WORKSPACE_PATH|")
if [ "$MOUNT_DIR" != "$SCRIPT_DIR" ]; then
echo "Docker-in-Docker: Mapping $SCRIPT_DIR to $MOUNT_DIR"
fi
fi
echo "MOUNT_DIR: $MOUNT_DIR"
echo "ls -la \$MOUNT_DIR"
docker run --rm -i --entrypoint /bin/bash -v "$MOUNT_DIR:/workspace" debian:latest -c "ls -la /workspace"
echo "--------------------------------"