如何在docker中安装lxml

thi*_*ing 26 python lxml docker dockerfile

我想在docker中部署我的python项目,我在requirments.txt中写道lxml>=3.5.0,因为项目需要lxml.这是我的dockfile:

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"]
Run Code Online (Sandbox Code Playgroud)

当我将它部署到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
Run Code Online (Sandbox Code Playgroud)

我虽然是因为'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
Run Code Online (Sandbox Code Playgroud)

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

---> Running in 73201a0dcd59
/bin/sh: apt-get: not found
Run Code Online (Sandbox Code Playgroud)

如何在docker中正确安装lxml?谢谢

小智 51

RUN apk add --update --no-cache g++ gcc libxslt-dev之前添加了RUN pip install -r requirements.txt它并且它有效.

  • 只是想补充一点,libxslt-dev的发布版本不是必需的,你可以做`libxslt-dev`. (8认同)
  • 我不认为构建libxml2需要g ++所以我认为你可以用libc-dev替换g ++,这会为我带来一个更小的容器. (4认同)
  • 这是高山上lxml的完整工作Dockerfile https://gist.github.com/deliro/509b663093ff0f49c1b71e1876597ccb (2认同)

小智 19

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

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

Run Code Online (Sandbox Code Playgroud)

结果图像大小将 < 163MB

  • 您可以使用[多阶段构建](https://docs.docker.com/develop/develop-images/multistage-build/),而不是费心删除 .build-deps,并使用 /// # install dependency / // 复制 .​​/requirements.txt 。/// RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -rrequirements.txt /// 在第一个构建中,并且 /// COPY - -from=builder /usr/src/app/wheels /wheels /// 复制 --from=builder /usr/src/app/requirements.txt 。/// RUN pip install --upgrade --no-cache pip /// RUN pip install --no-cache /wheels/* /// 在最终版本中。 (3认同)

Rya*_*ine 5

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

这对我有用:

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
Run Code Online (Sandbox Code Playgroud)


use*_*097 -2

做如下

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

  • 只是出于好奇为什么这被否决得如此之难? (6认同)
  • @digitaldavenyc 我没有投反对票;然而,下载未经身份验证的软件包并将其作为构建过程的一部分进行安装对我来说听起来很可怕。 (3认同)