"python setup.py install"不能从Dockerfile中运行,但我可以进入容器并执行相同的操作.

use*_*872 5 python setup.py docker

这样做时我得到了这个错误 sudo docker build .

> (3:58:02 PM) njain: tep 28 : RUN  python /tmp/setup.py install && 
> python /tmp/buzz/scripts/setuprabbit.py  ---> Running in e7afcbda3c75
> Traceback (most recent call last):   File "/tmp/setup.py", line 7, in
> <module>
>     long_description=open('README.md', 'r').read(), IOError: [Errno 2] No such file or directory: 'README.md' 2014/10/15 15:40:14 The command
> [/bin/sh -c python /tmp/setup.py install &&  python
> /tmp/buzz/scripts/setuprabbit.py] returned a non-zero code
Run Code Online (Sandbox Code Playgroud)

我的Dockerfile看起来像这样:

ADD buzz /tmp/
# DOCKER-VERSION 0.3.4
#bunch of installs
RUN cd /tmp/
RUN  python /tmp/setup.py install &&  python /tmp/buzz/scripts/setuprabbit.py
Run Code Online (Sandbox Code Playgroud)

当我进入容器(交互式shell和CD到/ tmp /)时,我能够做到python setup.py install没有任何问题.

Mac*_*Mac 13

Arthur的答案正确地确定了问题的原因,并提供了有效的解决方案.

但是,Docker的"编写Dockerfiles的最佳实践"建议不要使用他建议的模式(即RUN cd /some/path && do-some-command),而是建议使用该WORKDIR指令(旨在解决这个确切的用例).

WORKDIR基本上与您希望cd命令工作的方式完全一致:它更改工作目录,并保留新的工作目录以供Dockerfile中的后续指令使用.

在您的情况下,生成的Dockerfile将如下所示:

ADD buzz /tmp/
# DOCKER-VERSION 0.3.4
#bunch of installs
WORKDIR /tmp/
RUN  python /tmp/setup.py install &&  python /tmp/buzz/scripts/setuprabbit.py
Run Code Online (Sandbox Code Playgroud)


Art*_*ldt 11

docker文件中的每一步:

  • 创建一个容器
  • 以某种方式改变它
  • 提交结果(通常)以创建新图像
  • 删除容器.
  • 在下一步中使用新图像

所以你的docker文件说:

ADD buzz /tmp/            # change the container to have this new file
# DOCKER-VERSION 0.3.4
#bunch of installs
RUN cd /tmp/              # don't change the container at all and then save the results
RUN  python /tmp/setup.py install &&  python /tmp/buzz/scripts/setuprabbit.py  ## do the install
Run Code Online (Sandbox Code Playgroud)

所以cd第二行到最后一行的命令什么也不做,并且不影响它之后的行.这是一个令人遗憾的副作用,使得docker文件看起来太像shell脚本,而不是它们.而是cd命令放在需要使用它的同一行上,这样它的效果将继续沿着该行传递,而不是同一个Dockerfile中的其他RUN命令

RUN cd /tmp/ && python /tmp/setup.py install &&  python /tmp/buzz/scripts/setuprabbit.py
Run Code Online (Sandbox Code Playgroud)