
GitHub Actions는 기본적으로 VM 환경을 제공하지만, Docker를 활용하면 완전히 통제된 실행환경을 구성할 수 있다.
특히 언어·OS 차이, DB 연동 테스트, 로컬 개발과의 환경 일치가 중요한 프로젝트에서 Docker Job은 필수다.
이 글은 Docker 기반 GitHub Actions의 핵심 요소인
Container Job / Service Container / Dockerfile 기반 커스텀 빌드 / DB 테스트 환경 구성을 구조적으로 정리한다.
GitHub Actions의 Docker 활용은 크게 두 가지로 나뉜다.
| 종류 | 목적 | 특징 |
|---|---|---|
| Container Job | Job 전체를 특정 Docker 이미지로 실행 | 실행환경 통일, 의존성 충돌 제거 |
| Service Container | 테스트에 필요한 외부 서비스(DB 등) 제공 | 컨테이너 간 네트워크 자동 구성 |
이 두 기능을 조합하면 애플리케이션 + DB + 메시지 브로커 환경까지 CI에서 그대로 재현할 수 있다.
Container Job은 실행 VM 대신 Docker 이미지를 Job 실행 환경으로 사용한다.
jobs:
build:
runs-on: ubuntu-latest
container:
image: node:18
steps:
- uses: actions/checkout@v4
- run: node -v
해석
컨테이너 내부에서도 동일하게 접근할 수 있다.
steps:
- run: echo $TOKEN
env:
TOKEN: ${{ secrets.API_TOKEN }}
경로가 달라지는 경우도 있으므로 컨테이너 OS 기준 경로를 정확히 지정해야 한다.
프로젝트에서 자체 Dockerfile을 활용할 수 있다.
jobs:
build:
runs-on: ubuntu-latest
container:
image: ghcr.io/org/app:latest
혹은 Workflow에서 직접 빌드 후 container로 사용하려면 다음과 같은 패턴이 필요하다.
steps:
- uses: actions/checkout@v4
- run: docker build -t app-image .
- run: docker run app-image npm test
이 방식은 container job이 아니라 VM 내 Docker 실행이므로 구분해야 한다.
Service Container는 테스트에서 필요한 외부 서비스를 컨테이너로 제공한다.
예: PostgreSQL + Redis 테스트 환경
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:14
env:
POSTGRES_PASSWORD: pass
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready"
--health-interval=5s
redis:
image: redis:7
ports:
- 6379:6379
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
env:
DB_HOST: postgres
REDIS_HOST: redis
핵심 구조:
Container Job 내부에서 Service Container와 함께 사용하는 것도 가능하다.
jobs:
test:
runs-on: ubuntu-latest
container:
image: node:18
services:
mysql:
image: mysql:8
env:
MYSQL_ROOT_PASSWORD: root
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
env:
DB_HOST: mysql
컨테이너 간 네트워크 연결은 GitHub Actions가 자동 구성하므로 별도 docker network 설정이 필요 없다.
DB 테스트는 Service Container의 대표적인 사용처이다.
services:
db:
image: postgres:15
env:
POSTGRES_PASSWORD: test
ports:
- 5432:5432
Step에서 연결:
env:
DATABASE_URL: "postgres://postgres:test@db:5432/app"
주의:
docker-entrypoint-initdb.d 를 활용이 둘을 섞어 이해하면 경로·환경 변수 혼동이 발생한다.
환경 변수를 통해 컨테이너 내부로 전달되므로, 출력 금지 규칙을 동일하게 적용해야 한다.
docker build를 직접 수행하려면 privileged runner 환경이 필요할 수 있다.
name: docker-ci
on: push
jobs:
test:
runs-on: ubuntu-latest
container:
image: node:18
services:
postgres:
image: postgres:14
env:
POSTGRES_PASSWORD: pass
options: >-
--health-cmd="pg_isready"
--health-interval=5s
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run test
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t app .
구조적 해석:
Docker 기반 실행은 CI/CD 환경을 표준화하고 테스트 신뢰성을 크게 올릴 수 있다.
Docker는 GitHub Actions CI/CD 환경의 확장성과 재현성을 모두 확보하는 핵심 기능이다.