当尝试在CircleCI上对Docker容器进行测试时出现错误
首先
我尝试在CircleCI上测试Docker容器。由于遇到了很多错误,所以我留下了解决方法。
用CircleCI测试Docker镜像
这几乎是上述文章中提到的内容。
环境
-
- CircleCI
-
- Docker
- Serverspec
LXC驱动不支持Exec。
1) nodejs Package "nodejs" should be installed
Failure/Error: it { should be_installed }
Docker::Error::ServerError:
Unsupported: Exec is not supported by the lxc driver
由于 docker exec 无法通过,测试失败了。
原因是CircleCI平台的规格限制。在CircleCI的说明页面上也写明了无法使用docker exec命令。
由于我们在Docker中使用LXC驱动程序,并且LXC驱动程序的docker exec尚未被实现,所以docker exec在我们的容器中无法运行。
解决方案 (jiě jué àn)
通过将specinfra版本固定为”2.12.7″,可以以不使用docker exec的形式运行测试。
source 'https://rubygems.org'
gem 'docker-api'
group :test do
gem 'specinfra', '2.12.7'
gem 'serverspec'
end
一旦进行变更后,务必不要忘记使用bundle update来更新gemfile.lock。
无法摧毁容器
1) nodejs Package "nodejs" should be installed
Failure/Error: it { should be_installed }
Docker::Error::ServerError:
Cannot destroy container b9df599afbb6c921573f44cf2e5724be837647131a20f7168c4a28b19bfb3984: Driver btrfs failed to remove root filesystem b9df599afbb6c921573f44cf2e5724be837647131a20f7168c4a28b19bfb3984: Failed to destroy btrfs snapshot: operation not permitted
由于docker rm无法通过,测试失败了。
由于CircleCI权限不被允许,所以显示“操作不允许”。
解决办法
为了避免使用docker rm命令,我们将仅部分修改Serverspec的行为。
参考:avatarnewyork/dockerenv_apache
在*_spec.rb文件中添加。
# Workaround needed for circleCI
if ENV['CIRCLECI']
class Docker::Container
def remove(options={}); end
alias_method :delete, :remove
end
end