Setup Chrome in Docker

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 – | apt-key add – \
    && echo “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/$CHROME_DRIVER_VERSION/ \
    && rm -rf /opt/selenium/chromedriver \
    && unzip /tmp/ -d /opt/selenium \
    && rm /tmp/ \
    && 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)


# 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.
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
elif which xmessage &> /dev/null; then
exit 1

# 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”
# 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.
mkdir -p “$xdg_app_dir”
[ -f “$xdg_app_dir/mimeapps.list” ] || touch “$xdg_app_dir/mimeapps.list”

# Always use our versions of ffmpeg libs.
# This also makes RPMs find the compatibly-named library symlinks.
if [[ -n “$LD_LIBRARY_PATH” ]]; then

export CHROME_VERSION_EXTRA=”stable”

# We don’t want bug-buddy intercepting our crashes.

# 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

# Make sure that the profile directory specified in the environment, if any,
# overrides the default.
if [[ -n “$CHROME_USER_DATA_DIR” ]]; then

# Sanitize std{in,out,err} because they’ll be shared with untrusted child
# processes (
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.

Leave a Reply

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

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

Google photo

You are commenting using your Google 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 )

Connecting to %s