在另一个Docker容器中运行命令行命令并共享文件

在主机命令行上运行docker,我可以在下载一组文件的容器中运行命令,并通过共享卷将这些文件共享回主机:

docker run --rm --volume "${PWD}":/contentmine --tty --interactive psychemedia/contentmine getpapers -q aardvark -o /contentmine/aardvark -x

我想要做的是能够使用以下格式的docker-compose.yaml文件创build的Jupyter容器中运行相同的命令:

 notebook: image: jupyter/notebook ports: - "8899:8888" volumes: - ./notebooks:/notebooks - /var/run/docker.sock:/var/run/docker.sock privileged: true 

在一个Jupyter笔记本代码单元中,我尝试了运行:

 #Make sure docker is available in the Jupyter container !apt-get update !apt-get install -y docker.io !mkdir -p downloads #Run a download command in another container and share the downloaded files back ! docker run --rm --volume "${PWD}/downloads":/contentmine --tty --interactive psychemedia/contentmine getpapers -q aardvark -o /contentmine/aardvark -x 

我可以看到文件被下载到某处,但我不知道在哪里? 它们是否被下载到Jupyter容器的docker VM上下文中? 我怎样才能从我的笔记本电脑容器中的一个目录,我用来运行文件下载命令行容器的临时容器?

作为问题的第二部分,我还希望能够将downloads目录中的文件用作另一个容器中运行的另一个命令行命令的input,并且将结果副本保存在笔记本容器downloads目录中:

docker run --rm --volume "${PWD}/downloads":/contentmine --tty --interactive psychemedia/contentmine norma --project /contentmine/aardvark -i fulltext.xml -o scholarly.html --transform nlm2html

据推测,如果问题的第一部分有一个快速的解决办法,那么这个部分是否也适用相同的修正?

我认为你正在寻找的答案涉及创build一个命名的容器,并指定它作为downloads/的挂载点,然后将其挂载到创build的任何容器中,以便在以后的会话中使用它。

为了回答我自己的问题,我认为命名链接的数据卷容器是个错误。

这似乎工作 – 从notebookdockercli/docker-compose.yml

 notebook: image: jupyter/notebook ports: - "8899:8888" volumes_from: - contentmineshare volumes: - ./notebooks:/notebooks - /var/run/docker.sock:/var/run/docker.sock privileged: true contentmineshare: image: psychemedia/contentmine volumes: - /contentmine 

然后在笔记本代码单元格中,我可以运行:

 !apt-get update !apt-get install -y docker.io 

然后运行docker CLI命令:

 ! docker run --rm --volumes-from notebookdockercli_contentmineshare_1 --tty --interactive psychemedia/contentmine getpapers -q rhinocerous -o /contentmine/rhinocerous -x 

我可以看到这些文件:

 !ls /contentmine/rhinocerous/ 

我遇到的问题是使用错误的volumes-from名称..(我不知道如何自动拿起名称?)

为了创build一个Docker IPython魔术 ,使用docker-py创build一个数据卷容器供笔记本在使用命令行容器同步文件时使用它可能会更清晰。

上面的路由定义了一个在启动时由docker撰写的链接到笔记本容器的命名的数据卷容器。 没有这个要求更加灵活。

如果我们知道我们所在的笔记本容器的名称,并且我们知道共享目录的安装点,那么当调用命令行容器时,我们可以find可作为卷装入的目录的path

 import docker def getPath(container,mountdir): cli = Client(base_url='unix://var/run/docker.sock') if cli.containers(filters={'name':container}): return [x['Source'] for x in cli.inspect_container(container ['Mounts'] if 'Destination' in x and x['Destination']==mountdir ] return [] pp=getPath('/notebookdockercli_notebook_1','/notebooks') DD='{}{}'.format(pp[0],'/testN') ! docker run -v {DD}:/contentmineTest --tty --interactive psychemedia/contentmine getpapers -q rhinocerous -o /contentmineTest/rhinocerous -x 

这会将笔记本容器中的指定目录安装在命令行容器的输出文件夹中。

由于某种原因,我不能得到docker-py为这条路线工作? 我希望能够做到这一点:

 cli = docker.Client(base_url='unix://var/run/docker.sock') container_id = cli.create_container(image='psychemedia/contentmine', volumes='{}{}:{}'.format(pp[0],'/test6','/contentmineTest'), command='getpapers -q rhinocerous -o /contentmineTest/rhinocerous -x') cli.start(container_id) 

但它似乎并没有安装在笔记本电脑的容器?

然后,我觉得这是一个更快的方法,尽pipe可能会将所有笔记本容器内容暴露给命令行容器:将适当的卷从笔记本容器链接到命令行容器中:

 ! docker run --rm --volumes-from notebookdockercli_notebook_1 psychemedia/contentmine getpapers -q rhinocerous -o /notebooks/maybe/rhinocerous -x 

在docker-py中:

 cli = docker.Client(base_url='unix://var/run/docker.sock') container_id = cli.create_container('psychemedia/contentmine', host_config=cli.create_host_config( volumes_from='notebookdockercli_notebook_1'), command='getpapers -q rhinocerous -o /notebooks/testX/rhinocerous -x') cli.start(container_id) 

我不知道如何一次运行删除容器,因为它可能需要任意时间运行,所以我们如何知道何时删除它? start()似乎不接受docker运行–rm开关? 我想我们可以用特定的方式来命名容器,最后做家务,把它们全部删除?