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, например