Перенос проекта Django с помощью среды Conda в контейнер Docker
Я новичок в Django и пытаюсь следовать книге Django for Professionals 3.1 Уильяма С. Винсента. В этом контексте я пытаюсь перенести простой проект Django, который в настоящее время находится на моей системе (Mac OS) с использованием среды conda на PyCharm IDE в контейнер Docker.
Проблема
В книге для проекта используется pipenv
и предлагается ввести следующий код в Dockerfile
:
Однако, поскольку я использую среду Conda для проекта, я не могу использовать приведенный выше код в Dockerfile
.
Что я пробовал
Шаг 1
Я начал с ввода следующего кода для создания файла environment.yml
, содержащего все пакеты, которые использует проект.
(django_for_professionals_31) My-MacBook-Pro:django_for_professionals_31_ch1 me$ conda env export --no-builds > environment.yml
Мой файл environment.yml
выглядит следующим образом*:
name: django_for_professionals_31
channels:
- defaults
dependencies:
- asgiref=3.4.1
- bzip2=1.0.8
- ca-certificates=2022.4.26
- certifi=2022.5.18.1
- django=3.2.5
- krb5=1.19.2
- libedit=3.1.20210910
- libffi=3.3
- libpq=12.9
- ncurses=6.3
- openssl=1.1.1o
- pip=21.2.4
- psycopg2=2.8.6
- python=3.10.4
- pytz=2021.3
- readline=8.1.2
- setuptools=61.2.0
- sqlite=3.38.3
- sqlparse=0.4.1
- tk=8.6.12
- typing_extensions=4.1.1
- tzdata=2022a
- wheel=0.37.1
- xz=5.2.5
- zlib=1.2.12
prefix: /opt/anaconda3/envs/django_for_professionals_31
Шаг 2
Затем, основываясь на этом учебнике , я попытался написать свой Dockerfile
, как показано ниже:
# Pull base image
FROM continuumio/miniconda3
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Set work directory
WORKDIR /code
# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml
# Make RUN commands use the new environment:
SHELL ["conda", "run", "-n", "django_for_professionals_31", "/bin/bash", "-c"]
# Demonstrate the environment is activated:
RUN echo "Make sure django is installed:"
RUN python -c "import django"
# The code to run when container is started:
COPY run.py .
ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "django_for_professionals_31", "python", "run.py"]
# Copy project
COPY . /code/
После этого я выполнил команду для создания образа docker. Команда и вывод, который я получил, приведены ниже:
(django_for_professionals_31) My-MacBook-Pro:django_for_professionals_31_ch1 me$ docker build .
[+] Building 3.6s (12/13)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 737B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/continuumio/miniconda3:latest 3.3s
=> [auth] continuumio/miniconda3:pull token for registry-1.docker.io 0.0s
=> [1/8] FROM docker.io/continuumio/miniconda3@sha256:24103733efebe6d610d868ab16a6f0e5f114c7aad0326a793d946b73af15391d 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 5.29kB 0.0s
=> CACHED [2/8] WORKDIR /code 0.0s
=> CACHED [3/8] COPY environment.yml . 0.0s
=> CACHED [4/8] RUN conda env create -f environment.yml 0.0s
=> CACHED [5/8] RUN echo "Make sure django is installed:" 0.0s
=> CACHED [6/8] RUN python -c "import django" 0.0s
=> ERROR [7/8] COPY run.py . 0.0s
------
> [7/8] COPY run.py .:
------
failed to compute cache key: "/run.py" not found: not found
Шаг 3
Я не был уверен, что делать дальше, когда получил эту ошибку, и моим первым побуждением было закомментировать код под секцией # The code to run when container is started:
в Dockerfile
. Так я и сделал, и мой Dockerfile
выглядел следующим образом:
# Pull base image
FROM continuumio/miniconda3
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Set work directory
WORKDIR /code
# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml
# Make RUN commands use the new environment:
SHELL ["conda", "run", "-n", "django_for_professionals_31", "/bin/bash", "-c"]
# Demonstrate the environment is activated:
RUN echo "Make sure django is installed:"
RUN python -c "import django"
# The code to run when container is started:
#COPY run.py .
#ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "django_for_professionals_31", "python", "run.py"]
# Copy project
COPY . /code/
После повторного запуска $ docker build .
в терминале, я смог создать образ Docker, так как последняя строка полученного результата была => => writing image sha256:...
.
Шаг 4
Затем в книге требуется создать файл docker-compose.yml
. Я использую точно такой же код из книги, приведенный ниже:
version: '3.8'
services:
web:
build: .
command: python /code/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- 8000:8000
После этого я выполнил команду для создания контейнера Docker на основе созданного образа. Команда и вывод показаны ниже.
Исходя из вышесказанного, мне кажется, что (хотя я могу ошибаться) после того, как я закомментировал две строки кода в Dockerfile
, среда conda не активируется в контейнере Docker, но включение этих двух строк кода приводит к ошибке failed to compute cache key: "/run.py" not found: not found
, из-за которой образ не может быть создан.
Как я могу решить вышеуказанную проблему и создать образ docker и использовать его для создания контейнера для моего проекта? Любая помощь будет очень признательна. Спасибо.
*Примечание: Я удалил пакет libcxx=12.0.0
из файла environment.yml
, потому что с ним я получал следующую ошибку при запуске $ docker build .
на терминале. Я последовал совету удалить этот пакет после того, как прочитал это
> [4/7] RUN conda env create -f environment.yml:
#9 1.036 Collecting package metadata (repodata.json): ...working... done
#9 8.859 Solving environment: ...working... failed
#9 8.874
#9 8.874 ResolvePackageNotFound:
#9 8.874 - libcxx=12.0.0
#9 8.874
Попробуйте это :
environment.yml
name: myenv
channels:
- conda-forge
dependencies:
- python=3.8
- asgiref==3.3.1
- Django==3.1.7
- pytz==2021.1
- sqlparse==0.4.1
Dockerfile
FROM continuumio/miniconda3
WORKDIR /app
COPY environment.yml .
RUN conda env create -f environment.yml
SHELL ["conda","run","-n","myenv","/bin/bash","-c"]
COPY . .
#start server inside container
CMD ["conda", "run", "--no-capture-output","-n", "myenv", "python3","manage.py", "runserver","0.0.0.0:8000"]
В текущем dir, Build image :
docker build --tag python-django .
Запустите изображение :
docker run --publish 8000:8000 python-django