【问题标题】:Is there an option to see STDOUT with docker SDK when building images?在构建图像时,是否可以选择使用 docker SDK 查看 STDOUT?
【发布时间】:2021-07-28 21:14:57
【问题描述】:

我刚开始使用 python 而不是 sh-scripts 构建我的 docker 映像,但我很困惑,因为我的脚本没有 STDOUT。

有没有办法启用它?如果返回对象,参数“quiet”似乎启用/禁用。

谢谢,

雅各布

小例子:

# Dockerfile
FROM ubuntu
# main.py
import docker

client = docker.from_env()
client.images.build(path='.')

在控制台中执行构建命令的地方:

jakob@jakob:~/foo$ docker build .
Sending build context to Docker daemon  20.99kB
Step 1/1 : FROM ubuntu
---> 7e0aa2d69a15
Successfully built 7e0aa2d69a15

执行 python 文件不会产生任何结果。我希望两者的 STDOUT 相似。

【问题讨论】:

    标签: python docker docker-image


    【解决方案1】:

    我以前从未使用过它,但我只是将build() 放在print() 中,我发现它返回了一些值。

    (<Image: 'ubuntu:latest'>, <itertools._tee object at 0x7f836bea2b00>)
    

    所以我开始使用print(...)print(type(...))print(dir(...)) 对其进行测试

    因为我看到了itertools这个词,所以我尝试将它与for-loop一起使用。

    这段代码

    import docker
    
    client = docker.from_env()
    result = client.images.build(path='.', quiet=False)
    
    #print(result)
    
    print(result[0], type(result[0]))
    print(dir(result[0])
    
    for item in result[1]:
        print(item)
    

    给我

    <Image: 'ubuntu:latest'> <class 'docker.models.images.Image'> 
    
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'attrs', 'client', 'collection', 'history', 'id', 'id_attribute', 'labels', 'reload', 'save', 'short_id', 'tag', 'tags']
    
    {'stream': 'Step 1/1 : FROM ubuntu'}
    {'stream': '\n'}
    {'stream': ' ---> 7e0aa2d69a15\n'}
    {'aux': {'ID': 'sha256:7e0aa2d69a153215c790488ed1fcec162015e973e49962d438e18249d16fa9bd'}}
    {'stream': 'Successfully built 7e0aa2d69a15\n'}
    

    它显示字典,所以使用key,value 我可以格式化它(并过滤它)

    import docker
    
    client = docker.from_env()
    result = client.images.build(path='.')#, quiet=False)
    
    #print(result)
    
    #print(result[0], type(result[0]))
    #print(dir(result[0]))
    
    for item in result[1]:
        #print(item)
        for key, value in item.items():
            #print(key, ':', value)
            if key == 'stream':
                text = value.strip()
                if text:
                    print(text)
    

    这给了我

    Step 1/1 : FROM ubuntu
    ---> 7e0aa2d69a15
    Successfully built 7e0aa2d69a15
    

    【讨论】:

    • 非常感谢 :) 它确实回答了我的问题 - 当我构建多个 docker 图像(每个需要 1 小时以上)却没有得到任何反馈或无法检查构建时感觉很奇怪过程。尽管我希望这个包能够以某种方式打印这些东西。谢谢
    猜你喜欢
    • 2016-10-13
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2020-09-08
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多