CircleCI本地运行报错:多容器出现invalid UTS mode错误
问题描述
尝试通过CircleCI本地执行排查测试用例失败,持续报错:
Error starting container <container>: Error response from daemon: invalid UTS mode: container....
该错误出现在elasticsearch:5.4.3、postgres等多个容器上。执行命令为circleci local execute build,环境版本如下:
- CircleCi版本:0.1.23845+f59d90e (release)
- Docker版本23.0.1, build a5ee5b1
- docker-compose版本1.29.2
- ubuntu 20.04
使用的config.yml配置如下:
version: 2 jobs: build: docker: - image: 722c/circle-ci-ubuntu-python-3:18.04-Node-10 environment: - DJANGO_SETTINGS_MODULE=config.settings.testing - DATABASE_URL=postgres://saleor:saleor@db/saleor - DJANGO_DEFAULT_FROM_EMAIL=noreply@example.com - BOOK_SERVER_URL="test" - BOOK_SERVER_TOKEN="test" - image: postgres name: db environment: - POSTGRES_USER=saleor - POSTGRES_PASSWORD=saleor - image: elasticsearch:5.4.3 name: search environment: - 'ES_JAVA_OPTS=-Xms512m -Xmx512m' working_directory: /app steps: - checkout # Dependencies # This would typically go in either a build or a build-and-test job when using workflows # Restore the dependency cache - restore_cache: - run: name: Git submodules Sync command: git submodule sync - run: name: Git submodules update command: git submodule update --init - run: name: Install Python dependencies command: pip3 install -r requirements.txt - run: name: Install Node dependencies command: npm install # Save dependency cache - save_cache: key: v2-dep-{{ .Branch }}-{{ epoch }} paths: - ./node_modules - /root/.cache - run: name: Build the related files command: npm run build-emails && npm run build-assets --production - run: name: Run tests command: pytest
疑问:
config.yml是否存在遗漏配置?- 该错误具体含义是什么?UTS mode是什么?为何无效?
- 已确认内核中UTS namespace已启用,求排查思路或建议。
解答
错误含义与UTS Mode解释
- 错误本质:Docker daemon无法识别CircleCI本地执行时传递的UTS模式参数,导致容器启动失败。
- UTS Mode定义:UTS是Linux命名空间的一种,用于隔离主机名和域名。Docker中常见的UTS模式有两种:
host:容器共享宿主机的UTS命名空间,即容器与宿主机使用相同主机名private:容器使用独立的UTS命名空间,为默认值
而container:<容器ID/名称>模式让当前容器共享另一个容器的UTS命名空间,但你的环境中CircleCI本地客户端与Docker版本的兼容性问题导致该模式无法被识别。
config.yml配置检查
你的config.yml无明显语法错误,但有两处细节需要完善:
restore_cache步骤缺少keys配置,应指定缓存匹配规则,示例:- restore_cache: keys: - v2-dep-{{ .Branch }}-{{ epoch }} - v2-dep-{{ .Branch }}- - v2-dep-- 环境变量中的引号可移除(如
BOOK_SERVER_URL="test"改为BOOK_SERVER_URL=test),避免潜在解析问题,但这不是当前错误的诱因。
排查思路与解决建议
核心原因:版本兼容性冲突
CircleCI本地客户端(0.1.23845)版本较旧,而Docker 23.0.1属于新版本,两者在UTS模式参数传递上存在兼容性问题——旧版CircleCI可能使用了Docker已废弃或修改的语法。
具体解决步骤
- 降级Docker版本:将Docker降级至20.10.x或21.x系列,旧版CircleCI本地客户端对这些版本的兼容性更好。
- 升级CircleCI本地客户端:若不想降级Docker,尝试升级CircleCI本地客户端到最新版本,新版本通常会修复与高版本Docker的兼容问题。
- 绕过CircleCI本地执行:直接用Docker Compose手动搭建测试环境,模拟CircleCI的容器配置执行测试。示例
docker-compose.yml:
执行version: '3' services: app: image: 722c/circle-ci-ubuntu-python-3:18.04-Node-10 environment: DJANGO_SETTINGS_MODULE: config.settings.testing DATABASE_URL: postgres://saleor:saleor@db/saleor DJANGO_DEFAULT_FROM_EMAIL: noreply@example.com BOOK_SERVER_URL: test BOOK_SERVER_TOKEN: test working_dir: /app volumes: - ./:/app command: bash -c "git submodule sync && git submodule update --init && pip3 install -r requirements.txt && npm install && npm run build-emails && npm run build-assets --production && pytest" db: image: postgres environment: POSTGRES_USER: saleor POSTGRES_PASSWORD: saleor search: image: elasticsearch:5.4.3 environment: ES_JAVA_OPTS: "-Xms512m -Xmx512m"docker-compose up即可运行测试。
额外排查点
- 检查Docker daemon配置文件
/etc/docker/daemon.json,若有自定义UTS相关配置,暂时注释后重启Docker daemon重试。 - 确认执行
circleci local execute的用户拥有Docker操作权限,必要时可临时加sudo执行(不推荐长期使用)。
内容的提问来源于stack exchange,提问作者Trax Bagley
相关产品推荐
相关产品推荐

