Запуск "/ usr / local / bin / gunicorn" в сборке docker говорит "stat / usr / local / bin / gunicorn: такого файла или каталога нет" - PullRequest
0 голосов
/ 12 февраля 2020

Из каталога карт верхнего уровня я могу установить расширение gunicorn ...

(venv) localhost:maps davea$ pip3 install gunicorn
Collecting gunicorn
  Downloading gunicorn-20.0.4-py2.py3-none-any.whl (77 kB)
     |████████████████████████████████| 77 kB 1.2 MB/s 
Requirement already satisfied: setuptools>=3.0 in ./web/venv/lib/python3.7/site-packages (from gunicorn) (45.1.0)
Installing collected packages: gunicorn
Successfully installed gunicorn-20.0.4

Ниже находится мой docker -compose.yml файл

version: '3'

services:
  web:
    restart: always
    build: ./web
    ports:           # to access the container from outside
      - "8000:8000"
    environment:
      DEBUG: 'true'
    command: /usr/local/bin/gunicorn maps.wsgi:application -w 2 -b :8000

  apache:
    restart: always
    build: ./apache/
    ports:
      - "80:80"
    #volumes:
    #  - web-static:/www/static
    links:
      - web:web

  mysql:
    restart: always
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: 'maps_data'
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'chicommons'
      # You can use whatever password you like
      MYSQL_PASSWORD: 'password'
      # Password for root access
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - "3406:3406"
    volumes:
      - my-db:/var/lib/mysql

volumes:
  my-db:

И затем у меня есть web / Dockerfile следующим образом ...

FROM python:3.7-slim

RUN apt-get update && apt-get install

RUN apt-get install -y libmariadb-dev-compat libmariadb-dev
RUN apt-get update \
    && apt-get install -y --no-install-recommends gcc \
    && rm -rf /var/lib/apt/lists/*

RUN python -m pip install --upgrade pip
RUN mkdir -p /app/

WORKDIR /app/

RUN pip3 freeze > requirements.txt
COPY requirements.txt requirements.txt
RUN python -m pip install -r requirements.txt

COPY . /app/

Однако, когда я собираю / запускаю свой экземпляр docker, мне говорят, что он не может найти мою команду "gunicorn" .. .

(venv) localhost:maps davea$ docker-compose up
Starting maps_web_1 ... 
Starting maps_web_1 ... error

ERROR: for maps_web_1  Cannot start service web: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"/usr/local/bin/gunicorn\": stat /usr/local/bin/gunicorn: no such file or directory": unknown

ERROR: for web  Cannot start service web: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"/usr/local/bin/gunicorn\": stat /usr/local/bin/gunicorn: no such file or directory": unknown
ERROR: Encountered errors while bringing up the project.

1 Ответ

1 голос
/ 12 февраля 2020

Ваш контейнер 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...