在dockerized python3 ftp命令中,RETR抛出ConnectionResetError

时间:2016-11-17 01:19:37

标签: python-3.x docker ftp ftplib

我尝试从python3 docker容器内部通过ftp下载文件。容器是从官方docker hub python存储库构建的。

这是我尝试执行的python代码的最小示例:

import ftplib

ftp = ftplib.FTP("ftp.geneontology.org")
ftp.login()
ftp.sendcmd("MDTM /go/ontology/go-basic.obo")
ftp.retrbinary("RETR /go/ontology/go-basic.obo", callback=open("go-basic.obo", "wb").write)

此代码的MDTM和RETR命令在主机中运行良好。

但是,在python3 docker容器中只有MDTM命令有效。 RETR命令将引发以下错误消息:

>>> ftp.retrbinary("RETR /go/ontology/go-basic.obo", callback=open("ich.obo", "wb").write)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/ftplib.py", line 443, in retrbinary
  data = conn.recv(blocksize)
ConnectionResetError: [Errno 104] Connection reset by peer
>>>

我的Dockerfile如下所示:

FROM python:3
CMD ["/bin/bash"]

我构建,使用以下序列输入容器和python shell:

docker build --tag bue/py3ftp .
docker images
docker run -ti --name=abc bue/py3ftp /bin/bash
python

我的框配置了以下软件:

  • OSX 10.11.6 ElCapitan
  • docker-machine使用的VirtualBox版本5.1.8 r111374(Qt5.5.1)
  • docker-machine version 0.8.2,build e18a919
  • docker version 1.12.3,build 6b644ec
  • python 3.5.2(默认,2016年11月10日,08:25:20)在docker容器

有谁知道这个错误在哪里? 为什么这不起作用? 也许我必须打开一个端口或什么?

感谢任何输入! 最好, 艾玛

1 个答案:

答案 0 :(得分:1)

终于发现了这个bug。 而不是:

docker run -ti --name=abc bue/py3ftp /bin/bash

使用:

docker run -ti -P --name=abc bue/py3ftp /bin/bash

或:

docker run -ti -p 21:21 --name=abc bue/py3ftp /bin/bash

艾玛