无法在Windows的docker(Linux容器)中安装phantomjs(但在gitlab-ci中运行)

时间:2018-12-12 15:16:39

标签: docker npm phantomjs karma-jasmine gitlab-ci

我正在尝试在本地运行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

0 个答案:

没有答案