如何在 docker 中安装 lxml

Posted

技术标签:

【中文标题】如何在 docker 中安装 lxml【英文标题】:How can I install lxml in docker 【发布时间】: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?

【问题讨论】:

你用的是alpine,所以可能是apk add而不是apt-get @user2915097 谢谢!我将其更改为apk add python-dev py-lxml,它返回错误:error: command 'gcc' failed with exit status 1。我不知道如何安装 lxml 包名正确pkgs.alpinelinux.org/package/main/x86/py-lxml 似乎在这个 Dockerfile pkgs.alpinelinux.org/package/main/x86/py-lxml 或 hub.docker.com/r/ryanfox1985/docker-couchpotato/builds/… 或 hub.docker.com/r/trcook/docker-scrapy/builds/… 中安装 lxml 很好 【参考方案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)

以上是关于如何在 docker 中安装 lxml的主要内容,如果未能解决你的问题,请参考以下文章

如何在高山容器中安装 Docker?

如何在 sles 12 中安装 docker?

如何在ubunto中安装docker

如何在 Jython 中安装各种 Python 库?

如何在我的 docker 镜像中安装 postgresql?

如何在CentOS6.5系统中安装Docker