Docker Build无法找到pip。

9

我试图通过AWS am遵循一些简单的Docker教程[1][2],但是出现了以下错误:

> 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
│   .
.

我对 Docker 的所有内容都很陌生,因此不确定应该采取哪些故障排除步骤。请告诉我需要提供哪些其他有用的信息。


你是从哪里运行 which pip 命令的?你的 Dockerfile 目录下是否存在 bin/pip 文件? - jwodder
你能发一下完整的 Dockerfile 吗? - Woot4Moo
抱歉,我在阅读时漏掉了那个。 - Woot4Moo
我不明白,你是在哪里运行 which pip 命令?是在构建 Docker 镜像的操作系统中,还是在 Docker 容器内部? - fghj
你正在Docker镜像中运行pip命令,我认为pip的路径应该是/bin/pip。 - neohope
显示剩余4条评论
3个回答

5

这里有些奇怪。为什么你要在Dockerfile旁边拥有virtualenv内容? 您正在构建的镜像会在/var/app(容器中)为您创建virtualenv。 我认为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文件,你只需在主机上拥有“requirements.txt”,然后将其复制到容器中(如果不需要,则跳过)。

虚拟环境的内容在这里,因为我正在转换一个现有项目。无论如何,我删除了所有其他docker内容和虚拟环境,并使用docker实现重新开始。我遇到了不同的问题,但我已经解决了上述问题。感谢您的帮助。 - Donato Perconti

1

/var/app/bin/pip 应该是有效的,因为 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,并从中打开一个shell会话,以检查/var/app是否存在,以及pip是否正确安装。 您还可以直接测试重建3.4.2-aws-eb-onbuild镜像,以进行测试。

1
我认为问题在于您如何组织您的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
│      .
.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接