Docker Build can't find pip

Trying to follow a few[1][2] simple Docker tutorials via AWS am and getting the following error:

> 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:

  • How to get forever to print child process output to stdout.
  • boot2docker starting in Windows 7
  • docker run makes i/o timeout error during installing tensorflow on windows10
  • Why do I get Error: Could not find or load main class .jar when I run docker image
  • pg_dump server and pg_dump version mismatch in docker
  • Can Dockerfiles chain from other Dockerfiles?
  • # For Python 3.4
    FROM amazon/aws-eb-python:3.4.2-onbuild-3.5.1
    

    Which pip returns the following:

    > which pip                                                             
    ./bin/pip
    

    Relevant file structure:

    .
    ├── Dockerfile
    ├── bin
    │   ├── activate
    │   ├── pip
    │   ├── pip3
    │   ├── pip3.5
    │   ├── python -> python3
    │   ├── python-config
    │   ├── python3
    │   ├── python3.5 -> python3
    │   .
    .
    

    Again, noob in all things Docker so I’m not sure what troubleshooting steps to take. Please let me know what other helpful information I can provide.

  • Docker python client API copy
  • Making a docker container a part of a vpn
  • ENV variable isn't added correctly to the container environment
  • trying to create a docker L2Bridge network in windows throwing a The system cannot find the file specified error
  • Error response from daemon: oci runtime error: exec: “./run.sh”: stat ./run.sh: no such file or directory
  • Jenkins Docker container not copying pre-installed plugins to JENKINS_HOME on start
  • 3 Solutions collect form web for “Docker Build can't find pip”

    Something is very odd here. Why do you have the virtualenv content next to your Dockerfile?
    The image you are building from creates the virtualenv on /var/app (within the container, yes?) for you.
    I believe that the ONBUILD command copies it (or parts of it) over and corrupt the rest of the process, making the /var/app/bin/pip inoperable.

    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
    

    You should not care about externally having /var/app available on the host. You just need (based on the Dockerbuild file) have the “requirements.txt” available on the host, to be copied into the container (or not, if not, it will skip).

    /var/app/bin/pip is supopsed to work because the amazon/aws-eb-python:3.4.2-onbuild-3.5.1 Dockerfile includes:

    RUN        pip3 install virtualenv
    RUN        virtualenv /var/app
    RUN        /var/app/bin/pip install --download-cache /src uwsgi
    

    It means when you are using this image as a base image, its two ONBUILD instructions would apply to your current build.

    ONBUILD    ADD . /var/app
    ONBUILD RUN if [ -f /var/app/requirements.txt ]; then /var/app/bin/pip install -r /var/app/requirements.txt; fi
    

    Try with a simpler Dockerfile, and open a shell session from it, in order to check if /var/app is there, and if pip is correctly installed.
    You could also test rebuilding directly the 3.4.2-aws-eb-onbuild image itself, again for testing.

    I think the issue is how you have organized your bin/pip files

    From Docker Documentation: 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>.
    

    So your file structure should be :

    .
    ├── Dockerfile
    ├── app
    |   |__bin
    |   |  |
    │      ├── activate
    │      ├── pip
    │      ├── pip3
    │      ├── pip3.5
    │      ├── python -> python3
    │      ├── python-config
    │      ├── python3
    │      ├── python3.5 -> python3
    │      .
    .
    
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.