代码之家  ›  专栏  ›  技术社区  ›  Ahmed Akhtar

在Docker上使用CBC解算器运行Pyomo时出错

  •  -1
  • Ahmed Akhtar  · 技术社区  · 3 年前

    我正在尝试使用 pyomo 具有 cbc 求解器。

    当我在docker容器中运行它时,它会给出以下错误:

    AttributeError:“numpy.foat64”对象没有属性“polynomial_digree”

    我倾向于认为这与Python找不到 cbc 可执行文件。

    这是我的 Dockerfile 文件:

    FROM python:3.9-slim
    
    WORKDIR /app
    
    COPY . .
    
    ENV DEBIAN_FRONTEND=noninteractive
    
    RUN apt-get update && apt-get install -y \
        build-essential \
        gcc \
        libglpk-dev \
        glpk-utils \
        curl \
        git \
        software-properties-common \
        && rm -rf /var/lib/apt/lists/*
    
    RUN python3 -m venv venv \
        && . venv/bin/activate \
        && python3 -m pip install --upgrade pip \
        && pip3 install -r requirements.txt
    
    RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \
        && (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /root/.profile \
        && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" \
        && brew install glpk \
        && brew install ipopt \
        && brew install cbc
    
    ENV PATH="/opt/homebrew/opt/cbc/bin:$PATH"
    ENV LDFLAGS="-L/opt/homebrew/opt/cbc/lib"
    ENV CPPFLAGS="-I/opt/homebrew/opt/cbc/include"
    ENV PKG_CONFIG_PATH="/opt/homebrew/opt/cbc/lib/pkgconfig"
    
    ENV PATH="${PATH}:/app/venv/bin:/home/linuxbrew/.linuxbrew/bin:/usr/local/opt/cbc/bin"
    
    EXPOSE 8501
    
    HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
    
    ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
    

    这是 requirements.txt 文件:

    numpy==1.24.3
    pandas==2.0.2
    pyomo==6.6.1
    streamlit==1.23.1
    streamlit-aggrid==0.3.4.post3
    

    请让我知道如何解决这个问题。

    我试过执行 which cbc 从python代码中找到可执行文件 cbc

    0 回复  |  直到 3 年前
        1
  •  0
  •   Ahmed Akhtar    3 年前

    我最终自己解决了这个问题。

    值得注意的是,有两件事解决了这个问题,第一件事是需要在 PATH 环境变量,而不是它的末尾:

    ENV PATH="/app/venv/bin:${PATH}"
    

    其次 altair 中需要程序包 requirements.txt 文件以及对现有程序包版本的一些更改。

    这是固定的 requirements.txt 文件:

    Pyomo==6.5.0
    streamlit==1.18.1
    streamlit-aggrid==0.3.4.post3
    altair==4.2.2
    

    这个 LDFLAGS , CPPFLAGS PKG_CONFIG_PATH 不需要在 Dockerfile

    此外,符号链接到 cbc , ipopt glpsol 由创建 homebrew 在目录中 /home/linuxbrew/.linuxbrew/bin ,所以我们需要将该目录添加到路径中。

    ENV PATH="$PATH:/home/linuxbrew/.linuxbrew/bin"
    

    这是固定的 Dockerfile :

    FROM python:3.9-slim
    
    WORKDIR /app
    
    COPY . .
    
    RUN python -m venv venv
    
    ENV PATH="/app/venv/bin:${PATH}"
    
    RUN . venv/bin/activate \
        && python -m pip install --upgrade pip \
        && pip install -r requirements.txt
    
    RUN apt-get update \
        && apt-get -y install curl git gcc \
        && /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \
        && (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /root/.profile \
        && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" \
        && brew install glpk \
        && brew install ipopt \
        && brew install cbc
    
    ENV PATH="$PATH:/home/linuxbrew/.linuxbrew/bin"
    
    EXPOSE 8501
    
    HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
    
    ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
    
    推荐文章