Сборка Docker в GitHub Actions ведет себя иначе, чем локальная сборка
Я развертываю приложение Django с помощью Docker под управлением Apache2. Если я собираю образ локально и отправляю его на сервер, я могу запустить его просто отлично. Проблемы начинаются, когда я собираю и переношу образ на сервер с помощью GitHub Actions. Контейнер работает нормально, но если я пытаюсь получить доступ к сайту, то получаю внутреннюю ошибку сервера Apache. Журнал ошибок показывает:
ModuleNotFoundError: No module named 'django'
Когда я запускаю bash в работающем контейнере docker и выполняю pip freeze
, я вижу все необходимые пакеты из моего requirement.txt
(включая django).
Мой Dockerfile:
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN apt-get update -y && apt-get dist-upgrade -y
WORKDIR /var/www/api
# add code
ADD . /var/www/api
# install python dependencies
RUN apt-get install default-mysql-client -y && apt-get install default-libmysqlclient-dev -y && apt-get install libssl-dev -y && pip install -r requirements.txt
# install apache2 and additional modules
RUN apt-get install apache2 -y && apt-get install libapache2-mod-wsgi-py3 -y
RUN a2enmod headers
# copy server configs
COPY 000-default.conf /etc/apache2/sites-available/
RUN sed -i 's/Listen 80/Listen 8000/g' /etc/apache2/ports.conf
RUN python manage.py collectstatic
CMD ["apache2ctl", "-D", "FOREGROUND"]
Действия GitHub:
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
env:
IMAGE_NAME: ${{ github.sha }}_images
steps:
- name: Install SSH Key
uses: shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_PRIVATE_KEY }}
known_hosts: ${{ secrets.SSH_HOST }}
config: ${{ secrets.CONFIG }}
- name: Checkout repository
uses: actions/checkout@v2
- name: Build api image
run: docker build ./api/ --no-cache -t modulo-rest
- name: Save docker image
run: docker save modulo-rest -o $IMAGE_NAME
- name: Push image to server
run: scp $IMAGE_NAME modulo:/data/$IMAGE_NAME
Конфигурация сервера Apache:
<VirtualHost *:8000>
WSGIDaemonProcess djangoproject python-path=/var/www/api
WSGIProcessGroup djangoproject
WSGIScriptAlias / /var/www/api/djangoproject/wsgi.py
WSGIPassAuthorization On
Alias /static/ /var/www/api/static/
Header set Access-Control-Allow-Origin "*"
<Directory /var/www/api/static>
Require all granted
</Directory>
<Directory /var/www/api/djangoproject>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Есть идеи, почему Apache не может найти установленные модули при сборке с помощью GitHub Actions?
Единственная странность, которую я обнаружил, заключается в том, что когда я собираю локально, в контейнере работает python 3.9 по сравнению с python 3.10 при сборке с помощью GitHub Actions.
Спасибо