将文件作为参数传递给Docker容器

mpp*_*mpp 23 python docker

一个非常简单的python程序,假设当前目录是/ PYTHON,我想将file.txt作为参数传递给python脚本boot.py,这是我的Dockerfile

FROM python
COPY boot.py ./
COPY file.txt ./
RUN pip install numpy
CMD ["python", "boot.py", "file.txt"]
Run Code Online (Sandbox Code Playgroud)

然后我用以下代码构建Docker容器:

docker build -t boot/latest .

然后运行容器

docker run -t boot:latest python boot.py file.txt

我得到了正确的结果.

但是如果我将另一个文件file1.txt复制到当前目录(从另一个目录(不是/ PYTHON)),那么我再次运行容器:

docker run -t boot:latest python boot.py file1.txt

我收到以下错误:

FileNotFoundError:[Errno 2]没有这样的文件或目录:'file1.txt'

所以错误是由于file1.txt不在容器中,但如果我与朋友分享这个容器,并且朋友想要传递一个非常不同的文件作为参数,我该如何编写Dockerfile以便任何人使用我的容器可以传递非常不同的文件作为参数没有错误?提前致谢.(我是Docker的新手)

Hak*_*kro 23

它不会那样工作.就像你说的那样,file1.txt不在容器中.

解决方法是在运行时使用Docker卷将文件从主机注入容器.

像这样的东西:

docker run -v /path/to/file1:/path/to/file.txt -t boot:latest python boot.py file1.txt
Run Code Online (Sandbox Code Playgroud)

/ path/to/file1将是主机上的路径,它将覆盖容器上的/path/to/file.txt.

因此,您的朋友可以使用自己的文件在主机上的/ path/to/file1上播放.

  • 确保本地路径是绝对路径;您不能指定像“./myfile.txt1”这样的相对路径。 (3认同)

Nic*_*Roz 6

您也可以使用读取脚本STDIN,然后将数据传递给docker cat。看看如何让docker容器从stdin读取?

就像是:

cat /path/to/file | docker run -i --rm boot python boot.py
Run Code Online (Sandbox Code Playgroud)

  • 你不需要“cat”。执行 `docker run -i --rm boot python boot.py < /path/to/file`。 (7认同)

Jus*_*yul 5

如果我正确理解了这个问题,那么您承认该文件不在容器中,并且您正在询问如何最好地与世界共享您的容器,允许人们将他们自己的内容添加到其中。

您有几个选择,要么使用docker volumes,它允许您的朋友(和其他感兴趣的各方)在您的 docker 容器中安装本地卷。也就是说,您可以将本地文件系统上的文件夹覆盖到容器内的文件夹上(当您在本地开发时,这通常也很漂亮)

或者,同样,根据容器的用途,有人可以扩展您的图像。例如,一个 Dockerfile 像

FROM yourdockerimage:latest
COPY file1.txt ./
CMD ["python", "boot.py", "file1.txt"]
Run Code Online (Sandbox Code Playgroud)

选择最适合您的项目的选项。