Я пытаюсь запустить локальный образ докера и использовать его для запуска моих модульных тестов (и в будущем моих тестов 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