Django Gitlab CI/CD Проблема с WEB_IMAGE=$IMAGE:web

Я новичок в Gitlab CI/CD. У меня есть проект django, запущенный на моей локальной машине в docker. Я хочу настроить Gitlab CI/CD с моим проектом django (база данных - postgres, прокси-сервер - nginx).

Здесь представлены мои файлы конфигурации.

.env

DEBUG=1
SECRET_KEY=foo
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
DATABASE=postgres
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=foo
SQL_USER=foo
SQL_PASSWORD=foo
SQL_HOST=db
SQL_PORT=5432
POSTGRES_USER=pos
POSTGRES_PASSWORD=123456
POSTGRES_DB=foo

Докер-файл:

FROM python:3.9.6-alpine

ENV HOME=/web
ENV APP_HOME=/web
RUN mkdir $APP_HOME
RUN mkdir $APP_HOME/staticfiles
WORKDIR $APP_HOME

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update \
    && apk add postgresql-dev gcc python3-dev musl-dev

RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY ./entrypoint.sh .
RUN sed -i 's/\r$//g' /web/entrypoint.sh
RUN chmod +x /web/entrypoint.sh

COPY . /web/

RUN python manage.py collectstatic --no-input --clear

ENTRYPOINT ["/web/entrypoint.sh"]

docker-compose.yml

version: '3.8'

services:
  web:
    build: .
    command: gunicorn pos.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - .:/web/
      - static_volume:/web/staticfiles
    ports:
      - 8000:8000
    env_file:
      - ./.env

  db:
    image: postgres:13.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - ./.env

  nginx:
    build: ./nginx
    ports:
      - 1337:80
    volumes:
      - static_volume:/web/staticfiles
    depends_on:
      - web

volumes:
  postgres_data:
  static_volume:

entrypoint.sh

#!/bin/sh

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

python manage.py flush --no-input
python manage.py migrate

exec "$@"

.gitlab-ci.yml

image:
  name: docker/compose:1.29.1
  entrypoint: [""]

services:
  - docker:dind

stages:
  - build
  - deploy

variables:
  DOCKER_HOST: tcp://docker:2375
  DOCKER_DRIVER: overlay2

before_script:
  - export IMAGE=$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME
  - export WEB_IMAGE=$IMAGE:web
  - export NGINX_IMAGE=$IMAGE:nginx
  - apk add --no-cache openssh-client bash
  - chmod +x ./setup_env.sh
  - bash ./setup_env.sh
  - docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY

build:
  stage: build
  script:
    - docker pull $IMAGE:web || true
    - docker pull $IMAGE:nginx || true
    - docker-compose -f docker-compose.yml build
    - docker push $IMAGE:web
    - docker push $IMAGE:nginx

deploy:
  stage: deploy
  script:
    - mkdir -p ~/.ssh
    - echo "$PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
    - cat ~/.ssh/id_rsa
    - chmod 700 ~/.ssh/id_rsa
    - eval "$(ssh-agent -s)"
    - ssh-add ~/.ssh/id_rsa
    - ssh-keyscan -H 'gitlab.com' >> ~/.ssh/known_hosts
    - chmod +x ./deploy.sh
    - scp  -o StrictHostKeyChecking=no -r ./.env ./docker-compose.yml user@$VPS_IP_ADDRESS:/web
    - bash ./deploy.sh

setup_env.sh

echo DEBUG=$DEBUG >> .env
echo SQL_ENGINE=django.db.backends.postgresql >> .env
echo DATABASE=postgres >> .env

echo SECRET_KEY=$SECRET_KEY >> .env
echo SQL_DATABASE=$SQL_DATABASE >> .env
echo SQL_USER=$SQL_USER >> .env
echo SQL_PASSWORD=$SQL_PASSWORD >> .env
echo SQL_HOST=$SQL_HOST >> .env
echo SQL_PORT=$SQL_PORT >> .env

echo WEB_IMAGE=$IMAGE:web  >> .env
echo NGINX_IMAGE=$IMAGE:nginx  >> .env
echo CI_REGISTRY_USER=$CI_REGISTRY_USER   >> .env
echo CI_JOB_TOKEN=$CI_JOB_TOKEN  >> .env
echo CI_REGISTRY=$CI_REGISTRY  >> .env
echo IMAGE=$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME >> .env

deploy.sh

#!/bin/sh

ssh -o StrictHostKeyChecking=no user@$VPS_IP_ADDRESS << 'ENDSSH'
  cd /web
  export $(cat .env | xargs)
  docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
  docker pull $IMAGE:web
  docker pull $IMAGE:nginx
  docker-compose -f docker-compose.yml up -d
ENDSSH

введите описание изображения здесь

введите описание изображения здесь

Это вся информация, которую я могу предоставить, пожалуйста, помогите мне, ребята!!!

Спасибо!

Если я понимаю ваш вопрос, проблема в

- export IMAGE=$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME
- export WEB_IMAGE=$IMAGE:web
- export NGINX_IMAGE=$IMAGE:nginx

Делая это, вы получите путь к реестру с .../PROJECTNAME:web, а такого образа не существует. Вы должны создать образ в реестре, а затем поставить метку latest или любую другую, чтобы путь к образу был .../PROJECTNAME/web:latest, например

Вернуться на верх