【问题标题】:AttributeError: /usr/lib/libgdal.so.1: undefined symbol: OGR_F_GetFieldAsInteger64 While installing in DockerAttributeError: /usr/lib/libgdal.so.1: undefined symbol: OGR_F_GetFieldAsInteger64 在 Docker 中安装时
【发布时间】:2020-04-06 03:30:12
【问题描述】:

使用 postgres db 在 docker 上安装 GeoDjango 时出错。

我对 docker 完全陌生,我正在 docker 上设置我的项目。我不知道,这个错误是关于 django 还是 postgres 的。

发现这个错误

AttributeError: /usr/lib/libgdal.so.1: 未定义符号: OGR_F_GetFieldAsInteger64 在 Docker 中安装时

docker-compose.yml

version: '3'
services:
        postgres:
                restart: always
                image: postgres:alpine
                volumes:
                        - ./postgres_gis/gis_db:/home/dev/gis_db.sql
                environment:
                        POSTGRES_USER: postgres
                        POSTGRES_PASSWORD: Dev@mishra123
                        POSTGRES_DB: gis_db
                expose:
                        - "5432"
        web:
                build: ./HomePage
                restart: always
                expose:
                        - "8000"
                volumes:
                        - ./HomePage:/home/dev/app/HomePage
                depends_on:
                        - postgres
                environment:
                        - DEBUG=1

网络/Dockerfile

from python:3.6.2-slim
RUN groupadd dev && useradd -m -g dev -s /bin/bash dev
RUN echo "dev ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
RUN mkdir -p /home/dev/app/HomePage
RUN chown -R dev:dev /home/dev/app
RUN chmod -R +x+r+w /home/dev/app
WORKDIR /home/dev/app/HomePage
RUN apt-get update && apt-get -y upgrade
COPY requirements.txt /home/dev/app/HomePage
RUN apt-get install -y python3-dev python3-pip
RUN apt-get install -y libpq-dev
RUN apt-get install -y binutils libproj-dev gdal-bin
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
COPY ./docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
USER dev
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

web/docker-entrypoint.sh

#!/bin/sh
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8000

docker-compose ps:

root@BlackCat:/home/dev/Project-EX/django-PR# docker-compose up      
Starting django-pr_postgres_1 ... done
Starting django-pr_web_1      ... done
Attaching to django-pr_postgres_1, django-pr_web_1
postgres_1  | 2019-12-12 16:34:43.907 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1  | 2019-12-12 16:34:43.908 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1  | 2019-12-12 16:34:44.099 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1  | 2019-12-12 16:34:44.672 UTC [18] LOG:  database system was shut down at 2019-12-11 18:45:45 UTC
postgres_1  | 2019-12-12 16:34:44.912 UTC [1] LOG:  database system is ready to accept connections
web_1       | Traceback (most recent call last):
web_1       |   File "manage.py", line 22, in <module>
web_1       |     execute_from_command_line(sys.argv)
web_1       |   File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
web_1       |     utility.execute()
web_1       |   File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 377, in execute
web_1       |     django.setup()
web_1       |   File "/usr/local/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
web_1       |     apps.populate(settings.INSTALLED_APPS)
web_1       |   File "/usr/local/lib/python3.6/site-packages/django/apps/registry.py", line 114, in populate
web_1       |     app_config.import_models()
web_1       |   File "/usr/local/lib/python3.6/site-packages/django/apps/config.py", line 211, in import_models
web_1       |     self.models_module = import_module(models_module_name)
web_1       |   File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
web_1       |     return _bootstrap._gcd_import(name[level:], package, 
web_1       |     func = self.__getitem__(name)
web_1       |   File "/usr/local/lib/python3.6/ctypes/__init__.py", line 366, in __getitem__
web_1       |     func = self._FuncPtr((name_or_ordinal, self))
web_1       | AttributeError: /usr/lib/libgdal.so.1: undefined symbol: OGR_F_GetFieldAsInteger64
web_1       | Watching for file changes with StatReloader

【问题讨论】:

标签: c++ django postgresql docker gdal


【解决方案1】:

您遇到的问题是您的 GDAL 版本太旧。您的Dockerfile 是基于python:3.6.2-slim 构建的,它基于Debian Jessie,并安装gdal 版本1.10.1OGR_F_GetFieldAsInteger64 变量为 introduced in v. 2.0.0

根据 debian.org 上的 GDAL package page,您需要更新版本的 Debian(stretch、buster、bullseye 都可以)。因此,我建议您将Dockerfile 更改为使用python:3.8.0-slim-buster 或更新版本。请查看hub.docker.com python 页面了解更多信息

此外,正如 cmets 中所述,您的 Dockerfile 应该只有 CMDENTRYPOINT 之一,但不能同时拥有两者。由于您的 entrypoint.sh 做了 CMD 所做的事情等等,我将删除 CMD 并坚持使用 ENTRYPOINT

披露:我为EnterpriseDB (EDB)工作

【讨论】:

  • 这是一个非常有帮助的答案,它也解决了我的问题。
  • 任何使用 Jessie 运行时的解决方案?请?我正在谷歌云中部署,他们的图像基于 Jessie。
  • 如果一定要用Jessie,我觉得需要自己编译gdal(github.com/OSGeo/gdal)
猜你喜欢
  • 2017-05-22
  • 2014-02-26
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多