我正在尝试在本地运行docker映像,并使用它使用karma从angularjs应用程序运行我的单元测试(以及将来的e2e测试)。
我的gitlab-ci已经配置好了,似乎可以正常工作。我正在使用公司中创建某人的共享跑步者。但是,当我尝试使用docker(Linux容器)在Windows中本地运行完全相同的映像时,它无法从我的package.json安装npm依赖项。
如果我在容器外部(在Windows中)执行此操作,则效果很好。我是Docker的新手,但我的理解是,无论托管什么操作系统,映像的行为都应相同。
这是我的docker文件-非常简单,它只是从节点映像继承而来,并安装了chrome以供业力运行测试
FROM node:8.14-jessie
RUN apt-get update
RUN apt-get install chromium xvfb --yes
# See https://crbug.com/795759
RUN apt-get update && apt-get install -yq libgconf-2-4
# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)
# Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer
# installs, work.
RUN apt-get update && apt-get install -y wget --no-install-recommends \
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
&& apt-get update \
&& apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst ttf-freefont \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get purge --auto-remove -y curl \
&& rm -rf /src/*.deb
此自定义映像托管在Docker的组织中心中。应该安装chrome来运行无头测试及其所有依赖项。
要下载此图片,我在Windows上做了
docker pull my-org/my-image-name
要安装它,我刚刚执行了
docker run -it --rm -v ${pwd}:/app my-org/my-image-name sh
将代码映射到容器中的/app
中
使用bash在容器内部,我只是导航到应用程序文件夹,并通过运行npm install
尝试安装依赖项。
但是我遇到以下错误
phantomjs-prebuilt@2.1.16安装/ app / frontend / node_modules / phantomjs-prebuilt 节点install.js
module.js:550 犯错 ^
错误:找不到模块“可读流” 在Function.Module._resolveFilename(module.js:548:15) 在Function.Module._load(module.js:475:25) 在Module.require(module.js:597:17) 在要求时(internal / module.js:11:18) 在对象。 (/app/frontend/node_modules/concat-stream/index.js:1:78) 在Module._compile(module.js:653:30) 在Object.Module._extensions..js(module.js:664:10) 在Module.load(module.js:566:32) 在tryModuleLoad(module.js:506:12) 在Function.Module._load(module.js:498:3)
这是我的package.json,相关部分
"devDependencies": {
"jasmine-core": "^2.99.1",
"karma-chrome-launcher": "^2.2.0",
"karma-jasmine-html-reporter": "^0.2.2",
"karma-junit-reporter": "^1.2.0",
"puppeteer": "^1.11.0",
...
}
这是我的karma.conf
(同样,只是相关部分)
process.env.CHROME_BIN = require('puppeteer').executablePath();
module.exports = function(config) {
config.set({
...
//list of frameworks you want to use, only jasmine is installed automatically
frameworks: ['jasmine'],
//list of browsers to launch and capture
browsers: [
'ChromeHeadlessNoSandbox'
],
customLaunchers: {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: ['--no-sandbox'],
},
},
});
}
我的理解是,我需要操纵up来进行无头铬测试。而且该puppeteer软件包在linux和Windows上有所不同(因为Chrome可执行文件是其依赖项的一部分),因此我应该从容器内部安装它。
如果使用karma test
在Windows(没有docker)上运行测试,则效果很好。
如果安装映像,则运行容器而不在容器内部安装依赖项(即从Windows和地图node_modules
安装它们,而不是像上面那样从容器内部安装它们),我得到以下信息错误
12 12 2018 15:02:55.886:WARN [启动器]:ChromeHeadless还没有 在60000毫秒内捕获,杀死。
当然会失败。
但是,在gitlab ci中它可以正常工作-运行测试并从头开始安装依赖项。
这是我的gitlab-ci.yml文件,使用来自同一组织中心和docker文件的相同图像
image: my-org/my-image-name
# This folder is cached between builds
# http://docs.gitlab.com/ce/ci/yaml/README.html#cache
cache:
paths:
- frontend/node_modules
stages:
- frontend_ci
frontend:
stage: frontend_ci
tags:
- docker
script:
- cd frontend
- npm install
- npm test
好的部分是CI集成可以很好地工作,但是我必须将更多更改集成到dockerfile(以及gitlab-ci管道的步骤)中,提交并等待中心构建映像然后强制执行是很痛苦的在gitlab-ci中运行的作业-
我想在本地运行该映像,以便可以检查所有本来可以添加工作的更改。
但是我需要测试阶段才能正常运行。
我做错了什么?请让我知道是否有任何遗漏-我想我只提供了相关信息。
使用 -Windows 10专业版 -节点版本8.14 -适用于Windows的Docker桌面2.0.0