Skip to content

Installing Google Chrome in Docker Containers

Problem Statement

When installing Google Chrome in Docker containers using direct .deb package downloads, many developers encounter dependency issues that halt the build process. The common approach of:

bash
RUN wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb
RUN apt -f install -y

Fails during Docker builds because dpkg -i exits with a non-zero status code when encountering missing dependencies, causing the Docker build to stop immediately, even though apt -f install would normally resolve these issues in an interactive session.

Method 1: Install .deb Package Using apt-get

The simplest solution is to use apt-get install instead of dpkg -i to handle the downloaded package, as it automatically resolves dependencies:

dockerfile
RUN apt-get update && apt-get install -y wget
RUN wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN apt-get install -y ./google-chrome-stable_current_amd64.deb

Method 2: Add Google Chrome Repository

For a more maintainable approach, add Google's official repository and install from there:

dockerfile
# Install required tools first
RUN apt-get update && apt-get install -y wget gnupg

# Add Google Chrome repository
RUN wget -q -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.list

# Install Chrome
RUN apt-get update && apt-get -y install google-chrome-stable

For testing frameworks like Selenium or Puppeteer, use Google's Chrome for Testing:

dockerfile
# Fetch and install latest stable Chrome version
RUN CHROME_VERSION=$(curl -sSL https://googlechromelabs.github.io/chrome-for-testing/ | awk -F 'Version:' '/Stable/ {print $2}' | awk '{print $1}' | sed 's/<code>//g; s/<\/code>//g') \
    && CHROME_URL="https://storage.googleapis.com/chrome-for-testing-public/${CHROME_VERSION}/linux64/chrome-linux64.zip" \
    && echo "Fetching Chrome version: ${CHROME_VERSION}" \
    && curl -sSL ${CHROME_URL} -o /tmp/chrome-linux64.zip \
    && mkdir -p /opt/google/chrome \
    && unzip -q /tmp/chrome-linux64.zip -d /opt/google/chrome \
    && rm /tmp/chrome-linux64.zip

Complete Dockerfile Examples

Basic Ubuntu Installation

dockerfile
FROM ubuntu:22.04

# Install Chrome with repository approach
RUN apt-get update && apt-get install -y wget gnupg
RUN wget -q -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.list
RUN apt-get update && apt-get -y install google-chrome-stable

# Verify installation
RUN echo "Chrome: " && google-chrome --version

Node.js with Chrome for Selenium

dockerfile
FROM node:18

# Install Chrome dependencies
RUN apt-get update && apt-get install -y \
    wget \
    libgtk-3-dev \
    libnotify-dev \
    libgconf-2-4 \
    libnss3 \
    libxss1 \
    libasound2 \
    libxtst6 \
    fonts-liberation

# Install Chrome
RUN wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN apt-get install -y ./google-chrome-stable_current_amd64.deb
RUN rm google-chrome-stable_current_amd64.deb

# Verify installation
RUN echo "Chrome version: " && google-chrome --version

Chrome Sandbox Considerations

For security reasons, Chrome typically runs with the --no-sandbox flag in Docker containers. For better security, create a dedicated user:

dockerfile
# Add user to avoid --no-sandbox flag
RUN groupadd -r chromeuser && useradd -r -g chromeuser -G audio,video chromeuser \
    && mkdir -p /home/chromeuser/Downloads \
    && chown -R chromeuser:chromeuser /home/chromeuser

USER chromeuser

Common Issues and Troubleshooting

Missing Dependencies

If you encounter missing dependency errors, ensure all required libraries are installed:

dockerfile
# Common Chrome dependencies
RUN apt-get update && apt-get install -y \
    libnss3 \
    libxss1 \
    libasound2 \
    libxtst6 \
    libgtk-3-0 \
    libgbm1 \
    libxshmfence1 \
    ca-certificates \
    fonts-liberation \
    xdg-utils

GPG Key Issues

If repository installation fails due to GPG key issues, use this alternative approach:

dockerfile
# Alternative GPG key installation
RUN mkdir -p /etc/apt/keyrings
RUN wget -q -O /etc/apt/keyrings/google-chrome.gpg https://dl.google.com/linux/linux_signing_key.pub
RUN echo "deb [signed-by=/etc/apt/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list

Best Practices

  1. Always combine apt-get commands to reduce layer size:

    dockerfile
    RUN apt-get update && apt-get install -y \
        wget \
        gnupg \
        && rm -rf /var/lib/apt/lists/*
  2. Clean up downloaded packages to minimize image size:

    dockerfile
    RUN wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
        && apt-get install -y ./google-chrome-stable_current_amd64.deb \
        && rm google-chrome-stable_current_amd64.deb
  3. Use specific versions for production stability when using the testing version approach.

Version Verification

Always verify Chrome installation with:

dockerfile
RUN echo "Chrome version: " && google-chrome --version

By following these methods, you can reliably install Google Chrome in Docker containers without encountering dependency issues during the build process.