Docker

Setup Chrome in Docker

Slide1

I have been playing with docker since some time and trying to setup different environment with it. Recently I have issue to setup chrome on docker.

Usually any software or api works in docker out of box without any extra setup. However for chrome I found it’s kind of tricky. Let’s ask first ask the question why we need chrome inside the docker. In my case, I wanted to run test in headless mode in chrome.

What’s the Problem with chrome in docker

Usually chrome open in sandbox and need more memory to open, which docker has the problem to do that, chrome get crash whenever you try to open the chrome in docker or try to run the test. It will says chrome unreachable or Out Of Memory Issue which is understandable as docker doesn’t provide efficient memory to run the chrome.

How to Solve this problem

To solve this problem we can do one of these things:

  • Provide more memory to chrome by using host system memory 

Which you can do by using command docker -d -v /dev/shm:/dev/shm

  • Open chrome without sandbox.

Here are the steps to do that:

  • You have to write these line in Dockerfile to install Chrome

    #===============
    # Google Chrome
    #===============
    RUN wget -O – https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add – \
    && echo “deb http://dl.google.com/linux/chrome/deb/ stable main” >> /etc/apt/sources.list.d/google-chrome.list \
    && apt-get update -y \
    && apt-get -y install google-chrome-stable \
    && rm /etc/apt/sources.list.d/google-chrome.list \
    && rm -rf /var/lib/apt/lists/*

    # This is optional step, which you need if you want to run selenium test #==================
    # Chrome webdriver
    #==================
    RUN wget –no-verbose -O /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip \
    && rm -rf /opt/selenium/chromedriver \
    && unzip /tmp/chromedriver_linux64.zip -d /opt/selenium \
    && rm /tmp/chromedriver_linux64.zip \
    && mv /opt/selenium/chromedriver /opt/selenium/chromedriver-$CHROME_DRIVER_VERSION \
    && chmod 755 /opt/selenium/chromedriver-$CHROME_DRIVER_VERSION \
    && ln -fs /opt/selenium/chromedriver-$CHROME_DRIVER_VERSION /usr/bin/chromedriver

  • Now you need to get this chrome launcher(I got this from selenium docker github)

#!/bin/bash

# Let the wrapped binary know that it has been run through the wrapper.
export CHROME_WRAPPER=”`readlink -f “$0″`”

HERE=”`dirname “$CHROME_WRAPPER”`”

# Check if the CPU supports SSE2. If not, try to pop up a dialog to explain the
# problem and exit. Otherwise the browser will just crash with a SIGILL.
# http://crbug.com/348761
grep ^flags /proc/cpuinfo|grep -qs sse2
if [ $? != 0 ]; then
SSE2_DEPRECATION_MSG=”This computer can no longer run Google Chrome because \
its hardware is no longer supported.”
if which zenity &> /dev/null; then
zenity –warning –text=”$SSE2_DEPRECATION_MSG”
elif which gmessage &> /dev/null; then
gmessage “$SSE2_DEPRECATION_MSG”
elif which xmessage &> /dev/null; then
xmessage “$SSE2_DEPRECATION_MSG”
else
echo “$SSE2_DEPRECATION_MSG” 1>&2
fi
exit 1
fi

# We include some xdg utilities next to the binary, and we want to prefer them
# over the system versions when we know the system versions are very old. We
# detect whether the system xdg utilities are sufficiently new to be likely to
# work for us by looking for xdg-settings. If we find it, we leave $PATH alone,
# so that the system xdg utilities (including any distro patches) will be used.
if ! which xdg-settings &> /dev/null; then
# Old xdg utilities. Prepend $HERE to $PATH to use ours instead.
export PATH=”$HERE:$PATH”
else
# Use system xdg utilities. But first create mimeapps.list if it doesn’t
# exist; some systems have bugs in xdg-mime that make it fail without it.
xdg_app_dir=”${XDG_DATA_HOME:-$HOME/.local/share/applications}”
mkdir -p “$xdg_app_dir”
[ -f “$xdg_app_dir/mimeapps.list” ] || touch “$xdg_app_dir/mimeapps.list”
fi

# Always use our versions of ffmpeg libs.
# This also makes RPMs find the compatibly-named library symlinks.
if [[ -n “$LD_LIBRARY_PATH” ]]; then
LD_LIBRARY_PATH=”$HERE:$HERE/lib:$LD_LIBRARY_PATH”
else
LD_LIBRARY_PATH=”$HERE:$HERE/lib”
fi
export LD_LIBRARY_PATH

export CHROME_VERSION_EXTRA=”stable”

# We don’t want bug-buddy intercepting our crashes. http://crbug.com/24120
export GNOME_DISABLE_CRASH_DIALOG=SET_BY_GOOGLE_CHROME

# Automagically migrate user data directory.
# TODO(phajdan.jr): Remove along with migration code in the browser for M33.
if [[ -n “” ]]; then
if [[ ! -d “” ]]; then
“$HERE/chrome” “–migrate-data-dir-for-sxs=” \
–enable-logging=stderr –log-level=0
fi
fi

# Make sure that the profile directory specified in the environment, if any,
# overrides the default.
if [[ -n “$CHROME_USER_DATA_DIR” ]]; then
PROFILE_DIRECTORY_FLAG=”–user-data-dir=$CHROME_USER_DATA_DIR”
fi

# Sanitize std{in,out,err} because they’ll be shared with untrusted child
# processes (http://crbug.com/376567).
exec < /dev/null
exec > >(exec cat)
exec 2> >(exec cat >&2)

# Note: exec -a below is a bashism.
# DOCKER SELENIUM NOTE: Strait copy of script installed by Chrome with the exception of adding
# the –no-sandbox flag here.
exec -a “$0” “$HERE/chrome” –no-sandbox “$PROFILE_DIRECTORY_FLAG” \
“$@”
exec -a “$0” /etc/alternatives/google-chrome –no-sandbox “$@”

  • Save this launcher script as google-chrome and replace with google-chrome file in /user/bin/google-chrome or if you have some other location.

Now you should be good to run the headless test in docker or use chrome for any other task.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s