Comment exécuter Google chrome headless dans docker?
mon problème est de savoir comment exécuter google chrome dans le conteneur docker pour les tests e2e.
J'ai créer un Dockerfile
à partir de officiel Jenkins image, mais lorsque vous essayez d'exécuter google chrome, il se bloque et montrer l'erreur:
Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted
Trace/breakpoint trap (core dumped)
L'image du docker de Jenkins utilise Debian jessie
.
je peux lancer google chrome avec --headless
drapeau et le serveur X n'est pas nécessaire.
C'est mon docker fichier:
- https://github.com/ripper2hl/jenkinswithchrome
Jenkins image officielle:
- https://github.com/jenkinsci/docker
La mise en pension d'une personne fonctionne google chrome avec une interface graphique à partir de docker:
- https://github.com/jessfraz/dockerfiles/blob/master/chrome/stable/Dockerfile
Ma première approche est d'utiliser xvbf
, mais le processus est plus simple quand utilisé --headless
drapeau.
- https://gist.github.com/addyosmani/5336747
je peux lancer chrome dans Ubuntu server avec les mêmes commandes pour l'installation, mais dans docker il échoue.
Après les autres intentions, j'ai utilisé --no-sandbox
drapeau, mais docker images montre l'erreur suivante.
[0427/180929.595479:WARNING:audio_manager.cc(295)] Multiple instances of AudioManager detected
[0427/180929.595537:WARNING:audio_manager.cc(254)] Multiple instances of AudioManager detected
libudev: udev_has_devtmpfs: name_to_handle_at on /dev: Operation not permitted
en fait j'ai lancé cette commande:
google-chrome-stable --headless --disable-gpu --no-sandbox http://www.google.com
7 réponses
il suffit de lancer chrome avec --no-sandbox
qui s résout le problème
ajouter
-- cap-add SYS_ADMIN
pour le panneau de commande d'exécution
ex:
docker run --rm -p=81:81 -d -v $(pwd)/src:/opt/code --name chrome_test --cap-add=SYS_ADMIN test/chrome_iso
en utilisant cette image
/usr/bin/google-chrome-unstable \
--disable-gpu --headless --no-sandbox \
--remote-debugging-address=0.0.0.0 \
--remote-debugging-port=9222 --user-data-dir=/data
voici une courte vidéo du conteneur dans l'action
j'ai lancé le conteneur dans Ubuntu avec cette commande:
docker run -it --rm -p=0.0.0.0:9222:9222 \
--name=chrome-headless \
-v /tmp/chromedata/:/data alpeware/chrome-headless-trunk
ensuite utilisé Chrome pour se connecter au port de débogage à localhost:9222
Avec quelques modifications, vous pourriez probablement obtenir ce fonctionnement en Jenkins!
Sources
Je n'ai pas la réponse mais je connais un conteneur qui lance avec succès un Chrome sans tête dans Docker. Le sélénium:
je l'utilise pour les tests automatisés de ma webapp en Chrome
j'Espère que ça aide
j'étend le fichier Dockerfile par défaut Sélénium Chrome Nœud par
FROM selenium/standalone-chrome-debug:latest
MAINTAINER Serge Arbuzov <Serge.Arbuzov@advantechwireless.com>
USER root
### jenkins set up ###
RUN apt-get update && apt-get install -y openssh-server sudo
RUN mkdir /var/run/sshd
RUN adduser jenkins
RUN echo jenkins:jenkins | chpasswd
RUN echo "jenkins ALL=(ALL) NOPASSWD:ALL">>/etc/sudoers
USER root
RUN echo export DISPLAY=":1.5" >> /etc/environment
ADD run.sh /run.sh
RUN chmod +x /run.sh
EXPOSE 22
CMD ["/run.sh"]
#!/bin/bash
Xvfb :1 -screen 5 1024x768x8 &
/usr/sbin/sshd -D
donc je peux utiliser l'image par défaut comme noeud Jenkins
nous avons construit une image Docker avec Chrome et Chromedriver qui exécute Chrome en mode sans tête pour des tests automatisés. Nous nous en servons pour remplacer PhantomJS dans notre docker-compose.yml
configurations. L'image est basée sur Alpine Linux et n'a pas besoin ou inclure le sélénium donc il est assez petit.
Source: https://github.com/retreatguru/headless-chromedriver
Docker Hub: https://hub.docker.com/r/retreatguru/headless-chromedriver
Cet article est exactement ce que je nécessaire à l'exécution de Karma tests avec Tête Chromée à l'intérieur de docker:
https://hackernoon.com/running-karma-tests-with-headless-chrome-inside-docker-ae4aceb06ed3
en gros, la solution est de lancer le Chrome sans tête avec le --no-sandbox
drapeau.