diff --git a/docker/Dockerfile b/docker/Dockerfile index 51638c3..08de247 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,69 +1,167 @@ -# 使用 Ubuntu 22.04 作为基础镜像(使用腾讯云镜像源) -FROM ccr.ccs.tencentyun.com/library/ubuntu:22.04 +# ============ 构建阶段 ============ +FROM ubuntu:24.04 AS builder -# 设置环境变量 ENV DEBIAN_FRONTEND=noninteractive -ENV PATH="/root/.pixi/bin:$PATH" -# 配置 APT 镜像源(使用阿里云镜像) -RUN sed -i 's@//.*archive.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list && \ - sed -i 's@//.*security.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list +# 配置镜像源(使用阿里云镜像) +RUN </dev/null || echo "build/python 目录不存在" +echo "检查根目录的 setup.py:" +ls -la setup.py 2>/dev/null || echo "根目录没有 setup.py" + +# 尝试在根目录构建 +if [ -f "setup.py" ]; then + echo "在根目录构建 wheel 包..." + /opt/build-venv/bin/python setup.py bdist_wheel +else + echo "在 build/python 目录构建 wheel 包..." + cd build/python + /opt/build-venv/bin/python setup.py bdist_wheel +fi + +echo "构建完成,查找所有 wheel 文件:" +find /tmp/AutoDock-Vina -name "*.whl" -type f +mkdir -p /wheels +find /tmp/AutoDock-Vina -name "*.whl" -type f -exec cp {} /wheels/ \; +echo "复制的 wheel 文件:" +ls -la /wheels/ +EOF + +# 编译二进制可执行文件 +RUN < /root/.pip/pip.conf && \ - echo "index-url = https://pypi.tuna.tsinghua.edu.cn/simple" >> /root/.pip/pip.conf && \ - echo "trusted-host = pypi.tuna.tsinghua.edu.cn" >> /root/.pip/pip.conf +RUN pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple -# 安装 pixi -RUN curl -fsSL https://pixi.sh/install.sh | bash +# 创建虚拟环境(解决 Python 3.12 PEP 668 保护问题) +RUN < /entrypoint.sh && \ - chmod +x /entrypoint.sh +RUN < /entrypoint.sh << 'SCRIPT_EOF' +#!/bin/bash +echo "AutoDock Vina 环境已准备就绪 (Ubuntu 24.04 + Python 3.12 + Boost 1.83.0)" +echo "虚拟环境: \$(which python)" +echo "Python 版本: \$(python --version 2>&1)" +echo "Python 绑定测试:" +python -c "from vina import Vina; print('Vina Python 绑定可用')" 2>/dev/null || echo "Python 绑定不可用" +echo "命令行工具: vina --version" +vina --version 2>/dev/null || echo "vina 命令不可用" +echo "Boost 库信息:" +ldd /usr/local/bin/vina | grep boost || echo "无法获取 Boost 信息" +if [ "\$#" -eq 0 ]; then + echo "进入交互模式..." + exec /bin/bash +else + echo "执行命令: \$@" + exec "\$@" +fi +SCRIPT_EOF +chmod +x /entrypoint.sh +EOF # 设置入口点 ENTRYPOINT ["/entrypoint.sh"] # 默认命令 -CMD ["/root/.pixi/bin/pixi", "shell"] +CMD ["bash"] diff --git a/docker/README.md b/docker/README.md index f653e4c..3d6132c 100644 --- a/docker/README.md +++ b/docker/README.md @@ -30,14 +30,20 @@ docker build -f docker/Dockerfile -t vinatools:latest . | 变量名 | 默认值 | 说明 | |--------|--------|------| | `VINA_VERSION` | `1.2.7` | AutoDock Vina 版本 | -| `VINA_PLATFORM` | `mac_aarch64` | 平台架构 | -| `DOWNLOAD_VINA` | `true` | 是否下载 AutoDock Vina | +| `TARGETPLATFORM` | `linux/amd64` | 目标平台架构 | **支持的平台:** -- `mac_aarch64` - Apple Silicon Mac -- `mac_x86_64` - Intel Mac -- `linux_x86_64` - Linux x86_64 -- `windows_x86_64` - Windows x86_64 +- `linux/amd64` - Linux x86_64 +- `linux/arm64` - Linux aarch64 + +### 4. 从源码编译 + +Dockerfile 现在支持从源码编译 AutoDock Vina: + +- **Python 环境**: Python 3.12 +- **依赖包**: numpy (最新版本)、boost-cpp 1.82.0、swig 4.0.2 +- **编译方式**: 使用 pixi 管理环境,从源码编译 +- **版本控制**: 通过 VINA_VERSION 参数控制,默认 1.2.7 ### 4. 运行容器 @@ -58,14 +64,13 @@ docker run -it --rm -v $(pwd):/app vinatools:latest bash ```bash # Linux x86_64 平台 -VINA_PLATFORM=linux_x86_64 docker-compose -f docker/docker-compose.yml build -VINA_PLATFORM=linux_aarch64 docker-compose -f docker/docker-compose.yml build +TARGETPLATFORM=linux/amd64 docker-compose -f docker/docker-compose.yml build -# Intel Mac 平台 -VINA_PLATFORM=mac_x86_64 docker-compose -f docker/docker-compose.yml build +# Linux ARM64 平台 +TARGETPLATFORM=linux/arm64 docker-compose -f docker/docker-compose.yml build -# 不下载 AutoDock Vina -DOWNLOAD_VINA=false docker-compose -f docker/docker-compose.yml build +# 使用不同版本 +VINA_VERSION=1.2.6 TARGETPLATFORM=linux/amd64 docker-compose -f docker/docker-compose.yml build ``` ### 使用环境文件 @@ -74,8 +79,7 @@ DOWNLOAD_VINA=false docker-compose -f docker/docker-compose.yml build # 创建自定义环境文件 cat > docker/my.env << EOF VINA_VERSION=1.2.6 -VINA_PLATFORM=linux_x86_64 -DOWNLOAD_VINA=true +TARGETPLATFORM=linux/amd64 EOF # 使用自定义环境文件构建 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 118385a..fbe5b7a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -7,8 +7,6 @@ services: dockerfile: docker/Dockerfile args: VINA_VERSION: ${VINA_VERSION:-1.2.7} - VINA_PLATFORM: ${VINA_PLATFORM:-linux} - DOWNLOAD_VINA: ${DOWNLOAD_VINA:-true} image: vinatools:latest container_name: vinatools-container volumes: @@ -19,8 +17,7 @@ services: - ./results:/app/results working_dir: /app environment: - - PIXI_ROOT=/root/.pixi - - PATH=/root/.pixi/bin:/app/bin:$PATH + - PATH=/opt/venv/bin:/usr/local/bin:$PATH # 保持容器运行 tty: true stdin_open: true @@ -28,6 +25,9 @@ services: network_mode: host # 重启策略 restart: unless-stopped + # 覆盖 ENTRYPOINT 用于交互式测试 + entrypoint: ["/bin/bash"] + command: ["-c", "while true; do sleep 30; done"] # 资源限制 deploy: resources: @@ -38,33 +38,29 @@ services: memory: 2G cpus: '1.0' - # 可选:用于 Jupyter Notebook 服务 - jupyter: - build: - context: .. - dockerfile: docker/Dockerfile - args: - VINA_VERSION: ${VINA_VERSION:-1.2.7} - VINA_PLATFORM: ${VINA_PLATFORM:-linux_x86_64} - DOWNLOAD_VINA: ${DOWNLOAD_VINA:-true} - image: vinatools:latest - container_name: vinatools-jupyter - ports: - - "8888:8888" - volumes: - - ..:/app - - ./data:/app/data - - ./results:/app/results - working_dir: /app - environment: - - PIXI_ROOT=/root/.pixi - - PATH=/root/.pixi/bin:/app/bin:$PATH - command: > - bash -c " - /root/.pixi/bin/pixi workspace platform add linux-aarch64 && - /root/.pixi/bin/pixi add jupyter notebook && - /root/.pixi/bin/pixi run jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' - " - restart: unless-stopped - depends_on: - - vinatools + # # 可选:用于 Jupyter Notebook 服务 + # jupyter: + # build: + # context: .. + # dockerfile: docker/Dockerfile + # args: + # VINA_VERSION: ${VINA_VERSION:-1.2.7} + # image: vinatools:latest + # container_name: vinatools-jupyter + # ports: + # - "8888:8888" + # volumes: + # - ..:/app + # - ./data:/app/data + # - ./results:/app/results + # working_dir: /app + # environment: + # - PATH=/usr/local/bin:$PATH + # command: > + # bash -c " + # pip3 install jupyter notebook && + # jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' + # " + # restart: unless-stopped + # depends_on: + # - vinatools diff --git a/docker/docker.env.example b/docker/docker.env.example index c034189..1f95c10 100644 --- a/docker/docker.env.example +++ b/docker/docker.env.example @@ -1,12 +1,7 @@ # AutoDock Vina 配置 VINA_VERSION=1.2.7 -VINA_PLATFORM=mac_aarch64 -DOWNLOAD_VINA=true +TARGETPLATFORM=linux/amd64 -# 其他平台选项: -# VINA_PLATFORM=linux_x86_64 -# VINA_PLATFORM=mac_x86_64 -# VINA_PLATFORM=windows_x86_64 - -# 禁用 AutoDock Vina 下载 -# DOWNLOAD_VINA=false +# 支持的平台选项: +# TARGETPLATFORM=linux/amd64 # x86_64 +# TARGETPLATFORM=linux/arm64 # aarch64