代码之家  ›  专栏  ›  技术社区  ›  Merkidemis

Python:3.7-stretch unixodbc:冲突:unixodbc bin

  •  0
  • Merkidemis  · 技术社区  · 5 年前

    我有一个Python Flask应用程序在Docker容器中运行,它通过SQLAlchemy连接到mssqlserver(一个公司数据库)。但是,当我尝试构建容器时,会遇到包冲突。这是我的Dockerfile:

    FROM python:3.7-stretch
    
    # Get the ODBC driver for Microsoft SQL Server
    RUN apt-get update \
    && apt-get install -y \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg \
    && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/9/prod.list  > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update \
    && ACCEPT_EULA=Y apt-get -y install --no-install-recommends msodbcsql17 \
        unixodbc \
        unixodbc-bin \
        unixodbc-dev \
    && apt-get clean
    
    # Setup the project
    RUN mkdir -p /app
    WORKDIR /app
    
    COPY . .
    
    RUN python setup.py install
    
    CMD [ '/bin/bash' ]
    

    当我建立这个,我得到:

     unixodbc : Conflicts: unixodbc-bin (< 2.3.7) but 2.3.0-4+b1 is to be installed
    

    据我的构建日志所知,这是在2019年2月25日,但有可能是使用了缓存的映像。

    我曾尝试使用库的特定版本来避免此问题:

    && ACCEPT_EULA=Y apt-get -y install --no-install-recommends msodbcsql17=17.2.0.1-1 \
        unixodbc=2.3.4-1 \
        unixodbc-bin=2.3.0-4+b1 \
        unixodbc-dev=2.3.4-1 \
        libodbc1=2.3.4-1 \
        odbcinst1debian2=2.3.4-1 \
        odbcinst=2.3.4-1 \
    && apt-get clean
    

    这样就可以构建容器了——没有缓存,但是当应用程序试图连接到数据库时,它就会永远挂起。我也用过 msodbcsql17=17.1.0.1-1 得到同样的结果。

    这是我的应用程序设置.py:

    from setuptools import setup, find_packages
    
    setup(name='catfnolbackend',
          version='0.1.0',
          packages=find_packages(),
          package_dir={'catfnolbackend': 'catfnolbackend'},
          include_package_data=True,
          platforms='any',
          install_requires=['Flask==1.0.2',
                            'flask-cors==3.0.6',
                            'SQLAlchemy==1.2.13',
                            'geoalchemy2==0.5.0',
                            'pyodbc==4.0.24',
                            'flask-dance==1.3.0',
                            'flask-login==0.4.1',
                            'blinker==1.4'
                            ],
          setup_requires=['pytest-runner'],
          tests_require=['pytest'],
          )
    

    如果我把多余的lib去掉就用 msodbcsql17 那么pyodbc4.0.24也不能构建。

    我应该指定更好的unixodbc版本吗?是否有一些我遗漏的变更日志可以提供关于依赖关系突然中断的背景信息?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Merkidemis    5 年前

    重新启动数据库后(连接尝试挂起的真正原因),现在可以指定每个库的版本:

    && ACCEPT_EULA=Y apt-get -y install --no-install-recommends msodbcsql17=17.2.0.1-1 \
        unixodbc=2.3.4-1 \
        unixodbc-bin=2.3.0-4+b1 \
        unixodbc-dev=2.3.4-1 \
        libodbc1=2.3.4-1 \
        odbcinst1debian2=2.3.4-1 \
        odbcinst=2.3.4-1 \
    && apt-get clean