Download the
Dockerfile and the script
chromewrapper.sh
this is the dockerfile:
FROM ubuntu:18.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install --no-install-recommends -y xorg wget
RUN wget 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 -rf /var/lib/apt/lists/*
ENTRYPOINT ["google-chrome", "--no-sandbox", "--user-data-dir=/config/google-chrome"]
this is the script:
#!/bin/bash
#this script runs chrome inside docker and pipes it out of your local x11 server it also enables GPU access so that chrome can use the host gpu
xhost +local:docker
docker run -it --rm --name=chrome --net=host --shm-size 1GB --security-opt no-new-privileges --tmpfs /tmp:size=8k --volume=/tmp/.X11-unix:/tmp/.X11-unix:rw --volume=$HOME/.config/google-chrome:/config/google-chrome:rw --device /dev/snd --device /dev/dri --env="DISPLAY=$DISPLAY" --env="GPU_USE_SYNC_OBJECTS=1" chromewrapper:v0.0.1
xhost -local:docker
The following is a detailed explanation of the previous dockerfile and it's accompanying script.
The descriptions are
Under the code outline
FROM ubuntu:18.04
The base image is the latest version of Ubuntu, version 18.04.
ARG DEBIAN_FRONTEND=noninteractive
This line tells the Dockerfile that the following command should use a non-interactive frontend so that it doesn't prompt for input.
RUN apt-get update
RUN apt-get install --no-install-recommends -y xorg wget
These lines update the package list and install the Xorg windowing system and the wget utility.
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN apt-get install -y ./google-chrome-stable_current_amd64.deb
These lines download the latest stable version of Google Chrome for 64-bit systems and install it using the apt package manager.
RUN rm -rf /var/lib/apt/lists/*
This line removes the package list cache to reduce the image size.
ENTRYPOINT ["google-chrome", "--no-sandbox", "--user-data-dir=/config/google-chrome"]
This line sets the entrypoint for the container to the Google Chrome executable with the sandboxing feature disabled and the user data directory set to a location in the container where it can be persisted.
#!/bin/bash
This line tells the script that it is a Bash script and should be executed by the Bash interpreter.
The second line is a comment describing what the script does.
xhost +local:docker
docker run -it --rm --name=chrome --ipc="host" --net=host --shm-size 1GB --security-opt no-new-privileges --tmpfs /tmp:size=8k --volume=/tmp/.X11-unix:/tmp/.X11-unix:rw --volume=$HOME/.config/google-chrome:/config/google-chrome:rw --device /dev/snd --device /dev/dri --env="DISPLAY=$DISPLAY" --env="GPU_USE_SYNC_OBJECTS=1" chromewrapper:v0.0.1
xhost -local:docker
This line runs the chrome container created in the previous step with several options.
The first option
--name=chrome
gives the container a name so that it can be easily referenced by other commands.
The Between First and Second option
--ipc="host"
fixes the browser crashing because of "Received unexpected number of handles" issue.
The second option
--net=host
tells Docker to use the host's networking stack instead of creating a new network stack for the container.
This is necessary so that the container can connect to the host's X11 server.
The third option
--shm-size 1GB
sets the size of the shared memory segment for the container to 1GB.
This is necessary because Chrome uses a lot of memory and the default shared memory segment size is not enough.
The fourth option
--security-opt no-new-privileges
tells Docker not to give the container any new privileges that it doesn't already have.
This is a security measure to prevent privilege escalation attacks.
The fifth option
--tmpfs /tmp:size=100m
creates a tmpfs filesystem in the container at the /tmp directory with a size of 100m.
The sixth option
--volume=/tmp/.X11-unix:/tmp/.X11-unix:rw
mounts the host's X11 socket into the container so that Chrome can connect to it.
The seventh option
--volume=$HOME/.config/google-chrome:/config/google-chrome:rw
mounts the host's Chrome user data directory into the container so
that changes made in Chrome are persisted on the host.
The eighth option
--device /dev/snd
gives the container access to the host's sound devices so that Chrome can play audio.
The ninth option
--device /dev/dri
gives the container access to the host's GPU so that Chrome can use hardware acceleration.
The tenth option
--env="DISPLAY=$DISPLAY"
sets the DISPLAY environment variable in the container to point to the host's X11 server.
The eleventh option
--env="GPU_USE_SYNC_OBJECTS=1"
enables Chrome's GPU process to use synchronization objects which are necessary for proper GPU acceleration.
The final option is the name of the container image to use. In this case, it is chromewrapper:v0.0.1 which is the name of the container image created in the previous step.