2017-09-11 4 views
0

J'ai récemment appris les bases de Docker et comment créer et exécuter des images. J'essaie de créer une image d'un script python qui récupère certaines pages Web pour les données et les télécharge sur un serveur. J'utilise du sélénium, du chrome et un chromedriver Windows. J'essaie de construire l'image sur mon ordinateur Windows et de pouvoir la déployer sur un tas de serveurs Linux/Windows. Actuellement, je ne construis et ne tourne que sur la même machine Windows, juste jusqu'à ce que je l'exécute, mais je continue d'avoir la même erreur, même si le script tourne très bien directement sur la machine elle-même.OSError: [Errno 8] lors de l'exécution de sélénium en python dans un conteneur docker

C'est l'erreur:

Traceback (most recent call last): 
    File "my-app.py", line 796, in <module> 
    startScraper(); 
    File "my-app.py", line 92, in startScraper 
    browser = webdriver.Chrome(chrome_options = options, executable_path = path_to_chromedriver); 
    File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 62, in __init__ 
    self.service.start() 
    File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/common/service.py", line 74, in start 
    stdout=self.log_file, stderr=self.log_file) 
    File "/usr/local/lib/python3.6/subprocess.py", line 707, in __init__ 
    restore_signals, start_new_session) 
    File "/usr/local/lib/python3.6/subprocess.py", line 1326, in _execute_child 
    raise child_exception_type(errno_num, err_msg) 
OSError: [Errno 8] Exec format error 

Il semble être lié aux options de chrome, mais même si je supprime toutes les options « add-argument », l'erreur persiste, mais voici les options:

options = webdriver.ChromeOptions(); 
options.binary_location = './chrome-win32/chrome.exe'; 
options.add_argument('headless') 
options.add_argument('window-size=1400x1300') 
options.add_argument('--mute-audio') 
options.add_argument('--disable-web-security'); 
options.add_argument('--allow-running-insecure-content'); 
options.add_argument('--ignore-certificate-errors') 
options.add_argument('--ignore-ssl-errors') 
prefs = {"profile.managed_default_content_settings.images":2} 
options.add_experimental_option("prefs", prefs); 
path_to_chromedriver = './chromedriver.exe'; 

Y a-t-il quelque chose qui me manque pour pouvoir utiliser ce grattoir dans un conteneur? Merci!

EDIT: J'ai oublié d'ajouter le Dockerfile et comment je construis/exécuter l'image:

Dockerfile:

FROM python:3.6.0 

WORKDIR /my-app 

ADD . /my-app 

RUN pip install -r requirements.txt 

ENV NAME Scraper 

CMD ["python", "My_App.py"] 

Construire/Exécuter l'image: - docker construire -t monapp - run docker myapp

Peut-être y a-t-il des options que je ne connais pas qui me manquent?

Répondre

0

Vous essayez d'exécuter un exe dans un conteneur Linux et cela ne fonctionnera pas. Vous devrez installer le chrome et chromedriver l'intérieur de votre Dockerfile et mettre à jour le code pour utiliser le bon chemin

FROM python:3.6.0 
RUN apt update && apt install -y chromedriver 
WORKDIR /my-app 
ADD . /my-app 
RUN pip install -r requirements.txt 

ENV NAME Scraper 

CMD ["python", "My_App.py"] 

Changer votre code

options = webdriver.ChromeOptions(); 
options.add_argument('headless') 
options.add_argument('window-size=1400x1300') 
options.add_argument('--mute-audio') 
options.add_argument('--disable-web-security'); 
options.add_argument('--allow-running-insecure-content'); 
options.add_argument('--ignore-certificate-errors') 
options.add_argument('--ignore-ssl-errors') 
prefs = {"profile.managed_default_content_settings.images":2} 
options.add_experimental_option("prefs", prefs); 
path_to_chromedriver = '/usr/lib/chromium/chromedriver';