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

Passing a file as an argument to a Docker container

提问人:mpp 提问时间:12/12/2016 最后编辑:Peter Mortensenmpp 更新时间:12/29/2022 访问量:90836

问:

一个非常简单的 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"]

然后,我使用以下命令构建 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,以便任何使用我的容器的人都可以将非常不同的文件作为参数传递而不会出错?

python docker (英语

评论

0赞 OscarAkaElvis 12/12/2016
您需要根据您传递的文件更改您的 Dockerfile...如果使用文件.txt而不是使用文件1.txt,请查看Dockerfile内部,那里有file1.txt吗?
0赞 mpp 12/12/2016
file1.txt 不在 Dockerfile 中,因为我不知道哪些文件将提前作为参数传递。
0赞 rouble 4/10/2021
提交 github.com/docker/cli/issues/3046 以简化将文件传递到“docker run”的过程

答:

110赞 Hakro 12/12/2016 #1

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

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

像这样的东西:

docker run -v /local/path/to/file1.txt:/container/path/to/file1.txt -t boot:latest python boot.py /container/path/to/file1.txt

然后是主机上的路径,它将覆盖容器。/local/path/to/file1.txt/container/path/to/file1.txt

评论

3赞 alanc10n 6/3/2022
确保本地路径是绝对路径;不能指定相对路径,例如 。./myfile.txt1
6赞 JustDanyul 12/12/2016 #2

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

您有几个选项,要么使用 Docker 卷,它允许您的朋友(和其他相关方)在 Docker 容器中挂载本地卷。也就是说,您可以将本地文件系统上的文件夹覆盖到容器内的文件夹上(当您在本地开发时,这通常非常漂亮)。

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

FROM yourdockerimage:latest
COPY file1.txt ./
CMD ["python", "boot.py", "file1.txt"]

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

21赞 Nick Roz 8/9/2018 #3

您也可以使用.看看如何让 docker 容器从 stdin 读取?STDINcat

诀窍是即使没有附加 Docker 的 or (alias) 选项,也要保持打开状态。STDIN--interactive-i

像这样:

cat /path/to/file | docker run -i --rm boot python boot.py

艺术

docker run -i --rm boot python booty.py < /path/to/file

EOF是输入的末尾。

评论

12赞 Paweł Bylica 8/8/2020
你不需要那个。做。catdocker run -i --rm boot python boot.py < /path/to/file
0赞 Christopher K. 12/8/2021
在 Windows 上,通常不可用,您也可以按照 @Pawe łBylica 的建议使用。cmdcat<
0赞 gdzcorp 2/7/2020 #4

您可以将 Dockerfile 更改为:

FROM python
COPY boot.py ./
COPY file.txt ./
RUN pip install numpy
ENTRYPOINT ["python", "boot.py"]

然后运行它以读取:STDIN

docker run -i boot:latest -<file1.txt