我正在尝试使用docker-py连接到OSX上的docker-machine.
我不能简单地使用标准,Client(base_url='unix://var/run/docker.sock')因为docker在docker-machine虚拟机上运行,而不是我的本地操作系统.
相反,我试图使用以下方法安全地连接到VM docker.tls:
from docker import Client
import docker.tls as tls
from os import path
CERTS = path.join(path.expanduser('~'), '.docker', 'machine', 'certs')
tls_config = tls.TLSConfig(
client_cert=(path.join(CERTS, 'cert.pem'), path.join(CERTS,'key.pem')),
ca_cert=path.join(CERTS, 'ca.pem'),
verify=True
#verify=False
)
client = docker.Client(base_url='https://192.168.99.100:2376', tls=tls_config)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此代码(print client.containers()在下一行运行类似的东西)时,我收到此错误:
requests.exceptions.SSLError: hostname '192.168.99.100' doesn't match 'localhost'
Run Code Online (Sandbox Code Playgroud)
我一直试图在类似问题上遵循github问题boot2docker,即.旧版本docker-machine,但我不太了解如何实现SSL证书.我尝试按照github问题的建议添加192.168.99.100 localhost到我的/etc/hosts文件末尾,但这并没有解决问题(即使之后export DOCKER_HOST=tcp://localhost:2376).
也许通过证书进行连接不是可行的方法docker-machine,因此任何连接到特定docker-machine通道的替代方法的答案docker-py …
我似乎无法弄清楚如何使用docker-py SDK启用容器shell会话的async i/o.我本来想要实现的是docker exec -it bash $container_id在docker-py中有一个相同的工作.
显然,stdout没有任何问题.只是没有(明显的)方法来实际写入stdin来与正在运行的容器的shell进行交互.真的是这样吗?
cmd = "bash"
cli = docker.DockerClient()
cli.containers.get(container_id)
socket = cli.exec_run(cmd, stdin=True, socket=True)
socket.writable() # => False
Run Code Online (Sandbox Code Playgroud)
我还尝试'bin/bash -c "export TERM=xterm; exec bash"作为cmd 运行tty并向exec_run 添加标志.毋庸置疑,无济于事.
难道我做错了什么?
我有一个运行 Flask 应用程序的 Docker 容器。当 Flask 接收到 http 请求时,我想触发一个新的临时 Docker 容器的执行,该容器一旦完成它必须做的事情就会关闭。
我读过应该避免使用 Docker-in-Docker,因此这个新容器应该作为同级容器在我的主机上运行,而不是在 Flask 容器内运行。
使用docker-py执行此操作的解决方案是什么?
我已将Docker 插件与 Jenkins集成。
我确信集成成功了,因为在安装后我检查了“测试连接”并且它正确显示了我的 Docker 版本。
现在我试图从我的构建中配置奴隶,但它失败了。我正进入(状态:
pending #5
(pending—All nodes of label ‘docker test’ are offline
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我如何调试这个吗?
我想使用 docker-py 创建一个过程来在 Docker 容器内运行多个命令。阅读文档,我发现我可以在创建容器时使用命令选项..如下所示:
c.create_container(image="myimage", command="mycommand")
Run Code Online (Sandbox Code Playgroud)
有没有办法在刚刚创建的容器上运行其他命令?
谢谢!
我试图挂接到docker事件总线上,以监听集群上发生的各种事件,例如节点离开和加入集群,创建的服务等。问题。
是否有可能在群体级别获得此类信息?
如果是这样,是否使用dockerpy库来侦听此类事件?
当我像这样正常运行我的 docker 镜像时
docker run -v ..... {DOCKER_IMAGE}
Run Code Online (Sandbox Code Playgroud)
我按预期登录了终端。但是像这样运行:
docker_client = docker.from_env()
container = docker_client.containers.run(DOCKER_IMAGE, None, environment=[f'foo={self.profile}'],
volumes={...,}, auto_remove=True, stderr=True, stdout=True)
# No logs show up
Run Code Online (Sandbox Code Playgroud)
似乎抑制日志。如何在运行时获取日志输出?我可以流式传输 docker 容器运行吗?
我可以做这个
docker_client.containers.run(.... detach=True)
for line in container.logs(stream=True):
print(line)
Run Code Online (Sandbox Code Playgroud)
但这会丢失是否是调试/信息/警告/错误
Python noob 这里,我尝试使用exec_runfrom 的函数docker-py将命令发送到分离的 docker 容器,并让输出实时到达 stdout。这是一个 MWE:
import docker, sys
client = docker.from_env()
# start a detached container
box = client.containers.run(image = "ubuntu",
remove = True,
detach = True,
tty = True,
command = "/bin/bash")
# send a test command
box.exec_run(cmd = "find /") # gives no output in the terminal when run
# same again, but save the output
run = box.exec_run(cmd = "find /")
print(run.output.decode("utf-8"))
box.stop()
sys.exit()
Run Code Online (Sandbox Code Playgroud)
我可以通过将输出存储在变量中来获取事实后的输出,但我似乎无法获得实时输出。我实际上想给它长时间运行的进程,因此最好在发生时查看输出(以及保存它)。这很难做到吗,还是我在这里错过了一些非常基本的东西?
我正在 Python 中使用docker-py运行一个容器。与文档类似:
import docker
client = docker.from_env()
container = client.containers.run('bfirsh/reticulate-splines', detach=True)
Run Code Online (Sandbox Code Playgroud)
容器执行一些任务并将.json文件保存到共享卷。一切工作正常,除了我不知道如何在后台运行时捕获容器退出。更具体地说,我的问题如下:
“docker-py 有没有办法将回调函数传递给以分离模式运行的容器?”
我想访问.json 退出时保存的内容,并避免使用丑陋的语句,例如time.sleep()或 在status is running. 从文档来看,这似乎不可能。您有什么解决方法可以分享吗?
我正在尝试使用 docker-py 创建运行容器化应用程序,并且需要将输入数据写入其 STDIN,并从其 STDOUT 读取。基本上是这样的工作流程
echo "hello" | docker run -i --rm busybox sh -c "cat -"
Run Code Online (Sandbox Code Playgroud)
但在Python中。简而言之,我已经尝试了此处描述的STDIN 部分的方法,并 为 STDOUT 部分附加了另一个套接字。但它并没有像我希望的那样工作......这是一个最小的例子:
docker_test.py
echo "hello" | docker run -i --rm busybox sh -c "cat -"
Run Code Online (Sandbox Code Playgroud)
一个假人test.txt
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
以及执行结果:
$ ./docker_test.py
1
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它只输出测试文件的第一行,后面跟着一堆换行符,然后挂起。有时,它根本不输出任何内容,但无论哪种情况,它都不会退出。
我该如何正确地做到这一点?任何帮助将不胜感激。
提前致谢!