【问题标题】:How can I install lxml in docker如何在 docker 中安装 lxml
【发布时间】:2016-06-26 04:31:01
【问题描述】:

我想在docker中部署我的python项目,我在requirments.txt中写了lxml>=3.5.0,因为项目需要lxml。这是我的停靠文件:

FROM gliderlabs/alpine:3.3
RUN set -x \
    && buildDeps='\
        python-dev \
        py-pip \
        build-base \
    ' \
    && apk --update add python py-lxml $buildDeps \
    && rm -rf /var/cache/apk/* \
    && mkdir -p /app
ENV INSTALL_PATH /app
WORKDIR $INSTALL_PATH
COPY requirements-docker.txt ./
RUN pip install -r requirements.txt
COPY . .
RUN apk del --purge $buildDeps
ENTRYPOINT ["celery", "-A", "tasks", "worker", "-l", "info", "-B"]

我在将它部署到 docker 时得到了这个:

*********************************************************************************
Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
*********************************************************************************
error: command 'gcc' failed with exit status 1
----------------------------------------
Rolling back uninstall of lxml

我虽然是因为'python-dev'和'python-lxml',然后我这样编辑了dockfile:

WORKDIR $INSTALL_PATH
COPY requirements-docker.txt ./
RUN apt-get build-dev python-lxml
RUN pip install -r requirements.txt

它不起作用,我得到另一个错误:

---> Running in 73201a0dcd59
/bin/sh: apt-get: not found

如何在 docker 中正确安装 lxml?

【问题讨论】:

标签: python docker lxml dockerfile


【解决方案1】:

我在RUN pip install -r requirements.txt 之前添加了RUN apk add --update --no-cache g++ gcc libxslt-dev,它起作用了。

【讨论】:

  • 只是想补充一点,libxslt-dev的release版本不是必须的,可以libxslt-dev
  • 我认为构建 libxml2 不需要 g++,所以我认为您可以将 g++ 替换为 libc-dev,这样我的容器就会更小。
  • 这是 alpine 上 lxml 的完整工作 Dockerfile gist.github.com/deliro/509b663093ff0f49c1b71e1876597ccb
  • 你为什么使用--no-cache?我想如果是这样我们不想增加图像大小,我们可以用 Docker 缓存它吗?
  • @SeasonedNoob 实际上,我们不想缓存任何东西,因为构建依赖项无论如何都会被删除。
【解决方案2】:

接受的答案不整洁,并安装了多余的软件包。减小图像大小的更好解决方案是:

RUN apk add --no-cache --virtual .build-deps gcc libc-dev libxslt-dev && \
    apk add --no-cache libxslt && \
    pip install --no-cache-dir lxml>=3.5.0 && \
    apk del .build-deps

结果图像大小为 163MB

【讨论】:

  • 感谢@bohdan-sukhov 在我的测试中,我发现您还需要添加包py3-lxml 才能使其工作
  • 您可以使用multi-stage builds,而不是麻烦删除.build-deps,与 /// # install dependencies /// COPY ./requirements.txt 。 /// RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt /// 在第一次构建中,和 /// COPY - -from=builder /usr/src/app/wheels /wheels /// 复制 --from=builder /usr/src/app/requirements.txt 。 /// 运行 pip install --upgrade --no-cache pip /// 运行 pip install --no-cache /wheels/* /// 在最终构建中。
  • 从 274MB 到 63MB :D 谢谢!
【解决方案3】:

由于我使用的是更简单的图像,因此我需要更多的库/应用程序。

这对我有用:

RUN apk add --update --no-cache g++ gcc libxml2-dev libxslt-dev python-dev libffi-dev openssl-dev make

RUN pip install -r requirements.txt

【讨论】:

    【解决方案4】:

    Since only this answer worked 对我来说,我想要一些轻松的东西

    And I liked this answer,但一开始对我不起作用

    我自己编辑了它,最后得到了这个:

    RUN apk add --update --no-cache --virtual .build-deps g++ gcc libxml2-dev libxslt-dev python-dev && \
        apk add --no-cache libxslt && \
        pip install --no-cache-dir lxml>=3.5.0 && \
        apk del .build-deps
    

    最终图像大约 110MB,并且没有任何 libxml 和 libslt 错误

    【讨论】:

      【解决方案5】:

      照着做

      https://hub.docker.com/r/ryanfox1985/docker-couchpotato/builds/boinrrs9dbhnutwjxjw2l8m/

      下载apk并安装

      RUN wget http://nl.alpinelinux.org/alpine/edge/main/x86_64/py-lxml-3.4.0-r0.apk -O /var/cache/apk/py-lxml.apk RUN apk add --allow-untrusted /var/cache/apk/py-lxml.apk

      【讨论】:

      • 只是出于好奇,为什么这个投票如此困难?
      • @digitaldavenyc 我没有投反对票;但是,下载未经身份验证的包并将其作为构建过程的一部分进行安装确实对我来说听起来很可怕。
      【解决方案6】:

      其实只是

      RUN apt-get install -y libxslt1-dev
      

      【讨论】:

      • 他们正在使用 alpine (aka no apt)
      猜你喜欢
      • 2020-11-13
      • 2011-09-24
      • 2016-05-10
      • 2023-03-02
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多