在一个Docker容器中从另一个容器运行命令行命令并共享文件
在主机命令行上运行docker,我可以在容器中运行命令,该容器下载一组文件,并通过共享卷将这些文件共享回主机:在一个Docker容器中从另一个容器运行命令行命令并共享文件,docker,docker-compose,jupyter-notebook,Docker,Docker Compose,Jupyter Notebook,在主机命令行上运行docker,我可以在容器中运行命令,该容器下载一组文件,并通过共享卷将这些文件共享回主机: docker run--rm--volume“${PWD}”:/contentmine--tty--interactive psychemedia/contentmine getpapers-q aardvark-o/contentmine/aardvark-x 我想做的是能够在使用docker-compose.yaml文件创建的Jupyter容器中运行相同的命令,格式如下: note
docker run--rm--volume“${PWD}”:/contentmine--tty--interactive psychemedia/contentmine getpapers-q aardvark-o/contentmine/aardvark-x
我想做的是能够在使用docker-compose.yaml文件创建的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上下文中?如何将笔记本容器中的目录装入用于运行文件下载命令行容器的临时容器中
作为问题的第2部分,我还希望能够使用下载
目录中的文件作为另一个容器中运行的另一个命令行命令的输入,并再次在笔记本容器下载
目录中保留结果的副本:
docker run--rm--volume“${PWD}/downloads”:/contentmine--tty--interactive psychemedia/contentmine norma--project/contentmine/aardvark-i fulltext.xml-o scholarly.html--transform nlm2html
大概,如果问题的第一部分有一个快速解决方案,同样的修复方法也适用于此部件?我认为您要寻找的答案包括创建一个命名容器,并将其指定为
下载/
的装载点,然后在以后的会话中使用它在创建时将其装载到任何容器中。我认为您要寻找的答案包括创建一个命名容器和将其指定为下载/
的装载点,然后在创建时将其装载到以后会话中使用它的任何容器中。回答我自己的问题,我认为命名链接数据卷容器是一个错误
这似乎是可行的-从notebookdockerli/dockercompose.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/
我遇到的问题是使用了来自name.的错误卷。。(我不知道如何自动提取名称?)
对于创建Docker IPython magic,使用Docker py
创建一个数据卷容器,供笔记本在与命令行容器同步文件时使用,可能会更干净
上面的路由定义了一个命名的数据卷容器,该容器在docker compose启动时链接到笔记本容器。没有这个要求更灵活
如果我们知道我们所在的笔记本容器的名称,并且知道共享目录的装入点,那么我们可以在调用命令行容器时找到可以作为卷装入的目录的路径
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为这条路线工作?我希望能够做到这一点:
但它似乎没有安装在笔记本电脑容器中
我突然想到,这是一种更快的方法,尽管有将所有笔记本容器内容暴露到命令行容器的风险:从笔记本容器将适当的卷链接到命令行容器:
! 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 run--rm开关?我想我们可以用一种特定的方式命名这些容器,并在最后进行内务管理并将它们全部移除?回答我自己的问题,我认为命名链接数据卷容器是一个错误
这似乎是可行的-从notebookdockerli/dockercompose.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/
我遇到的问题是使用了来自
name.的错误卷。。(我不知道如何自动提取名称?)
对于创建Docker IPython magic,使用Docker py
创建一个数据卷容器,供笔记本在与命令行容器同步文件时使用,可能会更干净
上面的路由定义了一个命名的数据卷容器,该容器在docker compose启动时链接到笔记本容器。没有这个要求更灵活
如果我们知道我们所在的笔记本容器的名称,并且知道共享目录的装入点,那么我们可以在调用命令行容器时找到可以作为卷装入的目录的路径
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为这条路线工作?我希望能够做到这一点:
但它似乎没有安装在笔记本电脑容器中
我突然想到,这是一种更快的方法,尽管有将所有笔记本容器内容暴露到命令行容器的风险:从笔记本容器将适当的卷链接到命令行容器:
! 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 run--rm开关?我想我们可以用一种特殊的方式来命名这些容器,然后在最后做家务并把它们全部搬走?我已经在这方面做了很多工作,但是找不到一种方法让它工作起来?我已经在这方面做了很多工作