我在将文件加载到Docker镜像时遇到问题。我想传递文件路径作为参数,然后能够从图像内部访问(读取)它。
文件 model.py
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--image-path', type=str)
parser.add_argument('--model-dir', type=str)
args, _ = parser.parse_known_args()
sample_image = args.image_path
print("Sample:", sample_image)
print("Model:", args.model_dir)
print("Done.")
文件 Dockerfile
FROM python:3.10
WORKDIR /usr/src/app
RUN apt update && apt install -y python3-pip
COPY model.py model.pth.tar ./
ENTRYPOINT ["python3", "./model.py", "--model_dir"]
CMD ["./model.pth.tar"]
从我的理解来看,这些ENTRYPOINT和CMD的组合应该已经起作用了。但我没有任何运气。
我设法通过挂载来传递所需的图像(图片):docker build -t my_model --progress=plain .
docker run -v /tmp:/tmp/myfilesdocker my_model --image-path=happy.jpg
然而,我不想用我的model.pth.tar
(模型重量)来做这件事。我希望它被默认传递(或任何其他工作方式,不需要挂载)。
3条答案
按热度按时间mbskvtky1#
我可能会更改您的Python代码,以便也接受来自环境变量的值。可能最简单的方法是使用
os.getenv
为参数设置default
值;argparse
模块本身并不执行此操作。一旦你完成了这一步,你就可以在Dockerfile中将默认值设置为环境变量,而不用担心
ENTRYPOINT
/CMD
的分裂。在您的原始代码中,
--image-path
似乎是作为普通文件读取的;我在这里使用了一个绝对路径,以明确它的来源。dwthyt8l2#
一般来说,如果不通过挂载显式地访问主机文件系统,容器就不能访问主机文件系统。这是出于安全原因。
我能想到的唯一一种让容器访问文件而不挂载文件的方法是将文件通过管道传输到容器中,然后从容器内的stdin读取文件。执行此操作时,需要在
docker run
上使用-i
选项。例如,您可以将主机上
/etc/os-release
的内容传递给容器中的cat
,如下所示然后,容器将打印出主机的
/etc/os-relase
的内容。当然,这种方式只允许您读取文件的内容。你不能更新它。但如果我没阅读错的话,你不需要更新模型数据。
e4eetjau3#
您的Dockerfile在
--model_dir
部分有一个错字。尝试以下ENTRYPOINT ["python3", "./model.py", "--model-dir"]