web-dev-qa-db-fra.com

Comment installer awscli en utilisant pip dans l'image Docker de la bibliothèque / du nœud

J'essaie d'installer awscli en utilisant pip (selon les recommandations d'Amazon) dans une image Docker personnalisée qui vient FROM library/node:6.11.2. Voici une repro:

FROM library/node:6.11.2

RUN apt-get update && \
    apt-get install -y \
        python \
        python-pip \
        python-setuptools \
        groff \
        less \
    && pip --no-cache-dir install --upgrade awscli \
    && apt-get clean

CMD ["/bin/bash"]

Cependant, avec ce qui précède, je rencontre:

no such option: --no-cache-dir

Vraisemblablement parce que j'ai des versions incorrectes de Python et/ou Pip?

J'installe Python, Pip et awscli de manière similaire avec FROM maven:3.5.0-jdk-8 et là ça marche très bien. Je ne sais pas quelles sont les différences pertinentes entre les deux images.

Supprimer cette option de mon Dockerfile ne me fait pas beaucoup de bien non plus, car alors je rencontre un tas d'erreurs différentes, un extrait ici:

Installing collected packages: awscli, PyYAML, docutils, rsa, colorama, botocore, s3transfer, pyasn1, jmespath, python-dateutil, futures, six
  Running setup.py install for PyYAML
    checking if libyaml is compilable
### ABBREVIATED ###
    ext/_yaml.c:4:20: fatal error: Python.h: No such file or directory
     #include "Python.h"
                        ^
    compilation terminated.
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
### ABBREVIATED ###

Conclusion: comment installer correctement awscli dans library/node:6.x images basées?

10
Jeroen

Ajouter python-dev selon cette autre réponse fonctionne, mais lance un nombre alarmant d'avertissements du compilateur (erreurs?), donc je suis allé avec une variation de @ réponse de SergeyKoralev , qui avait besoin de quelques peaufiner avant que cela fonctionne.

Voici les changements dont j'avais besoin pour que cela fonctionne:

  1. Passez à python3 et pip3 partout.
  2. Ajoutez une instruction pour mettre à niveau pip lui-même.
  3. Séparez l'installation de awscli dans une commande RUN distincte.

Voici une repro complète qui semble fonctionner:

FROM library/node:6.11.2

RUN apt-get update && \
    apt-get install -y \
        python3 \
        python3-pip \
        python3-setuptools \
        groff \
        less \
    && pip3 install --upgrade pip \
    && apt-get clean

RUN pip3 --no-cache-dir install --upgrade awscli

CMD ["/bin/bash"]

Vous pouvez probablement également conserver l'installation de aws dans la même couche RUN si vous ajoutez une commande Shell avant l'installation qui actualise les choses après la mise à niveau de pip. Je ne sais pas comment.

16
Jeroen

Comme vous l'avez correctement indiqué, pip l'installation sur l'image de docker que vous utilisez est une ancienne qui ne prend pas en charge --no-cache-dir. Vous pouvez essayer de mettre à jour cela ou vous pouvez également résoudre le deuxième problème qui concerne les en-têtes source manquants python. Cela peut être résolu en installant python-dev paquet. Ajoutez simplement cela à la liste des packages installés dans le Dockerfile:

FROM library/node:6.11.2

RUN apt-get update && \
    apt-get install -y \
        python \
        python-dev \
        python-pip \
        python-setuptools \
        groff \
        less \
    && pip install --upgrade awscli \
    && apt-get clean

CMD ["/bin/bash"]

Vous pouvez ensuite exécuter aws qui devrait se trouver sur votre chemin.

4
tayfun

Votre image est basée sur Debian Jessie, vous installez donc Python 2.7. Essayez d'utiliser Python 3.x:

apt-get install -y python3-pip
pip3 install awscli
3
Sergey Kovalev