DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Newsletter
Log In / Join
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Related

  • Docker Sandboxes Beyond the Laptop: Running AI Agents in the Cloud
  • Understand the Sidecar Pattern by Deploying n8n to AWS Fargate
  • The Startup Time Trick Hiding Inside Your Docker Build
  • Containerizing Spark and Lakehouse Development with Docker

Trending

  • The Warning That Never Stops the Agent
  • Beyond Batch: Engineering Enterprise Systems for Real-Time Decisioning
  • Docker Sandboxes Beyond the Laptop: Running AI Agents in the Cloud
  • Anthropic Builds Biology Lab to Test What Claude Can Do in the Real World
  1. DZone
  2. Software Design and Architecture
  3. Cloud Architecture
  4. How to Run Karma Tests in a Docker Container

How to Run Karma Tests in a Docker Container

How do you launch a browser in a Docker container that has no graphic acceleration? PhantomJS can be a viable solution to this problem.

By 
Abdelghani Tassi user avatar
Abdelghani Tassi
·
Dec. 31, 16 · Tutorial
Likes (3)
Comment
Save
Tweet
Share
15.4K Views

Join the DZone community and get the full member experience.

Join For Free

Last week, I started developing a CI platform for my company using Karma and Jasmine as testing frameworks.

Our software solutions are built in different Docker containers and Karma runs tests in a browser. How do you launch a browser in a Docker container that has no graphic acceleration?

Here's the answer.

If your JavaScript code does not contain any ES5 or ES6 features, you can use PhantomJS as a testing browser.

PhantomJS runs as a background task with no graphical interface.

// karma.conf.js
module.exports = function(config) {
  config.set({
    browsers: ['PhantomJS', 'PhantomJS_custom'],

    // you can define custom flags
    customLaunchers: {
      'PhantomJS_custom': {
        base: 'PhantomJS',
        options: {
          windowName: 'my-window',
          settings: {
            webSecurityEnabled: false
          },
        },
        flags: ['--load-images=true'],
        debug: true
      }
    },

    phantomjsLauncher: {
      // Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom)
      exitOnResourceError: true
    }
  })
}

If you are using ES5 or ES6 (which is very likely), then you should use a real browser like Chrome or Firefox. These browsers need graphical acceleration, which is not available in a Docker container.

The trick is to launch the X virtual frame buffer (Xvfb), which emulates an X11 display so that the browser can execute its GUI code

Here's an example in a Centos Docker container:

yum -y install Xvfb libXfont Xorg chromium #install X* packages and chromium
/usr/bin/Xvfb :99 & #run Xvfb in background
export DISPLAY=:99.0 #export the display environment var

Your Karma config file should look like this:

module.exports = function(config) {
  config.set({
    browsers: ['Chrome'],
    customLaunchers: {
      Chrome_without_sandbox: {
        base: 'Chrome',
        flags: ['--no-sandbox'] // with sandbox it fails under Docker
      }
    },
    ...
  });
};
Docker (software)

Opinions expressed by DZone contributors are their own.

Related

  • Docker Sandboxes Beyond the Laptop: Running AI Agents in the Cloud
  • Understand the Sidecar Pattern by Deploying n8n to AWS Fargate
  • The Startup Time Trick Hiding Inside Your Docker Build
  • Containerizing Spark and Lakehouse Development with Docker

Partner Resources

×

Comments

The likes didn't load as expected. Please refresh the page and try again.

  • RSS
  • X
  • Facebook

ABOUT US

  • About DZone
  • Support and feedback
  • Community research

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 215
  • Nashville, TN 37211
  • [email protected]

Let's be friends:

  • RSS
  • X
  • Facebook