标签: dockerpy

捕获python脚本的输出在docker容器内运行

这里的目的是使用docker容器作为安全沙箱来运行不受信任的python脚本,但是使用docker-py模块在python中执行此操作,并且能够捕获该脚本的输出.

我在docker容器中运行python脚本foo.py(它ENTRYPOINT在我的Dockerfile中设置为命令,所以它在容器运行后立即执行)并且无法捕获该脚本的输出.当我使用普通CLI运行容器时

docker run -v /host_dirpath:/cont_dirpath my_image
Run Code Online (Sandbox Code Playgroud)

(host_dirpath是包含foo.py的目录)我得到foo.py的预期输出打印到stdout,这只是一个键值对的字典.但是,我正在尝试使用docker-py模块在python中执行此操作,并且不知何故该logs方法未捕获脚本输出.这是我正在使用的python代码:

from docker import Client

docker = Client(base_url='unix://var/run/docker.sock',
              version='1.10',
              timeout=10)

contid = docker.create_container('my_image', volumes={"/cont_dirpath":""})
docker.start(contid, binds={"/host_dirpath": {"bind": "/cont_dirpath"} })

print "Docker logs: " + str(docker.logs(contid))
Run Code Online (Sandbox Code Playgroud)

这只会导致"Docker日志:" - 日志中没有捕获任何内容,stdout和stderr都没有(我尝试在foo.py中引发异常来测试它).

我之后的结果是由foo.py计算的,目前只是用python print语句打印到stdout .如何将它包含在docker容器日志中,以便我可以在python中读取它?或者从容器外部以其他方式捕获此输出?

任何帮助将不胜感激.提前致谢!

编辑:

使用docker-py仍然没有运气,但是当使用subprocess.Popen使用普通CLI运行容器时它运行良好 - 执行此操作时,输出确实被stdout正确抓取.

python linux docker dockerpy

23
推荐指数
1
解决办法
1万
查看次数

如何发送到docker-py容器的stdin?

考虑这个shell示例:

echo "hello" | docker run --rm -ti  -a stdin busybox \
    /bin/sh -c "cat - >/out"
Run Code Online (Sandbox Code Playgroud)

这将执行busybox容器并/out使用内容创建一个新文件hello.

我如何用docker-py实现这一目标?

docker-py相当于:

container = docker_client.create_container( 'busybox',
                                            stdin_open = True,
                                            command    = 'sh -c "cat - >/out"'
                                            )
docker_client.start( container )
Run Code Online (Sandbox Code Playgroud)

stdin_open = True,但我在哪里写'hello'

docker dockerpy

11
推荐指数
1
解决办法
2871
查看次数

如何使用docker-py(官方docker客户端)启动bash shell?

我正在尝试使用docker-py运行一个docker容器并将我放入该容器中的bash shell中.我得到了运行容器(我可以看到它docker ps,我可以使用本机docker客户端很好地附加它),但是当我使用attach()官方Python库时,它只是给我一个空字符串作为响应.如何附加到我的bash shell?

>>> import docker
>>> c = docker.Client()
>>> container = c.create_container(image='d11wtq/python:2.7.7', command='/bin/bash', stdin_open=True, tty=True, name='docker-test')
>>> container
{u'Id': u'dd87e4ec75496d8369e0e526f343492f7903a0a45042d312b37859a81e575303', u'Warnings': None}
>>> c.start(container)
>>> c.attach(container)
''
Run Code Online (Sandbox Code Playgroud)

python docker dockerpy

10
推荐指数
1
解决办法
6566
查看次数

来自Docker hub私有注册表的Docker远程api

我正在尝试使用docker远程API 从Docker hub https://registry.hub.docker.com/u/myname/myapp中托管的私有存储库中提取docker映像.该文档不清楚如何在POST请求中指定身份验证凭据

curl -XPOST -H "X-Registy-Auth: base64_encoded_authconfig_object" "http://localhost:4243/images/create?fromImage=myname/myapp"
Run Code Online (Sandbox Code Playgroud)

也没有详细说明如何生成authconfig.

这里讨论了使用如下结构在基础64编码的json中发送:

{
  "index_url": {
    "username": "string",
    "password": "string",
    "email": "string",
    "serveraddress": "string"
  }
}
Run Code Online (Sandbox Code Playgroud)

但是没有解释什么是index_url和serveraddress.是吗

index_url = https://registry.hub.docker.com/u/myname/myapp
serveraddress = https://registry.hub.docker.com
Run Code Online (Sandbox Code Playgroud)

上面的配置给了我404,可能是注册中心私有仓库没有被识别.

我也试过base 64编码我的〜/ .dockercfg的内容

{
  "https://index.docker.io/v1/": {
    "auth":"xxxxxxxxxxxxxxxxxxx==",
    "email":"myname@myemail.com"
  }
}
Run Code Online (Sandbox Code Playgroud)

你能告诉我如何生成base64编码的authconfig对象并使上面的curl命令工作.

提前致谢

Docker版本

Client version: 0.11.1
Client API version: 1.11
Go version (client): go1.2.1
Git commit (client): fb99f99
Server version: 0.11.1
Server API version: 1.11
Git commit (server): fb99f99
Go version (server): …
Run Code Online (Sandbox Code Playgroud)

docker dockerpy

9
推荐指数
1
解决办法
7699
查看次数

docker-py:如何将IP地址绑定到容器

假设我有一个名为"mynet"的网络,我想启动一个IP地址绑定到192.168.23.2的容器.

我开始的代码是:

import docker
c = docker.from_env()
c.containers.run('containername', 'sh some_script.sh', network='mynet')
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我正在寻找相当于该--ip选项的docker run.

python docker dockerpy

9
推荐指数
1
解决办法
718
查看次数

来自命令行和python api的docker exec中的管道

我尝试实现的是mysqldump在容器中调用并将数据库转储到容器自己的目录中.

首先我尝试下面的命令:

$ docker exec container-name mysqldump [options] database | xz > database.sql.xz
Run Code Online (Sandbox Code Playgroud)

这不起作用,所以我尝试另一个是:

$ docker exec container-name bash -c 'mysqldump [options] database | xz > database.sql.xz'
Run Code Online (Sandbox Code Playgroud)

这次它奏效了.

但那真的很蹩脚.

然后我尝试使用docker-py这个时间cmd选项,看起来像这样:

cmd=['bash', '-c', 'mysqldump [options]  database | xz > database.sql.xz']
Run Code Online (Sandbox Code Playgroud)

记录器事件如下:

level="info" msg="-job log(exec_start: bash -c mysqldump [options]  database | xz > database.sql.xz, fe58e681fec194cde23b9b31e698446b2f9d946fe0c0f2e39c66d6fe68185442, mysql:latest) = OK (0)"
Run Code Online (Sandbox Code Playgroud)

我的问题:

存档我的目标有更优雅的方式吗?

python pipeline docker dockerpy

8
推荐指数
1
解决办法
9974
查看次数

docker 内的 Docker:卷已安装,但为空

我正在运行一个 docker 容器,其中使用以下命令安装了 docker:

docker run -v /Path/to/service:/src/service -v /var/run/docker.sock:/var/run/docker.sock --net=host image-name python run.py
Run Code Online (Sandbox Code Playgroud)

这将运行一个 python 脚本,该脚本创建一个data文件夹/src并填充它。打印时os.listdir('/src/data'),我得到文件列表。

然后,我从该容器内运行一个容器data,使用docker-py.

volumes = {'/src/data': {'bind': '/src', 'mode': 'rw'}}    
client.containers.run(image, command='ls data', name=container_key, network='host', volumes=volumes)
Run Code Online (Sandbox Code Playgroud)

它打印:

Starting with UID: 0 and HOME: /src\n0\n'
Run Code Online (Sandbox Code Playgroud)

这意味着data已安装,但为空。我究竟做错了什么 ?

docker dockerpy

8
推荐指数
1
解决办法
4185
查看次数

docker python api中有docker检查吗?

我想获取容器的 IP 地址,并尝试弄清楚如何使用 python docker API。

我想在 python API 中做类似的事情

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,但 ip 地址返回 null

import docker
dockerClient = docker.from_env()

client = docker.APIClient(base_url='unix://var/run/docker.sock')
for container in dockerClient.containers.list():
    print container.id
    print "-------------"
    print client.inspect_container(container.id)['NetworkSettings']['IPAddress']
Run Code Online (Sandbox Code Playgroud)

python docker dockerpy

7
推荐指数
2
解决办法
5371
查看次数

如何使用 Docker SDK for Python 运行具有特定 GPU 的 Docker 容器

在命令行中,我习惯使用 --gpus 参数运行/创建具有特定 GPU 的容器:

docker run -it --gpus '"device=0,2"' ubuntu nvidia-smi

Docker SDK for Python 文档不是很有帮助,我找不到关于如何使用 python SDK 执行相同操作的良好解释。有办法做到吗?

python cuda docker dockerpy nvidia-docker

7
推荐指数
1
解决办法
3426
查看次数

docker-py:访问在 ENTRYPOINT 命令中运行的 python 脚本的输出

我在使用 Python 中的 docker-py 模块获取在 docker 容器中运行的 Python 脚本的输出时遇到问题。

首先,一些上下文:

我已经创建了一个 Dockerfile 并通过命令行 ( docker build -t myimage /path/to/dockerfile)以正常方式构建了我的映像(ID 为 84730be6107f )。Python 脚本作为ENTRYPOINTDockerfile 中的命令执行:

ENTRYPOINT ["python", "/cont_dirpath/script.py"]
Run Code Online (Sandbox Code Playgroud)

包含脚本的目录在运行时被添加(绑定)到容器中。

当我通过通常的 docker 命令行(在 Ubuntu 中)使用以下命令执行此操作时:

docker run -v /host_dirpath:/cont_dirpath 84730be6107f
Run Code Online (Sandbox Code Playgroud)

我将预期的 Python 脚本输出打印到 stdout(显示在终端中 - 脚本以print result命令结尾)。这正是我在 Python 中执行此操作时试图获得的输出。

但是,当尝试使用 docker-py 包在 Python 中执行此操作时,我无法查看结果 - 该logs方法返回一个空字符串。这是我正在使用的 Python 代码:

from docker import Client

docker = Client(base_url='unix://var/run/docker.sock',
                  version='1.10',
                  timeout=10)

contid = docker.create_container('84730be6107f', volumes={"/cont_dirpath":""})
docker.start(contid, binds={"/host_dirpath": {"bind": "/cont_dirpath"} …
Run Code Online (Sandbox Code Playgroud)

python linux docker dockerpy

6
推荐指数
1
解决办法
2716
查看次数

标签 统计

docker ×10

dockerpy ×10

python ×7

linux ×2

cuda ×1

nvidia-docker ×1

pipeline ×1