为什么我收到关于“没有这样的文件或目录”的Nginx错误?

时间:2016-05-20 15:21:39

标签: nginx docker pip

我正在尝试创建一个本地pip2pi repo,然后通过Nginx提供它。我已经成功创建了回购并拥有了我想在本地机器上运行的所有轮盘文件。它们的位置如下:

/home/user/code/misc/pip-packs/simple
  \
    ---index.html   
    --- amqp
    \
      -------- index.html
      -------- amqp-1.4.6-py2-none-any.whl
    --- django
    \
      -------- index.html
      -------- Django-1.9.3-py2.py3-none-any.whl
    ... ETC

现在提供我在docker上使用Nginx的文件,只需使用官方的Nginx docker镜像。我像这样运行容器:

docker run --name pypi-nginx -p 80:80 \
-v /home/user/code/misc/pip-packs/simple:/usr/share/nginx/html \
-d nginx

我可以打开localhost并在root(/)处查看index.html,然后点击链接,例如amqp然后获取amqp-1.4.6-py2-none-any.whl文件的链接。当我点击链接时,我希望下载能够启动。如果我从Nginx获得404页面。

该文件肯定存在,因为我可以运行:

docker exec -it pypi-nginx /bin/bash

然后ls和/ usr / share / nginx / html目录并查看voulume中的所有文件。

此外,我可以在我的本地运行pip install amqp-1.4.6-py2-none-any.whl,所以我知道它是一个实际的轮文件。

Nginx的官方日志错误是:

2016/05/20 14:48:01 [error] 7#7: *1 open() "/usr/share/nginx/html/funcsigs/funcsigs-0.4-py2.py3-none-any.whl" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /funcsigs/funcsigs-0.4-py2.py3-none-any.whl HTTP/1.1", host: "localhost", referrer: "http://localhost/funcsigs/"

但它在每个firectory中提供索引文件。我使用的nginx conf文件是容器中的标准文件。我可以在必要时发布。

1 个答案:

答案 0 :(得分:0)

在目录/ home / user / code / misc / pip-packs /中,pip2pi存储它下载的包。所以在/ home / user / code / misc / pip-packs /你有

/home/user/code/misc/pip-packs/
\
  --- amqp-1.4.6-py2-none-any.whl
  --- Django-1.9.3-py2.py3-none-any.whl
  --- ETC

然后就像在上面问题中所描述的简单目录中一样,每个repo文件夹都应该有一个wheel文件,但是有一个404.好吧我盯着dir2pi pip-packs/命令,它只创建了符号链接和没有复制轮文件。因此,当我将卷装入容器时,所有符号链接所指向的实际轮文件永远不会被复制到容器中。

Django文件夹(packages / simple / django)的'ls -al'输出为:

drwxr-xr-x  2 bdew70 bdew70 4096 May 20 11:02 .
drwxr-xr-x 64 bdew70 bdew70 4096 May 20 11:02 ..
lrwxrwxrwx  1 bdew70 bdew70   39 May 20 11:02 Django-1.9.3-py2.py3-none-any.whl -> ../../Django-1.9.3-py2.py3-none-any.whl
-rwxr-xr-x  1 bdew70 bdew70   88 May 20 11:02 index.html

解决方案是将Dockerfile和ADD轮文件连同html文件一起创建到/ user / share / nginx /文件夹到/ usr / share / nginx / html /文件夹。 Dockerfile应如下所示:

FROM nginx
ADD packages/simple /usr/share/nginx/html/
ADD packages /usr/share/nginx

故事的寓意是在调查文件问题时使用'-al'(或为ls创建别名)并注意Docker容器卷中的符号链接。特别是如果符号链接是相对的并且格式为../../some-file