Docker Python脚本找不到文件

我已经成功构build了一个Docker容器,并将我的应用程序的文件复制到Dockerfile的容器中。 不过,我正在尝试执行一个引用input文件(在Docker构build过程中被复制到容器中)的Python脚本。 我似乎无法弄清楚为什么我的脚本告诉我,它无法findinput文件。 我包括我用来构build下面的容器的Dockerfile以及正在查找无法find的input文件的Python脚本的相关部分。

Dockerfile:

FROM alpine:latest RUN mkdir myapplication COPY . /myapplication RUN apk add --update \ python \ py2-pip && \ adduser -D aws WORKDIR /home/aws RUN mkdir aws && \ pip install --upgrade pip && \ pip install awscli && \ pip install -q --upgrade pip && \ pip install -q --upgrade setuptools && \ pip install -q -r /myapplication/requirements.txt CMD ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"] 

Python脚本的相关部分:

 if len(sys.argv) >= 2: sys.exit('ERROR: Received 2 or more arguments. Expected 1: Input file name') elif len(sys.argv) == 2: try: with open(sys.argv[1]) as f: topics = f.readlines() except Exception: sys.exit('ERROR: Expected input file %s not found' % sys.argv[1]) else: try: with open('inputfile.txt') as f: topics = f.readlines() except: sys.exit('ERROR: Default inputfile.txt not found. No alternate input file was provided') 

主机上的Docker命令导致错误:

 sudo docker run -it -v $HOME/.aws:/home/aws/.aws discursive python \ /discursive/index_twitter_stream.py 

上述命令的错误:

错误:找不到默认的inputfile.txt。 没有提供备用input文件

AWS的东西是从教程中获得的,如何将您的主机的AWS凭证传递到Docker容器中,以用于与AWS服务交互。 我使用这里的元素: https : //github.com/jdrago999/aws-cli-on-CoreOS

到目前为止,我已经确定了两个问题。 Maya G在下面的评论中指出了三分之一。

不正确的条件逻辑

您需要replace:

 if len(sys.argv) >= 2: sys.exit('ERROR: Received 2 or more arguments. Expected 1: Input file name') 

附:

 if len(sys.argv) > 2: sys.exit('ERROR: Received more than two arguments. Expected 1: Input file name') 

请记住,脚本的第一个参数始终是它自己的名字。 这意味着你应该期待sys.argv 1或2个参数。

查找默认文件的问题

另一个问题是你的docker容器的工作目录是/home/aws ,所以当你执行你的Python脚本时,它会尝试parsing相关的path。

这意味着:

 with open('inputfile.txt') as f: 

将parsing为/home/aws/inputfile.txt ,而不是/home/aws/myapplication/inputfile.txt

您可以通过更改代码来解决此问题:

 with open('myapplication/inputfile.txt') as f: 

或(首选):

 with open(os.path.join(os.path.dirname(__file__), 'inputfile.txt')) as f: 

( 来源于上述变化)

使用CMDENTRYPOINT

它也似乎是你的脚本显然没有收到myapplication/inputfile.txt作为参数。 这可能是CMD一个怪癖。

我并不十分清楚这两个操作之间的区别,但是我总是在我的Docker ENTRYPOINT中使用ENTRYPOINT,这让我不感到悲伤。 看到这个答案,并尝试更换:

 CMD ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"] 

附:

 ENTRYPOINT ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"] 

(感谢玛雅G)