Сборка Docker не может найти pip
пытаясь следовать за несколькими[1][2] простые учебники Docker через AWS am и получение следующей ошибки:
> docker build -t my-app-image .
Sending build context to Docker daemon 94.49 MB
Step 1 : FROM amazon/aws-eb-python:3.4.2-onbuild-3.5.1
# Executing 2 build triggers...
Step 1 : ADD . /var/app
---> Using cache
Step 1 : RUN if [ -f /var/app/requirements.txt ]; then /var/app/bin/pip install -r /var/app/requirements.txt; fi
---> Running in d48860787e63
/bin/sh: 1: /var/app/bin/pip: not found
The command '/bin/sh -c if [ -f /var/app/requirements.txt ]; then /var/app/bin/pip install -r /var/app/requirements.txt; fi' returned a non-zero code: 127
Dockerfile:
# For Python 3.4
FROM amazon/aws-eb-python:3.4.2-onbuild-3.5.1
который pip возвращает следующее:
> which pip
./bin/pip
соответствующая файловая структура:
.
├── Dockerfile
├── bin
│ ├── activate
│ ├── pip
│ ├── pip3
│ ├── pip3.5
│ ├── python -> python3
│ ├── python-config
│ ├── python3
│ ├── python3.5 -> python3
│ .
.
опять же, noob во всех вещах Docker, поэтому я не уверен, какие шаги по устранению неполадок предпринять. Пожалуйста, дайте мне знать, какую другую полезную информацию я могу предоставить.
3 ответов
что-то здесь очень странно. Почему у вас есть содержимое virtualenv рядом с вашим Dockerfile? изображение, которое вы строите из создает virtualenv on / var / app (в контейнере, да? для тебя. Я считаю, что команда ONBUILD копирует ее (или ее части) и повреждает остальную часть процесса, делая /var/app/bin/pip неработоспособным.
FROM python:3.4.2 <-- this is the base image, on top of which the following command will be applied
WORKDIR /var/app <-- this is the working dir (a la 'cd /var/app')
RUN pip3 install virtualenv <-- using pip3 (installed using base image I presume) to install the virtualenv package
RUN virtualenv /var/app <-- creating a virtual env on /var/app
RUN /var/app/bin/pip install --download-cache /src uwsgi <-- using the recently install virtualenv pip to install uwsgi
...
ONBUILD ADD . /var/app <-- add the contents of the directory where the Dockerfile is built from, I think this is where the corruption happen
ONBUILD RUN if [ -f /var/app/requirements.txt ]; then /var/app/bin/pip install -r /var/app/requirements.txt; fi <-- /var/app/bin/pip has beed corrupted
вы не должны заботиться о внешнем наличии /var / app на хосте. Вам просто нужно (на основе Dockerbuild file) имеют "требования.txt", доступный на хосте, который будет скопирован в контейнер (или нет, если нет, он пропустит).
/var / app / bin/pip supopsed для работы, потому что amazon / aws-eb-python:3.4.2-onbuild-3.5.1 Dockerfile включает в себя:
RUN pip3 install virtualenv
RUN virtualenv /var/app
RUN /var/app/bin/pip install --download-cache /src uwsgi
это означает, когда вы используете это изображение в качестве базового изображения, его два ONBUILD
- инструкции будет применяться к вашей текущей сборке.
ONBUILD ADD . /var/app
ONBUILD RUN if [ -f /var/app/requirements.txt ]; then /var/app/bin/pip install -r /var/app/requirements.txt; fi
попробуйте с более простым Dockerfile и откройте сеанс оболочки из него, чтобы проверить, есть ли /var/app и правильно ли установлен pip.
Вы может также протестировать перестройку непосредственно 3.4.2-aws-eb-onbuild само изображение, снова для тестирования.
Я думаю, что проблема в том, как вы организовали свои файлы bin/pip
Из Документации Docker:https://docs.docker.com/engine/reference/builder/#add
If <dest> does not end with a trailing slash, it will be considered a regular file and the contents of <src> will be written at <dest>.
таким образом, ваша файловая структура должна быть:
.
├── Dockerfile
├── app
| |__bin
| | |
│ ├── activate
│ ├── pip
│ ├── pip3
│ ├── pip3.5
│ ├── python -> python3
│ ├── python-config
│ ├── python3
│ ├── python3.5 -> python3
│ .
.