增加多阶段构建,并在镜像中构建指定版本的vina 便于使用。
This commit is contained in:
@@ -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 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 && \
|
RUN <<EOF
|
||||||
sed -i 's@//.*security.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list
|
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
|
||||||
|
EOF
|
||||||
|
|
||||||
# 安装系统依赖
|
# 安装构建依赖
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN <<EOF
|
||||||
curl \
|
apt-get update
|
||||||
wget \
|
apt-get install -y \
|
||||||
git \
|
git \
|
||||||
build-essential \
|
build-essential \
|
||||||
ca-certificates \
|
libboost-all-dev \
|
||||||
gnupg \
|
swig \
|
||||||
lsb-release \
|
python3-dev \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
python3-pip \
|
||||||
|
python3-venv
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 创建构建虚拟环境并安装必要的 Python 包
|
||||||
|
RUN <<EOF
|
||||||
|
echo "创建构建虚拟环境..."
|
||||||
|
python3 -m venv /opt/build-venv
|
||||||
|
echo "配置 pip 镜像源..."
|
||||||
|
/opt/build-venv/bin/pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
|
||||||
|
echo "安装构建依赖包..."
|
||||||
|
/opt/build-venv/bin/pip install numpy packaging setuptools wheel
|
||||||
|
echo "构建环境准备完成"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 克隆 AutoDock Vina 源码
|
||||||
|
ARG VINA_VERSION=1.2.7
|
||||||
|
RUN <<EOF
|
||||||
|
git clone https://github.com/ccsb-scripps/AutoDock-Vina.git /tmp/AutoDock-Vina
|
||||||
|
cd /tmp/AutoDock-Vina
|
||||||
|
git checkout v${VINA_VERSION}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 编译 Python wheel 包
|
||||||
|
RUN <<EOF
|
||||||
|
cd /tmp/AutoDock-Vina
|
||||||
|
echo "AutoDock Vina 源码结构:"
|
||||||
|
find . -name "setup.py" -type f
|
||||||
|
echo "检查 build/python 目录:"
|
||||||
|
ls -la build/python/ 2>/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 <<EOF
|
||||||
|
cd /tmp/AutoDock-Vina/build/linux/release
|
||||||
|
make
|
||||||
|
mkdir -p /binaries
|
||||||
|
cp vina /binaries/
|
||||||
|
cp vina_split /binaries/
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# ============ 运行阶段 ============
|
||||||
|
FROM ubuntu:24.04
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
# 配置镜像源(使用阿里云镜像)
|
||||||
|
RUN <<EOF
|
||||||
|
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
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 安装运行时依赖
|
||||||
|
RUN <<EOF
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
python3-venv \
|
||||||
|
libboost-system1.83.0 \
|
||||||
|
libboost-thread1.83.0 \
|
||||||
|
libboost-serialization1.83.0 \
|
||||||
|
libboost-filesystem1.83.0 \
|
||||||
|
libboost-program-options1.83.0
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
EOF
|
||||||
|
|
||||||
# 配置 pip 镜像源
|
# 配置 pip 镜像源
|
||||||
RUN mkdir -p /root/.pip && \
|
RUN pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
|
||||||
echo "[global]" > /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
|
|
||||||
|
|
||||||
# 安装 pixi
|
# 创建虚拟环境(解决 Python 3.12 PEP 668 保护问题)
|
||||||
RUN curl -fsSL https://pixi.sh/install.sh | bash
|
RUN <<EOF
|
||||||
|
echo "创建虚拟环境..."
|
||||||
|
python3 -m venv /opt/venv
|
||||||
|
echo "虚拟环境创建完成,检查路径:"
|
||||||
|
ls -la /opt/venv/bin/
|
||||||
|
echo "升级 pip..."
|
||||||
|
/opt/venv/bin/pip install --upgrade pip
|
||||||
|
echo "虚拟环境准备完成"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 从构建阶段复制 wheel 包并安装到虚拟环境
|
||||||
|
COPY --from=builder /wheels/*.whl /tmp/
|
||||||
|
RUN <<EOF
|
||||||
|
/opt/venv/bin/pip install /tmp/*.whl
|
||||||
|
rm -rf /tmp/*.whl
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 设置虚拟环境路径
|
||||||
|
ENV PATH="/opt/venv/bin:$PATH"
|
||||||
|
|
||||||
|
# 从构建阶段复制二进制文件
|
||||||
|
COPY --from=builder /binaries/* /usr/local/bin/
|
||||||
|
RUN chmod +x /usr/local/bin/vina*
|
||||||
|
|
||||||
# 设置工作目录
|
# 设置工作目录
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# 复制项目文件
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
# 创建 bin 目录
|
|
||||||
RUN mkdir -p bin
|
|
||||||
|
|
||||||
# 下载 AutoDock Vina 二进制文件
|
|
||||||
ARG VINA_VERSION=1.2.7
|
|
||||||
ARG VINA_PLATFORM=mac_aarch64
|
|
||||||
ARG DOWNLOAD_VINA=true
|
|
||||||
|
|
||||||
RUN if [ "$DOWNLOAD_VINA" = "true" ]; then \
|
|
||||||
curl -L -o ./bin/vina_${VINA_VERSION}_${VINA_PLATFORM} https://github.com/ccsb-scripps/AutoDock-Vina/releases/download/v${VINA_VERSION}/vina_${VINA_VERSION}_${VINA_PLATFORM} && \
|
|
||||||
curl -L -o ./bin/vina_split_${VINA_VERSION}_${VINA_PLATFORM} https://github.com/ccsb-scripps/AutoDock-Vina/releases/download/v${VINA_VERSION}/vina_split_${VINA_VERSION}_${VINA_PLATFORM} && \
|
|
||||||
chmod +x ./bin/vina_*; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 添加平台支持并安装 pixi 包
|
|
||||||
RUN /root/.pixi/bin/pixi workspace platform add linux-aarch64 && \
|
|
||||||
/root/.pixi/bin/pixi add rdkit openbabel meeko
|
|
||||||
|
|
||||||
# 设置环境变量
|
|
||||||
ENV PATH="/root/.pixi/bin:/app/bin:$PATH"
|
|
||||||
|
|
||||||
# 创建启动脚本
|
# 创建启动脚本
|
||||||
RUN echo '#!/bin/bash\n\
|
RUN <<EOF
|
||||||
source /root/.bashrc\n\
|
cat > /entrypoint.sh << 'SCRIPT_EOF'
|
||||||
exec "$@"' > /entrypoint.sh && \
|
#!/bin/bash
|
||||||
chmod +x /entrypoint.sh
|
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"]
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
|
||||||
# 默认命令
|
# 默认命令
|
||||||
CMD ["/root/.pixi/bin/pixi", "shell"]
|
CMD ["bash"]
|
||||||
|
|||||||
@@ -30,14 +30,20 @@ docker build -f docker/Dockerfile -t vinatools:latest .
|
|||||||
| 变量名 | 默认值 | 说明 |
|
| 变量名 | 默认值 | 说明 |
|
||||||
|--------|--------|------|
|
|--------|--------|------|
|
||||||
| `VINA_VERSION` | `1.2.7` | AutoDock Vina 版本 |
|
| `VINA_VERSION` | `1.2.7` | AutoDock Vina 版本 |
|
||||||
| `VINA_PLATFORM` | `mac_aarch64` | 平台架构 |
|
| `TARGETPLATFORM` | `linux/amd64` | 目标平台架构 |
|
||||||
| `DOWNLOAD_VINA` | `true` | 是否下载 AutoDock Vina |
|
|
||||||
|
|
||||||
**支持的平台:**
|
**支持的平台:**
|
||||||
- `mac_aarch64` - Apple Silicon Mac
|
- `linux/amd64` - Linux x86_64
|
||||||
- `mac_x86_64` - Intel Mac
|
- `linux/arm64` - Linux aarch64
|
||||||
- `linux_x86_64` - Linux x86_64
|
|
||||||
- `windows_x86_64` - Windows x86_64
|
### 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. 运行容器
|
### 4. 运行容器
|
||||||
|
|
||||||
@@ -58,14 +64,13 @@ docker run -it --rm -v $(pwd):/app vinatools:latest bash
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Linux x86_64 平台
|
# Linux x86_64 平台
|
||||||
VINA_PLATFORM=linux_x86_64 docker-compose -f docker/docker-compose.yml build
|
TARGETPLATFORM=linux/amd64 docker-compose -f docker/docker-compose.yml build
|
||||||
VINA_PLATFORM=linux_aarch64 docker-compose -f docker/docker-compose.yml build
|
|
||||||
|
|
||||||
# Intel Mac 平台
|
# Linux ARM64 平台
|
||||||
VINA_PLATFORM=mac_x86_64 docker-compose -f docker/docker-compose.yml build
|
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
|
cat > docker/my.env << EOF
|
||||||
VINA_VERSION=1.2.6
|
VINA_VERSION=1.2.6
|
||||||
VINA_PLATFORM=linux_x86_64
|
TARGETPLATFORM=linux/amd64
|
||||||
DOWNLOAD_VINA=true
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# 使用自定义环境文件构建
|
# 使用自定义环境文件构建
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ services:
|
|||||||
dockerfile: docker/Dockerfile
|
dockerfile: docker/Dockerfile
|
||||||
args:
|
args:
|
||||||
VINA_VERSION: ${VINA_VERSION:-1.2.7}
|
VINA_VERSION: ${VINA_VERSION:-1.2.7}
|
||||||
VINA_PLATFORM: ${VINA_PLATFORM:-linux}
|
|
||||||
DOWNLOAD_VINA: ${DOWNLOAD_VINA:-true}
|
|
||||||
image: vinatools:latest
|
image: vinatools:latest
|
||||||
container_name: vinatools-container
|
container_name: vinatools-container
|
||||||
volumes:
|
volumes:
|
||||||
@@ -19,8 +17,7 @@ services:
|
|||||||
- ./results:/app/results
|
- ./results:/app/results
|
||||||
working_dir: /app
|
working_dir: /app
|
||||||
environment:
|
environment:
|
||||||
- PIXI_ROOT=/root/.pixi
|
- PATH=/opt/venv/bin:/usr/local/bin:$PATH
|
||||||
- PATH=/root/.pixi/bin:/app/bin:$PATH
|
|
||||||
# 保持容器运行
|
# 保持容器运行
|
||||||
tty: true
|
tty: true
|
||||||
stdin_open: true
|
stdin_open: true
|
||||||
@@ -28,6 +25,9 @@ services:
|
|||||||
network_mode: host
|
network_mode: host
|
||||||
# 重启策略
|
# 重启策略
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
# 覆盖 ENTRYPOINT 用于交互式测试
|
||||||
|
entrypoint: ["/bin/bash"]
|
||||||
|
command: ["-c", "while true; do sleep 30; done"]
|
||||||
# 资源限制
|
# 资源限制
|
||||||
deploy:
|
deploy:
|
||||||
resources:
|
resources:
|
||||||
@@ -38,33 +38,29 @@ services:
|
|||||||
memory: 2G
|
memory: 2G
|
||||||
cpus: '1.0'
|
cpus: '1.0'
|
||||||
|
|
||||||
# 可选:用于 Jupyter Notebook 服务
|
# # 可选:用于 Jupyter Notebook 服务
|
||||||
jupyter:
|
# jupyter:
|
||||||
build:
|
# build:
|
||||||
context: ..
|
# context: ..
|
||||||
dockerfile: docker/Dockerfile
|
# dockerfile: docker/Dockerfile
|
||||||
args:
|
# args:
|
||||||
VINA_VERSION: ${VINA_VERSION:-1.2.7}
|
# VINA_VERSION: ${VINA_VERSION:-1.2.7}
|
||||||
VINA_PLATFORM: ${VINA_PLATFORM:-linux_x86_64}
|
# image: vinatools:latest
|
||||||
DOWNLOAD_VINA: ${DOWNLOAD_VINA:-true}
|
# container_name: vinatools-jupyter
|
||||||
image: vinatools:latest
|
# ports:
|
||||||
container_name: vinatools-jupyter
|
# - "8888:8888"
|
||||||
ports:
|
# volumes:
|
||||||
- "8888:8888"
|
# - ..:/app
|
||||||
volumes:
|
# - ./data:/app/data
|
||||||
- ..:/app
|
# - ./results:/app/results
|
||||||
- ./data:/app/data
|
# working_dir: /app
|
||||||
- ./results:/app/results
|
# environment:
|
||||||
working_dir: /app
|
# - PATH=/usr/local/bin:$PATH
|
||||||
environment:
|
# command: >
|
||||||
- PIXI_ROOT=/root/.pixi
|
# bash -c "
|
||||||
- PATH=/root/.pixi/bin:/app/bin:$PATH
|
# pip3 install jupyter notebook &&
|
||||||
command: >
|
# jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''
|
||||||
bash -c "
|
# "
|
||||||
/root/.pixi/bin/pixi workspace platform add linux-aarch64 &&
|
# restart: unless-stopped
|
||||||
/root/.pixi/bin/pixi add jupyter notebook &&
|
# depends_on:
|
||||||
/root/.pixi/bin/pixi run jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''
|
# - vinatools
|
||||||
"
|
|
||||||
restart: unless-stopped
|
|
||||||
depends_on:
|
|
||||||
- vinatools
|
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
# AutoDock Vina 配置
|
# AutoDock Vina 配置
|
||||||
VINA_VERSION=1.2.7
|
VINA_VERSION=1.2.7
|
||||||
VINA_PLATFORM=mac_aarch64
|
TARGETPLATFORM=linux/amd64
|
||||||
DOWNLOAD_VINA=true
|
|
||||||
|
|
||||||
# 其他平台选项:
|
# 支持的平台选项:
|
||||||
# VINA_PLATFORM=linux_x86_64
|
# TARGETPLATFORM=linux/amd64 # x86_64
|
||||||
# VINA_PLATFORM=mac_x86_64
|
# TARGETPLATFORM=linux/arm64 # aarch64
|
||||||
# VINA_PLATFORM=windows_x86_64
|
|
||||||
|
|
||||||
# 禁用 AutoDock Vina 下载
|
|
||||||
# DOWNLOAD_VINA=false
|
|
||||||
|
|||||||
Reference in New Issue
Block a user