Невозможно установить phantomjs в Docker (контейнер Linux) на Windows (но работает в gitlab-ci) - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь запустить локальный образ докера и использовать его для запуска моих модульных тестов (и в будущем моих тестов e2e) из приложения angularjs, используя karma.

Мой gitlab-ci уже настроени это похоже на работу.Я использую общего бегуна, созданного кем-то в моей компании.Однако, когда я пытаюсь запустить тот же самый образ локально в Windows, используя docker (контейнеры Linux), он не может установить зависимости npm из моего package.json.

Если я делаю это вне контейнера (в моемокна) работает нормально.Я довольно новичок в докере, но, насколько я понимаю, образы должны вести себя одинаково независимо от того, в какой ОС их размещают.

Вот мой файл докера - довольно простой, он просто наследуется от образа узла и устанавливает 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 install / app / frontend / node_modules / phantomjs-prebuilt узел install.js

module.js: 550 с ошибкой броска;^

Ошибка: не удается найти модуль «readable-stream» в Function.Module._resolveFilename (module.js: 548: 15) в Function.Module._load (module.js: 475: 25) в модуле.require (module.js: 597: 17) в require (internal / module.js: 11: 18) в Object.(/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)

Thisэто мой 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'],
            },
        },
    });
}

Насколько я понимаю, мне нужен кукловод, чтобы бежать без головыхромовые тесты.И этот пакет puppeteer отличается в Linux и Windows (из-за исполняемого файла Chrome, который входит в его зависимости), поэтому я должен установить его изнутри контейнера.

Если я запускаю свои тесты в Windows (без докера), используя karma test, он работает нормально.

При монтировании образа запускайте контейнер без установки зависимостей внутри контейнера (то есть устанавливайте их из окон и сопоставьте node_modules вместо их установки извнутри контейнера, как указано выше) Я получаю следующую ошибку

12 12 2018 15: 02: 55.886: WARN [launcher]: ChromeHeadless не захвачен в течение 60000 мс, убивает.

и, конечно, он не работает.

Однако в gitlab ci он работает просто отлично - тесты запускаются, а зависимости устанавливаются с нуля.

Это мой gitlab-ci.ymlфайл, используя тот же образ из того же организационного центра и файл докера

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 pro - node version 8.14 - Docker desktop 2.0.0 для Windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...