2
votes

Pipeline Luigi dans Dockerfile; instruction inconnue PYTHONPATH

J'ai ce Dockerfile:

FROM python:3.7
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD [
'PYTHONPATH="."', 'luigi', '--module', 'pipe',
'CreateAndFillIndex',
'--index', 'test',
'--http-auth', 'username:password',
'--host', 'localhost',
'--port', '9200'
 ]

Exécution de docker build -t suggestpipe. && docker run -it suggestpipe avec ce Dockerfile j'obtiens l'erreur:

instruction inconnue: "PYTHONPATH = '.'",

et si je supprime cette instruction , J'obtiens instruction inconnue: "LUIGI", alors qu'est-ce que je fais de mal?

Dans requirements.txt, il y a une dépendance luigi. Et 'PYTHONPATH ='. ' était nécessaire pour exécuter localement en dehors de Docker sur mon Mac, j'ai donc déplacé cette instruction CMD dans le Dockerfile également, mais je ne suis pas sûr d'en avoir besoin. Comment exécuter mon pipeline?


0 commentaires

3 Réponses :


0
votes

L'erreur est assez claire: instruction inconnue: "'PYTHONPATH ='. '",

Vous avez ajouté des graduations inutiles (') avant et après PYTHONPATH =, qui est considéré comme une sortie de commande capturant dans les termes du shell. Supprimez les coches inutiles et cela devrait fonctionner.


1 commentaires

Désolé, c'était juste un mauvais copier-coller. Avec 'PYTHONPATH = "."', 'Luigi', '--module', 'pipe', j'obtiens toujours la même erreur



3
votes

La syntaxe Dockerfile n'est pas réellement JSON, et vous ne pouvez pas avoir de saut de ligne après le [. Docker en effet réécrit ceci en

ENV PYTHONPATH .

(ce qui serait en fait valide! Vous avez probablement un binaire / bin / [! Mais le conteneur se fermerait immédiatement avec le code d'état 0.)

puis passe à la ligne suivante

CMD ["luigi", ...]

où cela devient confus car cela ne ressemble pas réellement à une directive Dockerfile.

Le simple fait de supprimer cette nouvelle ligne seule ne vous amène qu'à mi-chemin. Si vous exécutez

CMD ["PYTHONPATH='.'", "luigi", ...]

Docker ne lancera pas de shell pour essayer de l'exécuter; à la place, il recherchera un binaire nommé exactement PYTHONPATH = '.' dans les répertoires habituels, et quand il ne trouve pas par exemple / usr / bin / PYTHONPATH = '.' ça va se plaindre.

Vous ne devriez pas du tout avoir à définir cette variable d'environnement (d'autant plus que l'étape pip install installera les packages dans l'installation globale isolée de Python de l'image), et je la supprimerais simplement:

"PYTHONPATH='.'", "luigi", "--module", "pipe",

Si vous avez besoin de le définir, vous devez utiliser une directive ENV explicite

CMD ["/bin/sh", "-c", "["]


2 commentaires

(Cela ne fait pas partie de cette réponse, mais l'option --host localhost me rend nerveux; je suppose que cela impliquera que le processus sera inaccessible en dehors du conteneur, s'il définit l'adresse de liaison, et vous devez toujours le définir sur 0.0.0.0 dans Docker.)


Merci; avec ENV = ... ça marche maintenant. J'obtiens toujours l'erreur que luigi est inconnu, mais c'est parce que j'ai oublié de démarrer le luigi-daemon, je vais chercher moi-même comment le réparer. Le paramètre localhost n'est qu'un mannequin, plus tard, une variable d'environnement y ira et référencera un point de terminaison elasticsearch dans un cloud. comme pour le luigi-daemon je transmettrai son port quand le Dockerfile fonctionnera en général



1
votes

Cela est dû à la manière dont vous fournissez l'instruction CMD. Vous utilisez actuellement le formulaire exec, mais vous vous appuyez sur le comportement du shell. Vous trouverez des détails à ce sujet dans la documentation Dockerfile sur l'instruction CMD .

Le correctif est de le convertir au format shell comme ceci:

ENV PYTHONPATH=.
CMD [ "luigi", "--module", "pipe", 'CreateAndFillIndex', '--index', 'test', '--http-auth', 'username:password', '--host', 'localhost', '--port', '9200' ]

Vous pouvez également définir la variable d'environnement en utilisant l'instruction ENV ( documentation )

CMD PYTHONPATH='.' luigi --module pipe CreateAndFillIndex --index test --http-auth username:password --host localhost --port 9200


0 commentaires