Перенос проекта Django с помощью среды Conda в контейнер Docker

Я новичок в Django и пытаюсь следовать книге Django for Professionals 3.1 Уильяма С. Винсента. В этом контексте я пытаюсь перенести простой проект Django, который в настоящее время находится на моей системе (Mac OS) с использованием среды conda на PyCharm IDE в контейнер Docker.

Проблема

В книге для проекта используется pipenv и предлагается ввести следующий код в Dockerfile: Dockerfile code given in the book

Однако, поскольку я использую среду 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
Вернуться на верх