testcontainers / testcontainers/testcontainers-python
Bug: wait_for_logs on DockerCompose container fails
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 2.3k
- 派生
- 386
- 平均合并
- 4 小时 40 分钟
- 30 天内合并 PR
- 1
描述
Describe the bug
Attempting to wait_for_logs on a docker compose container is failing. Cause seems to be .decode() being used twice (i.e. attempt to .decode() a string already decoded earlier).
wait_for_logsis.decode()-ing here the result ofDockerCompose.get_logs()DockerCompose.get_logs()here has already decoded the stdout byte stream.- Attempt to decode a string object fails.
To Reproduce
from testcontainers.compose import DockerCompose
from testcontainers.core.waiting_utils import wait_for_logs
compose = DockerCompose("./docker/", compose_file_name="docker-compose.yml", services=['slim-db'])
compose.start()
delay = wait_for_logs(compose, "database system is ready to accept connections")
produces an AttributeError:
AttributeError Traceback (most recent call last)
----> [1] delay = wait_for_logs(compose, "database system is ready to accept connections")
File ~/myproject/.venv/lib/python3.12/site-packages/testcontainers/core/waiting_utils.py:102, in wait_for_logs(container, predicate, timeout, interval)
100 while True:
101 duration = time.time() - start
--> 102 stdout = container.get_logs()[0].decode()
103 stderr = container.get_logs()[1].decode()
104 if predicate(stdout) or predicate(stderr):
AttributeError: 'str' object has no attribute 'decode'
Runtime environment
This error arises in python versions 3.10, 3.11, and 3.12. The current environment:
% uname -a
Linux ubuntu-mate 6.5.0-44-generic #44~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Jun 18 14:36:16 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
% python --version
Python 3.12.3
% docker info
Client: Docker Engine - Community
Version: 26.1.3
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.14.0
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.27.0
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 1
Running: 1
Paused: 0
Stopped: 0
Images: 4
Server Version: 26.1.3
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: e377cd56a71523140ca6ae87e30244719194a521
runc version: v1.1.12-0-g51d5e94
init version: de40ad0
Security Options:
apparmor
seccomp
Profile: builtin
cgroupns
Kernel Version: 6.5.0-44-generic
Operating System: Ubuntu 22.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.747GiB
Name: ubuntu-mate
ID: 44dbea1b-0b0f-44d6-8f3f-f9d82397b2c9
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Other Notes
As a simple test, a quick patch (I removed the .decode() in the get_logs method of DockerCompose) resolves this issue for me. I have not tested (and don't really have the capacity to do so, unfortunately) the impact of this change across other parts of the code base. There may be other places which expect a string instead of a byte stream -- I don't yet know.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 core/testcontainers/core/waiting_utils.py 中的 wait_for_logs 和 core/testcontainers/compose/compose.py 中的 DockerCompose.get_logs() 开始,然后使用 DockerCompose 和 slim-db 服务运行复现。确认 wait_for_logs 可以处理 Compose 日志而不会出现 AttributeError,并确认所报告的 readiness predicate 成功。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- docker, docker-compose, python
- 领域
- devops, testing-qa
- Issue 类型
- 缺陷
- 难度
- 2/5
- 预计耗时
- 1-3 小时
- 活跃度
- 停滞
- 描述清晰度
- 描述清楚
- 新手友好度
- 55/100