Skip to content

fix(deploy): clean up unused docker images to prevent space overflow #43

fix(deploy): clean up unused docker images to prevent space overflow

fix(deploy): clean up unused docker images to prevent space overflow #43

Workflow file for this run

name: Build and Deploy Docker Image
on:
push:
branches:
- master
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to Docker Registry
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
registry: ${{ secrets.DOCKER_REGISTRY }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push app Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.DOCKER_REGISTRY }}/rus2m/achievements-bot-app:latest
- name: Build and push cron Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./cron.Dockerfile
push: true
tags: ${{ secrets.DOCKER_REGISTRY }}/rus2m/achievements-bot-cron:latest
deploy:
runs-on: ubuntu-latest
needs: build-and-push
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up SSH
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add SSH key to known hosts
run: |
ssh-keyscan -H ${{ secrets.SSH_EXTERNAL_IP }} >> ~/.ssh/known_hosts
- name: Create devo.conf
run: |
echo 'POSTGRES_HOST=${{ secrets.POSTGRES_HOST }}' > devo.conf
echo 'POSTGRES_DB=${{ secrets.POSTGRES_DB }}' >> devo.conf
echo 'POSTGRES_USER=${{ secrets.POSTGRES_USER }}' >> devo.conf
echo 'POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }}' >> devo.conf
echo 'S3_ENDPOINT=${{ secrets.S3_ENDPOINT }}' >> devo.conf
echo 'MINIO_ROOT_USER=${{ secrets.MINIO_ROOT_USER }}' >> devo.conf
echo 'MINIO_ROOT_PASSWORD=${{ secrets.MINIO_ROOT_PASSWORD }}' >> devo.conf
echo 'TELEGRAM_BOT_TOKEN=${{ secrets.TELEGRAM_BOT_TOKEN }}' >> devo.conf
echo 'TELEGRAM_BOT_NAME=${{ secrets.TELEGRAM_BOT_NAME }}' >> devo.conf
echo 'DEEPAI_API_TOKEN=${{ secrets.DEEPAI_API_TOKEN }}' >> devo.conf
echo 'GOOGLE_TRANSLATE_API=${{ secrets.GOOGLE_TRANSLATE_API }}' >> devo.conf
- name: Copy configuration files to server
run: |
scp devo.conf ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_EXTERNAL_IP }}:devo.conf
scp docker-compose.yml ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_EXTERNAL_IP }}:docker-compose.yml
- name: Replace Running Docker Container
run: |
ssh ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_EXTERNAL_IP }} "
sudo docker image prune -af &&
sudo docker container prune -f &&
sudo docker pull rus2m/achievements-bot-app:latest &&
sudo docker pull rus2m/achievements-bot-cron:latest &&
if [ \$(sudo docker ps -a -q -f name=app) ]; then
sudo docker stop app
sudo docker rm app
sleep 10
fi &&
if [ ! \$(docker ps -q -f name=postgres) ]; then
echo "Initializing postgres instance"
sudo docker-compose -f docker-compose.yml up -d postgres
sleep 1
fi &&
if [ ! \$(docker ps -q -f name=s3) ]; then
echo "Initializing minio instance"
sudo docker-compose -f docker-compose.yml up -d s3
sleep 1
fi &&
if [ \$(sudo docker ps -a -q -f name=cron) ]; then
sudo docker stop cron
sudo docker rm cron
sleep 10
fi &&
echo "Initializing app instance" &&
network_name=\$(sudo docker container inspect \$(sudo docker ps -aqf 'name=postgres') -f '{{json .NetworkSettings.Networks }}' | jq -r 'keys[0]') &&
sudo docker run -d --name app --env-file devo.conf --network \$network_name rus2m/achievements-bot-app:latest &&
sleep 10 &&
echo 'Initializing cron instance' &&
sudo docker run -d --name cron --env-file devo.conf --network \$network_name rus2m/achievements-bot-cron:latest &&
sleep 10 &&
echo "Removing compromising artifacts" &&
rm devo.conf"