gpt4 book ai didi

python - Docker Python 脚本找不到文件

转载 作者:太空狗 更新时间:2023-10-30 01:32:24 24 4
gpt4 key购买 nike

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

docker 文件:

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 用于上述变化)

使用 CMDENTRYPOINT

看起来您的脚本显然没有接收myapplication/inputfile.txt 作为参数。这可能是 CMD 的一个怪癖。

我不是 100% 清楚这两个操作之间的区别,但我总是在我的 Dockerfile 中使用 ENTRYPOINT 并且它没有让我感到悲伤。参见 this answer并尝试替换:

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

与:

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

(感谢玛雅 G)

关于python - Docker Python 脚本找不到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41897022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com