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?
3 Réponses :
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.
Désolé, c'était juste un mauvais copier-coller. Avec 'PYTHONPATH = "."', 'Luigi', '--module', 'pipe',
j'obtiens toujours la même erreur
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", "["]
(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
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