将文件作为参数传递给 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"]

然后我用以下方法构建 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 的新成员)

76567 次浏览

那样行不通的,就像你说的 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

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

您有两种选择,要么使用 码头卷,它允许您的朋友(和其他感兴趣的团体)在您的 Docker 容器中挂载本地卷。也就是说,您可以将本地文件系统上的一个文件夹覆盖到容器内的一个文件夹上(当您在本地进行开发时,这种做法通常非常好)

或者,根据容器的用途,有人可以扩展您的映像

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

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

您还可以让脚本从 STDIN读取,然后使用 cat将数据传递给 docker。看看 如何使码头容器读取标准输入?

诀窍是保持 STDIN打开,即使没有连接 用于 Docker 的 --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是输入的结尾。

一种选择是使用卷。

这样,项目中的所有合作者都能够将它们安装在容器中。

您可以将 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