Я пытаюсь создать образ Docker, содержащий веб-сервер Apache с Django. Я использую виртуальные среды в своей производственной среде и не знаю, как активировать их в Dockerfile.
Это мой Dockerfile:
FROM ubuntu/apache
ARG GITLAB_USERNAME
ARG GITLAB_TOKEN
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y python3 python3-pip apache2 libapache2-mod-wsgi-py3 libpq-dev git
RUN pip3 install virtualenv
RUN mkdir -p /var/www
WORKDIR "/var/www"
RUN git clone https://${GITLAB_USERNAME}:${GITLAB_TOKEN}@gitlab.com/g5362/gnsave.git
RUN mv gnsave/Netto\ umgeschrieben/ ./GNSave
RUN rm -r gnsave
WORKDIR "/GNSave/"
RUN virtualenv gnsave
RUN source gnsave/bin/activate && pip install -r requirements.txt
RUN a2enmod wsgi
RUN chown -R www-data:www-data /var/www/GNSave
RUN chmod -R u+w /var/www/GNSave
RUN chmod -R 775 /var/www/GNSave/assets
COPY django.conf /etc/apache2/sites-available/django.conf
RUN a2dissite 000-default
RUN a2ensite django
RUN /etc/init.d/apache2 restart
Сообщение об ошибке, которое я получаю:
/bin/sh: 1: source: not found
Мой вопрос заключается в том, должен ли я разделить django и apache на два докера и составить их, или если в моем Dockerfile есть обходной путь для активации venvs.
Заранее спасибо!
Быстрый вопрос: зачем вам создавать виртуальную среду внутри докера, если она уже изолирована от вашей системы?
Чтобы объяснить ваше сообщение об ошибке, это потому, что по умолчанию Docker запускает эти команды с помощью /bin/sh
. source
— это команда Bash. У вас есть два варианта:
SHELL ["/bin/bash", "-c"]
перед командами RUN.RUN . gnsave/bin/activate && pip install -r requirements.txt
Разделение двух отдельных процессов на два отдельных контейнера обычно является хорошим подходом. Вам не нужна виртуальная среда в выделенном контейнере Django; вы можете использовать «системный» Python там, и он будет изолирован от Python хоста и Python в других контейнерах.