将file(model weight)作为参数传递给Docker Image

8i9zcol2  于 2023-05-28  发布在  Docker
关注(0)|答案(3)|浏览(386)

我在将文件加载到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(模型重量)来做这件事。我希望它被默认传递(或任何其他工作方式,不需要挂载)。

mbskvtky

mbskvtky1#

我可能会更改您的Python代码,以便也接受来自环境变量的值。可能最简单的方法是使用os.getenv为参数设置default值; argparse模块本身并不执行此操作。

parser.add_argument('--image-path', type=str, default=os.getenv('IMAGE_PATH'))
parser.add_argument('--model-dir', type=str, default=os.getenv('MODEL_DIR'))

一旦你完成了这一步,你就可以在Dockerfile中将默认值设置为环境变量,而不用担心ENTRYPOINT/CMD的分裂。

ENV MODEL_DIR=./model.pth.tar
ENTRYPOINT ["python3", "./model.py"]
docker run -v /tmp:/data my_model --image-path=/data/happy.jpg
docker run -v /tmp:/data -e IMAGE_PATH=/data/happy.jpg my_model

在您的原始代码中,--image-path似乎是作为普通文件读取的;我在这里使用了一个绝对路径,以明确它的来源。

dwthyt8l

dwthyt8l2#

一般来说,如果不通过挂载显式地访问主机文件系统,容器就不能访问主机文件系统。这是出于安全原因。
我能想到的唯一一种让容器访问文件而不挂载文件的方法是将文件通过管道传输到容器中,然后从容器内的stdin读取文件。执行此操作时,需要在docker run上使用-i选项。
例如,您可以将主机上/etc/os-release的内容传递给容器中的cat,如下所示

cat /etc/os-release | docker run --rm -i debian cat

然后,容器将打印出主机的/etc/os-relase的内容。
当然,这种方式只允许您读取文件的内容。你不能更新它。但如果我没阅读错的话,你不需要更新模型数据。

e4eetjau

e4eetjau3#

您的Dockerfile在--model_dir部分有一个错字。尝试以下ENTRYPOINT ["python3", "./model.py", "--model-dir"]

相关问题