【问题标题】:How to install awscli using pip in library/node Docker image如何在库/节点 Docker 映像中使用 pip 安装 awscli
【发布时间】:2017-09-04 14:11:36
【问题描述】:

我正在尝试使用pip(根据亚马逊的建议)在FROM library/node:6.11.2 提供的自定义Docker 映像中安装awscli。这是一个再现:

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"]

但是,我遇到了上述情况:

no such option: --no-cache-dir

大概是因为我的 Python 和/或 Pip 版本不正确?

我正在以与FROM maven:3.5.0-jdk-8 类似的方式安装 Python、Pip 和 awscli,它工作得很好。我不确定两张图片之间的相关差异是什么。

从我的 Dockerfile 中删除上述选项对我也没有多大好处,因为我遇到了一大堆不同的错误,摘录在这里:

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 ###

底线:如何在基于library/node:6.x 的图像中正确安装awscli

【问题讨论】:

    标签: python amazon-web-services docker pip


    【解决方案1】:

    按照this other answer 添加python-dev 是可行的,但会引发数量惊人的编译器警告(错误?),所以我选择了@SergeyKoralev's answer 的变体,它需要一些调整才能起作用。

    这是我完成这项工作所需的更改:

    1. 在各处更改为 python3pip3
    2. 添加声明以升级pip 本身。
    3. 在单独的 RUN 命令中单独安装 awscli

    这是一个完整的再现,确实似乎有效:

    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"]
    

    如果您在安装之前添加一个 shell 命令以在升级 pip 后刷新内容,您也可以将 aws 安装保留在同一 RUN 层中。不知道如何。

    【讨论】:

    【解决方案2】:

    所有答案都是关于 aws-cli 版本 1,如果您想要版本 2,请尝试以下

    FROM node:lts-stretch-slim
    
    RUN apt-get update && \
        apt-get install -y \
            unzip \
            curl \
        && apt-get clean \
        && curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
        && unzip awscliv2.zip \
        && ./aws/install \
        && rm -rf \
            awscliv2.zip \
        && apt-get -y purge curl \
        && apt-get -y purge unzip 
    
    CMD ["/bin/bash"]
    

    【讨论】:

    • 这很清楚。
    【解决方案3】:

    正如您正确指出的,在您使用的 docker 映像上安装 pip 是不支持 --no-cache-dir 的旧版本。您可以尝试更新它,或者您也可以解决第二个问题,即缺少 python 源头文件。这可以通过安装python-dev 包来解决。只需将其添加到 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"]
    

    然后您可以运行aws,它应该在您的路径上。

    【讨论】:

    • 这给出了惊人数量(数十个)的警告(或错误?),尽管在构建图像时,这些不是相关的吗?
    【解决方案4】:

    您的映像基于 Debian Jessie,因此您正在安装 Python 2.7。尝试使用 Python 3.x:

    apt-get install -y python3-pip
    pip3 install awscli
    

    【讨论】:

    • 感谢您的回复,但我无法使其正常工作。你能告诉我我的 Dockerfile 应该如何更新吗?我尝试了几种变体,包括在我的文件中的任何地方都用“python3”替换“python”(以及用“pip3”替换“pip”),但错误仍然存​​在......
    • 这个构建没有任何问题:pastebin.com/LPPJfgry 你确定你看到错误信息吗? PyYAML 会输出大量编译代码,但 Docker 最终会构建镜像而不会出现任何错误。我正在使用 Docker 版本 17.06.0-ce,构建 02c1d87。
    • 您的 pastebin 与我的问题以及您的答案不同?它包含 python3-dev 行(不在您的答案中,但 isother 答案中),并且您已删除我的 --no-cache-dir 指令。只有您在 answer 中提到的更改(因此 保留 我想保留的指令),事情将无法正常工作。 pastebin.com/UwyY53Pv
    • 再次感谢您的建议,经过一些调整,我让它工作了。
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2018-05-31
    • 2019-09-19
    相关资源
    最近更新 更多