如何使用 Github 操作发布对 Docker 图像的更改

How to publish changes to Docker images using Github Actions

我正在使用 Docker 和 GitHub Packages/Actions 开发 CI/CD 管道。我有 2 个工作流程:build.ymldeploy.yml.

build.yml 工作流应该从 GitHub 包中提取 Docker 图像,构建它们,运行 自动化测试,然后将新图像推送到 GitHub 包裹。

deploy.yml 工作流程将图像拉到服务器并 运行 发送它们。

我遇到的问题是我的本地更改没有在服务器上更新。

build.yml:

name: Build and Test

on:
  push:
    branches:
      - development

env:
  BACKEND_IMAGE: ghcr.io/$(echo $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')/backend
  FRONTEND_IMAGE: ghcr.io/$(echo $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')/frontend
  NGINX_IMAGE: ghcr.io/$(echo $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')/nginx

jobs:
  test:
    name: Build Images and Run Automated Tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout master
        uses: actions/checkout@v1
      - name: Add environment variables to .env
        run: |
          echo DEBUG=0 >> .env
          echo SQL_ENGINE=django.db.backends.postgresql >> .env
          echo DATABASE=postgres >> .env
          echo SECRET_KEY=${{ secrets.SECRET_KEY }} >> .env
          echo SQL_DATABASE=${{ secrets.SQL_DATABASE }} >> .env
          echo SQL_USER=${{ secrets.SQL_USER }} >> .env
          echo SQL_PASSWORD=${{ secrets.SQL_PASSWORD }} >> .env
          echo SQL_HOST=${{ secrets.SQL_HOST }} >> .env
          echo SQL_PORT=${{ secrets.SQL_PORT }} >> .env
      - name: Set environment variables
        run: |
          echo "BACKEND_IMAGE=$(echo ${{env.BACKEND_IMAGE}} )" >> $GITHUB_ENV
          echo "FRONTEND_IMAGE=$(echo ${{env.FRONTEND_IMAGE}} )" >> $GITHUB_ENV
          echo "NGINX_IMAGE=$(echo ${{env.NGINX_IMAGE}} )" >> $GITHUB_ENV
      - name: Log in to GitHub Packages
        run: echo ${PERSONAL_ACCESS_TOKEN} | docker login ghcr.io -u ${{ secrets.NAMESPACE }} --password-stdin
        env:
          PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
      - name: Pull images
        run: |
          docker pull ${{ env.BACKEND_IMAGE }} || true
          docker pull ${{ env.FRONTEND_IMAGE }} || true
          docker pull ${{ env.NGINX_IMAGE }} || true
      - name: Build images
        run: |
          docker-compose -f docker-compose.ci.yml build
      - name: Run Backend Tests
        run: |
          docker-compose -f docker-compose.ci.yml run backend python manage.py test
      - name: Push images
        run: |
          docker push ${{ env.BACKEND_IMAGE }}
          docker push ${{ env.FRONTEND_IMAGE }}
          docker push ${{ env.NGINX_IMAGE }}

docker-compose.ci.yml:

version: "3.8"

services:
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile.prod
    command: gunicorn backend.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - ./backend:/backend
      - static_volume:/static
      - media_volume:/media
    expose:
      - 8000
    env_file: .env
  frontend:
    build:
      context: ./frontend
    volumes:
      - frontend_build:/frontend/build
  nginx:
    build:
      context: ./nginx
    ports:
      - 80:80
    volumes:
      - frontend_build:/var/www/frontend
    depends_on:
      - backend
      - frontend

volumes:
  frontend_build:
  static_volume:
  media_volume:

backend/Dockerfile.prod:

FROM python:3.9.5-alpine
WORKDIR /backend
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql-dev \
    && pip install psycopg2 \
    && apk del build-deps
RUN pip install --upgrade pip
COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt
COPY ./entrypoint.prod.sh /entrypoint.prod.sh
COPY . /backend/
ENTRYPOINT ["/entrypoint.prod.sh"]

我尝试了几种不同的方法都无济于事。任何有助于理解为什么我的更改没有更新的帮助将不胜感激!

您似乎正在重新推送您拉取的相同图像,而不是构建的图像。为了验证这一点,您可以删除 Pull images 步骤来确认这一点。

如果是这种情况,您可以更改在 docker-compose.ci.yml 中标记图像的方式或更改在 Push images 步骤中推送的图像。

或者,您可以使用记录的流程 here 并稍作更改:

name: Create and publish a Docker image

on:
  push:
    branches: ['release']

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build-and-push-image:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Log in to the Container registry
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

      - name: Build and push backend Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: ./backend # <<<=== Notice this
          file: Dockerfile.prod # <<<=== Notice this
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

为前端添加另一个 Dockerfile 并为其复制最后一步。