Mon problème est de savoir comment exécuter Google Chrome dans le conteneur Docker pour les tests e2e . Je crée une Dockerfile
à partir de l'image officielle de Jenkins, mais lorsque vous essayez d'exécuter Google Chrome, il se bloque et affiche 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 menu fixe Jenkins utilise Debian jessie
.
Je peux exécuter Google Chrome avec l'indicateur --headless
et le serveur X n'est pas nécessaire.
Ceci est mon fichier docker:
Image officielle Jenkins:
Le repo une personne exécute Google Chrome avec une interface graphique de docker:
Ma première approche consiste à utiliser xvbf
, mais le processus est plus simple lorsqu'il utilise l'indicateur --headless
.
Je peux exécuter chrome sur le serveur Ubuntu avec les mêmes commandes d'installation, mais cela échoue dans le menu fixe.
Après d’autres intentions, j’ai utilisé le drapeau --no-sandbox
, mais les images du menu fixe affichent 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
Il suffit de lancer chrome avec --no-sandbox
qui résout le problème
Utiliser cette image alpeware/chrome-headless-trunk
a fonctionné pour moi dans ubuntu! La commande utilisée dans ce conteneur pour lancer le chrome sans tête est la suivante:
/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 en 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
puis utilisé Chrome pour se connecter au port de débogage à localhost:9222
Avec quelques modifications, vous pourriez probablement le faire tourner dans Jenkins!
ajouter
--cap-add SYS_ADMIN
pour exécuter la commande docker
ex:
docker run --rm -p=81:81 -d -v $(pwd)/src:/opt/code --name chrome_test --cap-add=SYS_ADMIN test/chrome_iso
J'étends par défaut Dockerfile Selenium Chrome Node en suivant
FROM Selenium/standalone-chrome-debug:latest
MAINTAINER Serge Arbuzov <[email protected]>
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"]
Et mon run.sh est
#!/bin/bash
Xvfb :1 -screen 5 1024x768x8 &
/usr/sbin/sshd -D
Je peux donc utiliser l'image par défaut comme noeud Jenkins
Cet article est exactement ce dont j'avais besoin pour exécuter les tests Karma avec Headless Chrome à l'intérieur du menu fixe:
https://hackernoon.com/running-karma-tests-with-headless-chrome-inside-docker-ae4aceb06ed3
Fondamentalement, la solution consiste à exécuter Headless Chrome avec l'indicateur --no-sandbox
.
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 tester automatiquement mon application Web dans Chrome
J'espère que ça aide
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 l'utilisons comme solution de remplacement pour PhantomJS dans nos configurations docker-compose.yml
. L'image est basée sur Alpine Linux et ne nécessite ni n'inclut Selenium, donc elle est plutôt petite.
Source: https://github.com/retreatguru/headless-chromedriver
Docker Hub: https://hub.docker.com/r/retreatguru/headless-chromedriver