146 lines
3.9 KiB
Markdown
146 lines
3.9 KiB
Markdown
# 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) |