Ваш контейнер Docker является полностью изолированной средой. Ничто из того, что вы устанавливаете на хосте, не видно внутри контейнера; ничего, что происходит внутри контейнера, не доступно на хосте. Есть способы преодолеть эту границу (с помощью docker run -v
bind mounts), но это невозможно во время фазы docker build
.
В этом примере в вашем локальном дереве исходных файлов есть файл requirements.txt
, в котором перечислены пакеты, которые должны быть установлены при создании контейнера. (Строка RUN pip freeze
не имеет никакого эффекта; строка COPY
после того, как она скопирует ее из дерева локальных исходных файлов.) Достаточно добавить зависимость в файл requirements.txt
gunicorn
In В вашей среде разработки вы можете повторно запустить pip install -r requirements.txt
, чтобы обновить пакеты, установленные в вашей виртуальной среде. При повторном запуске docker build
наличие этой строки в файле requirements.txt
приведет к его установке при сборке пакета.
Вы можете немного почистить Dockerfile. Результирующий Dockerfile будет довольно типичным для Python пакетов с C зависимостями:
# Start from a totally clean environment with Python installed,
# but no non-system libraries and nothing from your host system.
FROM python:3.7-slim
# Install C dependencies.
# It's important to do apt-get update and install in the
# same command. It's more efficient to only do it once.
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
gcc \
libmariadb-dev \
libmariadb-dev-compat
# Update pip
RUN python -m pip install --upgrade pip
# Create the application directory and point there
# (WORKDIR will implicitly create it)
WORKDIR /app/
# Install all of the Python dependencies. These are
# listed, one to a line, in the requirements.txt file,
# possibly with version constraints. Having this as
# a separate block allows Docker to not repeat it if
# only your application code changes.
COPY requirements.txt .
RUN python -m pip install -r requirements.txt
# Copy in the rest of the application.
COPY . .
# Specify what port your application uses, and the
# default command to use when launching the container.
EXPOSE 8000
CMD /usr/local/bin/gunicorn maps.wsgi:application -w 2 -b :8000