如何为TestContainers的Generic容器分配更多内存?
问题描述
我有一个测试用例,使用TestContainers技术运行Docker容器,代码如下:
GenericContainer(MY_SAMBA_IMAGE) .withEnv("...") .withEnv("...") .withEnv("...") .withPrivilegedMode(true) .waitingFor(...) .start()
但运行时出现内存错误,报错信息如下:
17:18:56.884 [docker-java-stream--1885712736] INFO SAMBA_CONTAINER -- STDERR: ERROR(<class 'MemoryError'>): uncaught exception - 17:18:56.884 [docker-java-stream--1885712736] INFO SAMBA_CONTAINER -- STDERR: File "/app/inno-samba/lib/python3.7/site-packages/samba/netcmd/__init__.py", line 285, in _run 17:18:56.885 [docker-java-stream--1885712736] INFO SAMBA_CONTAINER -- STDERR: return self.run(*args, **kwargs) 17:18:56.885 [docker-java-stream--1885712736] INFO SAMBA_CONTAINER -- STDERR: File "/app/inno-samba/lib/python3.7/site-packages/samba/netcmd/domain/provision.py", line 362, in run 17:18:56.885 [docker-java-stream--1885712736] INFO SAMBA_CONTAINER -- STDERR: backend_store_size=backend_store_size) 17:18:56.885 [docker-java-stream--1885712736] INFO SAMBA_CONTAINER -- STDERR: File "/app/inno-samba/lib/python3.7/site-packages/samba/provision/__init__.py", line 2307, in provision 17:18:56.885 [docker-java-stream--1885712736] INFO SAMBA_CONTAINER -- STDERR: schemadn=names.schemadn, base_schema=base_schema) 17:18:56.885 [docker-java-stream--1885712736] INFO SAMBA_CONTAINER -- STDERR: File "/app/inno-samba/lib/python3.7/site-packages/samba/schema.py", line 114, in __init__ 17:18:56.886 [docker-java-stream--1885712736] INFO SAMBA_CONTAINER -- STDERR: self.ldb = SamDB(global_schema=False, am_rodc=False)
使用docker-compose运行同一容器时一切正常。请问TestContainers是否会额外限制内存?能否为该容器分配更多内存?
解答
- TestContainers默认不会额外给容器设置内存限制,它会继承Docker守护进程的默认资源配额。docker-compose能正常运行但TestContainers不行,大概率是因为两者启动容器时的默认资源分配存在差异,或者Docker守护进程的全局限制对TestContainers启动的容器生效更严格。
- 可以为TestContainers启动的容器分配更多内存,有两种常用方式:
- 使用
withCreateContainerCmdModifier自定义容器配置:
GenericContainer(MY_SAMBA_IMAGE) .withEnv("...") .withPrivilegedMode(true) .waitingFor(...) .withCreateContainerCmdModifier(cmd -> { cmd.getHostConfig().withMemory(4L * 1024 * 1024 * 1024); // 分配4GB内存 cmd.getHostConfig().withMemorySwap(-1L); // 禁用内存交换限制 }) .start();- 使用TestContainers提供的简化API(适用于较新版本):
GenericContainer(MY_SAMBA_IMAGE) .withEnv("...") .withPrivilegedMode(true) .waitingFor(...) .withMemory(4L * 1024 * 1024 * 1024) .withMemorySwap(-1L) .start(); - 使用
- 另外,也可以检查Docker守护进程的全局资源设置,确保其分配的内存足够容器运行。
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

