Docker:如何获取virtualenv并安装requirements.txt?

4

我不确定我错过了什么。 canonicaliser_api 包含了我的代码和一个 requirements.txt

FROM ubuntu:14.04.2
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN apt-get -y update && apt-get upgrade -y
RUN apt-get install python build-essential python-dev python-pip python-setuptools -y
RUN apt-get install libxml2-dev libxslt1-dev python-dev -y
RUN apt-get install libpq-dev postgresql-common postgresql-client -y
RUN apt-get install openssl openssl-blacklist openssl-blacklist-extra -y
RUN apt-get install nginx -y
RUN pip install virtualenv uwsgi

ADD canonicaliser_api /home/ubuntu
RUN virtualenv /home/ubuntu/canonicaliser_api/venv
RUN source /home/ubuntu/canonicaliser_api/venv/bin/activate && pip install -r /home/ubuntu/canonicaliser_api/requirements.txt

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80

CMD service nginx start

当我尝试构建它时,一切都很好,直到第11步:
Step 11 : RUN source /home/ubuntu/canonicaliser_api/venv/bin/activate && pip install -r /home/ubuntu/canonicaliser_api/requirements.txt
 ---> Running in 7aae5bd92b70
/home/ubuntu/canonicaliser_api/venv/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
Could not open requirements file: [Errno 2] No such file or directory: '/home/ubuntu/canonicaliser_api/requirements.txt'
The command '/bin/sh -c source /home/ubuntu/canonicaliser_api/venv/bin/activate && pip install -r /home/ubuntu/canonicaliser_api/requirements.txt' returned a non-zero code: 1

但我感到有些不合理,我已经通过ADD将整个代码目录添加到Dockerfile中。这里我错过了什么?
bash-3.2$ ls canonicaliser_api/requirements.txt 
canonicaliser_api/requirements.txt
bash-3.2$ 
2个回答

2
使用方法是:ADD [源目录或URL] [目标目录]
你需要将文件夹名称添加到目标路径中:
ADD canonicaliser_api /home/ubuntu/canonicaliser_api

0
在复制目录时,特别是当目标目录不存在时,你必须要小心。简而言之,这样是行不通的:
ADD canonicaliser_api /home/ubuntu

但这应该:

ADD canonicaliser_api /home/ubuntu/canonicaliser_api

通常情况下,最好避免使用ADD指令,而改用COPY。在这种情况下,它只是一个直接替换。
将来,调试此类问题的一种方法是获取最后成功构建的镜像(在本例中,是从ADD行获取的镜像),并从该镜像启动容器。然后,您可以尝试运行有问题的指令并找出问题所在。

谢谢您的回复。恐怕这不是解决方案。我仍然遇到同样的问题。让我尝试COPY。COPY也存在相同的问题。:( - Houman
啊,明白了。这更令人困惑,因为/home/ubuntu不存在。 - Adrian Mouat
哈,刚注意到有人在编辑之间回答了(记录一下,我最初建议添加一个“/”,但没有任何区别)。我会保留更新后的答案,因为我认为其他观点仍然有效。 - Adrian Mouat

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