Docker部署Django+PostGIS项目启动失败:AttributeError报错求助
问题
Docker启动Django+PostGIS项目时抛出错误:
AttributeError: /usr/lib/libgdal.so.20: undefined symbol: OSRSetAxisMappingStrategy
已尝试更新所有依赖库但无效,使用的Docker配置如下:
FROM python:3.11-buster # Set work directory WORKDIR /app # Install system dependencies RUN apt-get update \ && apt-get install -y \ binutils \ libproj-dev \ gdal-bin \ libgdal-dev \ postgresql-client \ && rm -rf /var/lib/apt/lists/* \ ENV CPLUS_INCLUDE_PATH=/usr/include/gdal ENV C_INCLUDE_PATH=/usr/include/gdal # Install Poetry COPY pyproject.toml poetry.lock* ./ RUN pip install poetry && \ poetry config virtualenvs.create false && \ poetry install --no-dev # Copy the application code COPY . . # Expose ports EXPOSE 8000 EXPOSE 8001 # Run the application ENTRYPOINT ["sh", "-c", "poetry run gunicorn app.wsgi:application --bind 0.0.0.0:8000"]
解决方案
1. 锁定GDAL/Proj版本匹配
该错误源于GDAL与Proj库版本不兼容,OSRSetAxisMappingStrategy是Proj 6+引入的符号,旧版GDAL可能依赖低版本Proj。可在安装时指定兼容的具体版本:
修改Dockerfile中系统依赖安装部分:
RUN apt-get update \ && apt-get install -y \ binutils \ libproj15=6.3.1-1+b2 \ gdal-bin=2.4.0+dfsg-1+b1 \ libgdal20=2.4.0+dfsg-1+b1 \ libgdal-dev=2.4.0+dfsg-1+b1 \ postgresql-client \ && rm -rf /var/lib/apt/lists/*
版本号需与buster源中可用版本匹配,可通过apt-cache show libgdal-dev在buster容器内查询对应版本。
2. 调整依赖安装顺序
修改系统依赖安装顺序,确保Proj先安装,避免版本冲突:
RUN apt-get update \ && apt-get install -y \ binutils \ libproj-dev \ postgresql-client \ && apt-get install -y \ gdal-bin \ libgdal-dev \ && rm -rf /var/lib/apt/lists/*
3. 更换预配置GIS基础镜像
若buster源的GDAL/Proj存在兼容性问题,可使用已预配置兼容环境的GIS镜像作为基础,比如geodata/gdal:3.0-python3:
FROM geodata/gdal:3.0-python3 # Set work directory WORKDIR /app # Install Poetry COPY pyproject.toml poetry.lock* ./ RUN pip install poetry && \ poetry config virtualenvs.create false && \ poetry install --no-dev # Copy the application code COPY . . # Expose ports EXPOSE 8000 EXPOSE 8001 # Run the application ENTRYPOINT ["sh", "-c", "poetry run gunicorn app.wsgi:application --bind 0.0.0.0:8000"]
4. 对齐Python依赖与系统GDAL版本
检查pyproject.toml中的GDAL依赖版本,确保与系统安装的GDAL版本一致。例如系统安装GDAL 2.4,则Python依赖指定对应版本:
[tool.poetry.dependencies] gdal = "~2.4.0"
内容的提问来源于stack exchange,提问作者NIKITOS
相关产品推荐
相关产品推荐

