一个非常简单的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的新手)
答案 0 :(得分:17)
这不会那样。就像你说的那样,file1.txt不在容器中。
解决方法是在运行文件时使用Docker卷将文件从主机注入容器。
这样的事情:
docker run -v /path/to/file1:/path/to/file.txt -t boot:latest python boot.py file1.txt
/ path / to / file1将是主机上的路径,它将覆盖容器上的/path/to/file.txt。
所以你的朋友可以在他们的主机上使用他们自己的文件在/ path / to / file1上播放。
答案 1 :(得分:6)
您还可以从STDIN
读取脚本,然后使用cat
将数据传递给docker。看看how to get docker container to read from stdin?
类似的东西:
cat /path/to/file | docker run -i --rm boot python boot.py
答案 2 :(得分:1)
如果我正确理解了这个问题,那么您承认该文件不在容器中,并且您正在询问如何最好地与世界分享容器,允许人们将自己的内容添加到其中。
您有两个选项,使用docker volumes,允许您的朋友(和其他感兴趣的人)在您的docker容器中装入本地卷。也就是说,您可以将本地文件系统上的文件夹覆盖到容器内的文件夹上(当您在本地开发时,这通常很漂亮)
或者,再次,根据容器的用途,有人可以扩展您的图像。例如,像
这样的DockerfileFROM yourdockerimage:latest
COPY file1.txt ./
CMD ["python", "boot.py", "file1.txt"]
选择最适合您项目的选项。
答案 3 :(得分:0)
我认为,并非总是有可能假设另一方会像JustDanyul的评论所指出的那样扩大形象。最好运送准备好的且独立的东西。
我建议两种方式:
-----仅使用docker -------
ENTRYPOINT
或CMD
原因:如果您使用CMD ["python", "boot.py"]
,那么您是在告诉docker在不传递参数的情况下运行boot.py
。
-----使用docker-compose -------
ENTRYPOINT
或CMD
保留在Dockerfile
docker-compose.yml
文件中创建启动服务docker-compose.yml
卷装文件docker-compose -f /path/to/docker-compose.yml run boot python boot.py file1.txt
从我的个人经验来看。
答案 4 :(得分:0)
一种选择是利用卷。
这样,项目中的所有协作者都可以将它们安装在容器中。
答案 5 :(得分:0)
您可以将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