Dockerizing Your Python App for CI/CD
Dockerizing your Python application helps ensure consistent environments across different stages of your CI/CD pipeline, from local development to production.
Why Docker for CI/CD?
- Consistent environment across development, testing, and production.
- Easier dependency management.
- Simplifies deployment.
- Works seamlessly with CI/CD tools like GitHub Actions, GitLab, Jenkins, and AWS.
Prerequisites
- Docker installed on your machine.
- Python application with tests using Pytest.
- CI/CD platform (e.g., GitHub Actions, GitLab CI/CD).
Folder Structure
my_project/
├── api.py # Application code
├── test_api.py # Pytest test cases
├── requirements.txt # Python dependencies
├── Dockerfile # Docker instructions
└── .github/
└── workflows/
└── ci_cd.yml # CI/CD Pipeline (GitHub Actions example)
Step 1: Create Dockerfile
The Dockerfile defines how to build your application into a Docker image.
Dockerfile
# Use official Python image
FROM python:3.10-slim
# Set working directory
WORKDIR /app
# Copy requirements and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy app source code
COPY . .
# Run tests by default
CMD ["pytest"]
Step 2: Create requirements.txt
List your project dependencies:
aiohttp
pytest
pytest-asyncio
Step 3: Build Docker Image Locally
To build the Docker image locally, run:
docker build -t my_project .
Run the container:
docker run --rm my_project
If tests pass, you'll see the Pytest output.
Step 4: GitHub Actions CI/CD Pipeline
We'll configure GitHub Actions to automatically:
- Build the Docker image.
- Run tests inside the container.
Create the CI/CD pipeline at:
.github/workflows/ci_cd.yml
ci_cd.yml
name: CI/CD Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
docker-build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build Docker Image
run: docker build -t my_project .
- name: Run Tests
run: docker run --rm my_project
Step 5: Push Code to GitHub
Commit and push your code:
git add .
git commit -m "Dockerize app with CI/CD"
git push origin main
Step 6: View Pipeline Results
- Go to your GitHub repository.
- Navigate to the Actions tab.
- Click on the latest pipeline run to view the logs.
Docker Image Publishing (Optional)
If you want to publish your Docker image to Docker Hub or GitHub Packages, add these steps:
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push Docker Image
run: docker push my_project:latest
Best Practices
- Use multi-stage builds to optimize image size.
- Add health checks to Docker containers.
- Use environment variables for configuration.
- Automatically remove old images using Docker cleanup tools.
Conclusion
Dockerizing your Python app for CI/CD ensures consistent environments, faster testing, and simplified deployments. By combining Docker with Pytest and CI/CD pipelines, you can achieve seamless automation from code commit to production deployment.
Comments
Post a Comment