Сборка 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
│      .
.