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:
( 来源于上述变化)
使用CMD
和ENTRYPOINT
它也似乎是你的脚本显然没有收到myapplication/inputfile.txt
作为参数。 这可能是CMD
一个怪癖。
我并不十分清楚这两个操作之间的区别,但是我总是在我的Docker ENTRYPOINT
中使用ENTRYPOINT,这让我不感到悲伤。 看到这个答案,并尝试更换:
CMD ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"]
附:
ENTRYPOINT ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"]
(感谢玛雅G)