【问题标题】:Run python commands in a docker container from python script on host从主机上的 python 脚本在 docker 容器中运行 python 命令
【发布时间】:2021-06-23 10:43:02
【问题描述】:

我有一个 docker 映像和相关的容器,而不是运行 jupyter-lab 服务器。在这个 docker 图像上,我有一个非常特定的 python 模块,它不能安装在主机上。在我的主机上,我拥有我不想在 docker 容器上运行的所有工作环境。

我想从主机上运行的 python 脚本中使用该模块。我的第一个想法是像这样在主机上使用docker-py (https://github.com/docker/docker-py):

import docker
client = docker.from_env()
container = client.container.run("myImage", detach=True)
container.exec_run("python -c 'import mymodule; # do stuff; print(something)'")

获取输出并继续在我的脚本中工作。

有没有更好的解决方案?例如,有没有办法在主机上的脚本中连接到 jupyter 服务器?

谢谢

【问题讨论】:

  • 我对 jupyter 不是很熟悉,但你不能只用 docker 做端口映射,而不是像在 127.0.0.1 上运行一样使用该服务器吗?
  • 也和这个讨论有关(4年前)stackoverflow.com/questions/39091186/…

标签: python docker


【解决方案1】:

首先。正如@dagnic states 在他的评论中所说的那样,有两个模块可以让你在你的python 脚本中执行 docker 运行时(可能还有更多,另一个不同的问题是“哪个最好”)。
第二。对木星一无所知,但既然你称它为“服务器”,这对我来说意味着你可以port mapping该服务器(记住 -p 8080:80 或 --publish 8080:80,是的,就是这样!) .为您的容器设置端口映射后,您将能够使用 pycurl 模块与该服务“对话”。

请记住,如果您与服务器“在端口上交谈”,您可能还想使用 docker-py 来执行此操作。

既然您问是否存在更好的解决方案:这两种方法会更受欢迎。第一个对您的脚本很方便,第二个将启动一个服务器,您可以按照您的要求使用主机脚本中的 pycurl(连接到 jupyter 服务器)。即,如果您启动 jupyter 服务器,例如:

docker run -p 9999:8888 -it -e JUPYTER_ENABLE_LAB=yes jupyter/base-notebook:latest

你可以像 pycurl 一样:

import pycurl
from io import BytesIO 

b_obj = BytesIO() 
crl = pycurl.Curl() 

# Set URL value
crl.setopt(crl.URL, 'https://localhost:8888')

# Write bytes that are utf-8 encoded
crl.setopt(crl.WRITEDATA, b_obj)

# Perform a file transfer 
crl.perform() 

# End curl session
crl.close()

# Get the content stored in the BytesIO object (in byte characters) 
get_body = b_obj.getvalue()

# Decode the bytes stored in get_body to HTML and print the result 
print('Output of GET request:\n%s' % get_body.decode('utf8')) 

更新:

所以你有两个问题:

1.有没有更好的解决方案? 基本上使用 docker-py 模块并在 docker 容器中运行 jupyter 服务器(我想还有一些其他不涉及 docker 的选项)

2.例如,有没有办法在主机上的脚本中连接到 jupyter 服务器?

这里有一个如何在 docker 中运行 jupyter 的例子。 enter link description here

剩下的就是使用代码中的 pycurl 与主机上的 jupyther 服务器通信。

【讨论】:

  • 谢谢。在您的 pycurl 示例中,如何使用位于 docker 容器中的 python 模块?
  • 您不必使用 python docker 模块 fi 您使用 pycurl,在这种情况下,您只是与 https 服务器( juypyter )“聊天”,该服务器在容器中启动,端口暴露在本地电脑
  • 我还是不明白这对我有什么帮助。你能给我一个更详细的例子吗?
  • 你应该创建另一个问题或改进这个问题:你的 jupyter 服务器是哪个端口(如果你在运行这个 docker 容器时没有任何其他问题,这会让我们知道)并在你的代码中提供 pycurl为了检查那里的任何问题。检查我在回答中提供给你的最后一个链接
猜你喜欢
  • 2020-12-31
  • 2020-07-28
  • 2023-03-20
  • 1970-01-01
  • 2015-03-30
  • 2015-10-21
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多