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

Posted

技术标签:

【中文标题】将文件作为参数传递给 Docker 容器【英文标题】:Passing file as argument to Docker container 【发布时间】:2017-04-26 19:56:42 【问题描述】:

一个非常简单的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 新手)

【问题讨论】:

您需要根据您传递的文件更改您的 Dockerfile...如果正在使用 file.txt 而不是使用 file1.txt ,请查看 Dockerfile 内部,那里有 file1.txt 吗? file1.txt 不在 Dockerfile 中,因为我不知道提前将哪些文件作为参数传递。 提交github.com/docker/cli/issues/3046 以简化将文件传递到“docker run” 【参考方案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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

一种选择是使用卷。

这样,项目中的所有合作者都可以将它们挂载到容器中。

【讨论】:

【参考方案4】:

您也可以从STDIN 读取您的脚本,然后使用cat 将数据传递给docker。看看how to get docker container to read from stdin?

类似:

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

【讨论】:

你不需要cat。做docker run -i --rm boot python boot.py &lt; /path/to/file. 在 Windows cmd 上,cat 通常不可用,您也可以按照@PawełBylica 的建议使用&lt;【参考方案5】:

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

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

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

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

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

【讨论】:

以上是关于将文件作为参数传递给 Docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

docker run 参数说明

将带有空格的路径作为参数传递给 bat 文件

nodemon :作为必需模块使用时将参数传递给可执行文件

将对象作为参数传递给函数

将命令行参数传递给 AWS Fargate 容器

如何通过 docker run 将参数传递给 Shell 脚本