如何在python:3.9-alpine3.13镜像中添加缺失的libpcre3及libpcre3-dev
问题描述
我需要为uWSGI提供PCRE支持,因此计划在基于python:3.9-alpine3.13的Docker镜像中安装libpcre3和libpcre3-dev。以下是我的Dockerfile配置:
FROM python:3.9-alpine3.13 ENV PYTHONUNBUFFERED 1 COPY ./requirements.txt /tmp/requirements.txt COPY ./requirements.dev.txt /tmp/requirements.dev.txt COPY ./scripts /scripts COPY ./app /app WORKDIR /app EXPOSE 8000 ARG DEV=false RUN python -m venv /py && \ /py/bin/pip install --upgrade pip && \ apk add --update --no-cache postgresql-client jpeg-dev libpcre3-dev libpcre3 && \ apk add --update --no-cache --virtual .tmp-build-deps \ build-base postgresql-dev musl-dev zlib zlib-dev linux-headers && \ /py/bin/pip install -r /tmp/requirements.txt && \ if [ $DEV = "true" ]; then /py/bin/pip install -r /tmp/requirements.dev.txt ; \ fi && \ rm -rf /tmp && \ apk del .tmp-build-deps && \ adduser \ --disabled-password \ --no-create-home \ django-user && \ mkdir -p /vol/web/media && \ mkdir -p /vol/web/static && \ chown -R django-user:django-user /vol && \ chmod -R 755 /vol && \ chmod -R +x /scripts ENV PATH="/scripts:/py/bin:$PATH"
执行时出现如下错误:
> [recipe-app-api-app 7/7] RUN python -m venv /py && /py/bin/pip install --upgrade pip && apk add --update --no-cache postgresql-client jpeg-dev libpcre3-dev libpcre3 && apk add --update --no-cache --virtual .tmp-build-deps build-base postgresql-dev musl-dev zlib zlib-dev linux-headers && /py/bin/pip install -r /tmp/requirements.txt && if [ false = "true" ]; then /py/bin/pip install -r /tmp/requirements.dev.txt ; fi && rm -rf /tmp && apk del .tmp-build-deps && adduser --disabled-password --no-create-home django-user && mkdir -p /vol/web/media && mkdir -p /vol/web/static && chown -R django-user:django-user /vol && chmod -R 755 /vol && chmod -R +x /scripts: #0 4.542 Requirement already satisfied: pip in /py/lib/python3.9/site-packages (21.2.4) #0 4.820 Collecting pip #0 4.970 Downloading pip-22.3.1-py3-none-any.whl (2.1 MB) #0 5.584 Installing collected packages: pip #0 5.584 Attempting uninstall: pip #0 5.584 Found existing installation: pip 21.2.4 #0 5.680 Uninstalling pip-21.2.4: #0 5.688 Successfully uninstalled pip-21.2.4 #0 7.017 Successfully installed pip-22.3.1 #0 7.268 fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz #0 7.753 fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz #0 8.331 ERROR: unable to select packages: #0 8.356 libpcre3 (no such package): #0 8.356 required by: world[libpcre3] #0 8.356 libpcre3-dev (no such package): #0 8.356 required by: world[libpcre3-dev] ------ failed to solve: executor failed running [/bin/sh -c python -m venv /py && /py/bin/pip install --upgrade pip && apk add --update --no-cache postgresql-client jpeg-dev libpcre3-dev libpcre3 && apk add --update --no-cache --virtual .tmp-build-deps build-base postgresql-dev musl-dev zlib zlib-dev linux-headers && /py/bin/pip install -r /tmp/requirements.txt && if [ $DEV = "true" ]; then /py/bin/pip install -r /tmp/requirements.dev.txt ; fi && rm -rf /tmp && apk del .tmp-build-deps && adduser --disabled-password --no-create-home django-user && mkdir -p /vol/web/media && mkdir -p /vol/web/static && chown -R django-user:django-user /vol && chmod -R 755 /vol && chmod -R +x /scripts]: exit code: 2
尝试更换包名并搜索资料后仍无法解决,请问有什么办法可以添加这两个包?
解决方案
Alpine Linux的包命名规则和Debian/Ubuntu不同,你要找的PCRE相关包在Alpine仓库里叫pcre(对应Debian系的libpcre3)和pcre-dev(对应Debian系的libpcre3-dev)。
1. 替换包名修改Dockerfile
把Dockerfile中apk add命令里的libpcre3-dev libpcre3替换为pcre pcre-dev即可:
apk add --update --no-cache postgresql-client jpeg-dev pcre pcre-dev && \
2. 优化镜像体积(可选)
pcre-dev是构建依赖,安装完成后可以移除以减少镜像体积。建议将其放到.tmp-build-deps虚拟包组中,调整后的RUN命令如下:
RUN python -m venv /py && \ /py/bin/pip install --upgrade pip && \ apk add --update --no-cache postgresql-client jpeg-dev pcre && \ apk add --update --no-cache --virtual .tmp-build-deps \ build-base postgresql-dev musl-dev zlib zlib-dev linux-headers pcre-dev && \ /py/bin/pip install -r /tmp/requirements.txt && \ if [ $DEV = "true" ]; then /py/bin/pip install -r /tmp/requirements.dev.txt ; \ fi && \ rm -rf /tmp && \ apk del .tmp-build-deps && \ adduser \ --disabled-password \ --no-create-home \ django-user && \ mkdir -p /vol/web/media && \ mkdir -p /vol/web/static && \ chown -R django-user:django-user /vol && \ chmod -R 755 /vol && \ chmod -R +x /scripts
这样执行apk del .tmp-build-deps时会自动移除pcre-dev,只保留uWSGI运行时需要的pcre包。
内容的提问来源于stack exchange,提问作者Nuzulul Aulia
相关产品推荐
相关产品推荐

