使用Compose&;部署Docker容器;Github操作
我正在使用GitHub操作触发我的dockerfile的构建,它将容器上载到GitHub容器注册表。在最后一步中,我将通过SSH连接到我的remoteDigitalOcean Droplet,并执行脚本从GHCR中拉出和安装新映像。这个工作流对我来说很好,因为我在项目中只构建了一个单个容器现在我正在使用docker compose,因为除了API之外,我还需要NGINX。我想将容器保存在单个dropplet上,因为该项目目前不需要资源 使用Github操作和Docker Compose在单个VM上自动部署到DigitalOcean的正确方法是什么 我目前已知的选项有:使用Compose&;部署Docker容器;Github操作,docker,github,docker-compose,digital-ocean,github-actions,Docker,Github,Docker Compose,Digital Ocean,Github Actions,我正在使用GitHub操作触发我的dockerfile的构建,它将容器上载到GitHub容器注册表。在最后一步中,我将通过SSH连接到我的remoteDigitalOcean Droplet,并执行脚本从GHCR中拉出和安装新映像。这个工作流对我来说很好,因为我在项目中只构建了一个单个容器现在我正在使用docker compose,因为除了API之外,我还需要NGINX。我想将容器保存在单个dropplet上,因为该项目目前不需要资源 使用Github操作和Docker Compose在单个VM
- 跳过在GHCR上构建容器,并通过ssh获取repo,通过执行生产组合文件从源代码远程开始构建
- 在GHCR上构建每个容器,在remote上复制生产组合文件,以便从GHCR中拉取和安装
name: Github Container Registry to DigitalOcean Droplet
on:
# Trigger the workflow via push on main branch
push:
branches:
- main
# use only trigger action if the backend folder changed
paths:
- "backend/**"
- ".github/workflows/**"
jobs:
# Builds a Docker Image and pushes it to Github Container Registry
push_to_github_container_registry:
name: Push to GHCR
runs-on: ubuntu-latest
# use the backend folder as the default working directory for the job
defaults:
run:
working-directory: ./backend
steps:
# Checkout the Repository
- name: Checking out the repository
uses: actions/checkout@v2
# Setting up Docker Builder
- name: Set up Docker Builder
uses: docker/setup-buildx-action@v1
# Set Github Access Token with "write:packages & read:packages" scope for Github Container Registry.
# Then go to repository setings and add the copied token as a secret called "CR_PAT"
# https://github.com/settings/tokens/new?scopes=repo,write:packages&description=Github+Container+Registry
# ! While GHCR is in Beta make sure to enable the feature
- name: Logging into GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.CR_PAT }}
# Push to Github Container Registry
- name: Pushing Image to Github Container Registry
uses: docker/build-push-action@v2
with:
context: ./backend
version: latest
file: backend/dockerfile
push: true
tags: ghcr.io/${{ github.repository }}:latest
# Connect to existing Droplet via SSH and (re)installs add. runs the image
# ! Ensure you have installed the preconfigured Droplet with Docker
# ! Ensure you have added SSH Key to the Droplet
# ! - its easier to add the SSH Keys bevore createing the droplet
deploy_to_digital_ocean_dropplet:
name: Deploy to Digital Ocean Droplet
runs-on: ubuntu-latest
needs: push_to_github_container_registry
steps:
- name: Deploy to Digital Ocean droplet via SSH action
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.PRIVATE_KEY }}
port: ${{ secrets.PORT }}
script: |
# Stop all running Docker Containers
docker kill $(docker ps -q)
# Free up space
docker system prune -a
# Login to Github Container Registry
docker login https://ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.CR_PAT }}
# Pull the Docker Image
docker pull ghcr.io/${{ github.repository }}:latest
# Run a new container from a new image
docker run -d -p 80:8080 -p 443:443 -t ghcr.io/${{ github.repository }}:latest
当前Docker撰写
version: "3"
services:
api:
build:
context: ./backend/api
networks:
api-network:
aliases:
- api-net
nginx:
build:
context: ./backend/nginx
ports:
- "80:80"
- "443:443"
networks:
api-network:
aliases:
- nginx-net
depends_on:
- api
networks:
api-network: