我已经成功构建了一个Docker容器并将我的应用程序文件复制到Dockerfile中的容器中.但是,我正在尝试执行一个引用输入文件的
Python脚本(在Docker构建期间复制到容器中).我似乎无法弄清楚为什么我的脚本告诉我它无法找到输入文件.我包括我用于构建下面容器的Dockerfile,以及正在查找它找不到的输入文件的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
上面命令的错误:
ERROR: Default inputfile.txt not found. No alternate input file was provided
AWS的内容来自关于如何将主机的AWS凭证传递到Docker容器以用于与AWS服务交互的教程.我使用了这里的元素:https://github.com/jdrago999/aws-cli-on-CoreOS
最佳答案 到目前为止,我已经确定了两个问题. Maya G在下面的评论中指出了第三名.
条件逻辑不正确
你需要替换:
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脚本时,它将尝试解析相对于此的路径.
这意味着:
with open('inputfile.txt') as f:
将解析为/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:
(上述变化为Source)
使用CMD与ENTRYPOINT
看起来你的脚本似乎没有接收myapplication / inputfile.txt作为参数.这可能是CMD的怪癖.
我不是100%清楚这两个操作之间的区别,但我总是在我的Dockerfiles中使用ENTRYPOINT而且它没有让我感到悲伤.见this answer并尝试更换:
CMD ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"]
附:
ENTRYPOINT ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"]
(感谢Maya G)