提问人:mpp 提问时间:12/12/2016 最后编辑:Peter Mortensenmpp 更新时间:12/29/2022 访问量:90836
将文件作为参数传递给 Docker 容器
Passing a file as an argument to a Docker container
问:
一个非常简单的 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,以便任何使用我的容器的人都可以将非常不同的文件作为参数传递而不会出错?
答:
它不会那样工作。就像你说的,不在容器里。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
评论
./myfile.txt1
如果我正确地理解了这个问题,那么您就承认文件不在容器中,并且您正在询问如何最好地与世界共享您的容器,允许人们将自己的内容添加到其中。
您有几个选项,要么使用 Docker 卷,它允许您的朋友(和其他相关方)在 Docker 容器中挂载本地卷。也就是说,您可以将本地文件系统上的文件夹覆盖到容器内的文件夹上(当您在本地开发时,这通常非常漂亮)。
或者,同样,根据容器的用途,有人可以扩展您的图像。例如,像 Dockerfile
FROM yourdockerimage:latest
COPY file1.txt ./
CMD ["python", "boot.py", "file1.txt"]
选择最适合您项目的选项。
您也可以使用.看看如何让 docker 容器从 stdin 读取?STDIN
cat
诀窍是即使没有附加 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
是输入的末尾。
评论
cat
docker run -i --rm boot python boot.py < /path/to/file
cmd
cat
<
您可以将 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
评论