File size: 6,237 Bytes
0e5bb97 c42bd83 29a9f1e fcf3368 97e409e 29a9f1e c42bd83 29a9f1e 94f157c 29a9f1e 94f157c 29a9f1e 94f157c 29a9f1e 94f157c fcf3368 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | # --- Stage 1: Builder ---
FROM openfoam/openfoam10:latest AS builder
USER root
# Install base utilities (including ca-certificates for SSL)
RUN apt-get update \
&& apt-get install -y \
build-essential \
wget \
git \
python3 \
python3-pip \
libboost-all-dev \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Download and install Miniconda directly
ENV CONDA_DIR=/opt/conda
ENV PATH=$CONDA_DIR/bin:$PATH
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/Miniconda3-latest-Linux-x86_64.sh \
&& bash /tmp/Miniconda3-latest-Linux-x86_64.sh -b -p "$CONDA_DIR" \
&& rm -f /tmp/Miniconda3-latest-Linux-x86_64.sh \
&& ln -s "$CONDA_DIR/bin/conda" /usr/bin/conda \
&& conda --version
# Clone Foam-Agent repository directly
ENV FoamAgent_PATH="/home/openfoam/Foam-Agent"
WORKDIR /home/openfoam
# RUN git clone https://github.com/csml-rpi/Foam-Agent.git
# RUN git -C Foam-Agent checkout mcp
# Switch to bash to source OpenFOAM environment
SHELL ["/bin/bash", "-c"]
# Create the Foam-Agent environment
WORKDIR $FoamAgent_PATH
RUN conda config --add channels conda-forge && \
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main && \
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r && \
conda env create --file environment.yml --yes
# Initialize conda for bash (automatic setup)
RUN conda init bash && \
echo "conda activate FoamAgent" >> ~/.bashrc
# Source OpenFOAM and verify
RUN source /opt/openfoam10/etc/bashrc && \
echo "WM_PROJECT_DIR: $WM_PROJECT_DIR"
RUN conda clean --all --yes && \
rm -rf "$CONDA_DIR/pkgs" && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# --- Stage 2: Runtime ---
FROM openfoam/openfoam10:latest
USER root
# Install runtime dependencies
RUN apt-get update \
&& apt-get install -y \
git \
libboost-all-dev \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Environment variables in a FoamAgent container
ENV CONDA_DIR="/opt/conda"
ENV PATH=$CONDA_DIR/bin:$PATH
ENV FoamAgent_PATH="/home/openfoam/Foam-Agent"
# Copy Conda runtime and Foam-Agent from builder
COPY --from=builder $CONDA_DIR $CONDA_DIR
COPY --from=builder $FoamAgent_PATH $FoamAgent_PATH
COPY --from=builder /root/.bashrc /root/.bashrc
# Ensure conda is properly initialized in .bashrc for interactive shells
RUN echo '' >> /root/.bashrc && \
echo '# Auto-activate FoamAgent environment' >> /root/.bashrc && \
echo 'if [ -f "$CONDA_DIR/etc/profile.d/conda.sh" ]; then' >> /root/.bashrc && \
echo ' source "$CONDA_DIR/etc/profile.d/conda.sh"' >> /root/.bashrc && \
echo ' conda activate FoamAgent 2>/dev/null || true' >> /root/.bashrc && \
echo 'fi' >> /root/.bashrc && \
echo '' >> /root/.bashrc && \
echo '# Auto-source OpenFOAM' >> /root/.bashrc && \
echo 'if [ -f /opt/openfoam10/etc/bashrc ]; then' >> /root/.bashrc && \
echo ' source /opt/openfoam10/etc/bashrc' >> /root/.bashrc && \
echo 'fi' >> /root/.bashrc && \
echo '' >> /root/.bashrc && \
echo '# Auto-change to Foam-Agent directory' >> /root/.bashrc && \
echo 'cd "$FoamAgent_PATH" 2>/dev/null || true' >> /root/.bashrc
# Create a startup script that automatically sets up everything
RUN printf '%s\n' \
'#!/bin/bash' \
'set -e' \
'' \
'# Source OpenFOAM environment in a controlled way: allow non-zero RC, then validate' \
'set +e' \
'source /opt/openfoam10/etc/bashrc' \
'openfoam_rc=$?' \
'set -e' \
'' \
'# Strict validation: must have WM_PROJECT_DIR and blockMesh in PATH' \
'if [ -z "$WM_PROJECT_DIR" ] || ! command -v blockMesh >/dev/null 2>&1; then' \
' echo "ERROR: OpenFOAM environment failed to load (rc=$openfoam_rc)." >&2' \
' echo "Diag: WM_PROJECT_DIR='"'"'${WM_PROJECT_DIR:-unset}'"'"', blockMesh=$(command -v blockMesh || echo '"'"'NOT-IN-PATH'"'"')" >&2' \
' exit 1' \
'fi' \
'' \
'# Initialize conda' \
'source "$CONDA_DIR/etc/profile.d/conda.sh"' \
'' \
'# Activate FoamAgent environment' \
'conda activate FoamAgent' \
'' \
'# Change to Foam-Agent directory' \
'cd "$FoamAgent_PATH"' \
'' \
'# Display welcome message' \
'echo "=========================================="' \
'echo "Foam-Agent Docker Container Ready!"' \
'echo "=========================================="' \
'echo "OpenFOAM: $WM_PROJECT_DIR"' \
'echo "Conda Env: FoamAgent (activated)"' \
'echo "Working Dir: $FoamAgent_PATH"' \
'echo ""' \
'echo "To update to latest Foam-Agent:"' \
'echo " cd $FoamAgent_PATH && git pull"' \
'echo ""' \
'echo "To run Foam-Agent:"' \
'echo " python foambench_main.py --openfoam_path \$WM_PROJECT_DIR --output ./output --prompt_path ./user_requirement.txt"' \
'echo ""' \
'echo "Note: Make sure OPENAI_API_KEY is set before running!"' \
'echo "=========================================="' \
'' \
'# Execute the command passed to the container' \
'if [ "$1" = "/bin/bash" ] || [ "$1" = "bash" ] || [ -z "$1" ]; then' \
' exec /bin/bash -i' \
'else' \
' exec "$@"' \
'fi' \
> /usr/local/bin/foamagent-entrypoint.sh && \
chmod +x /usr/local/bin/foamagent-entrypoint.sh
# ============================================================================
# Uncomment to exclude root access but create a larger image
# ============================================================================
# # Ensure openfoam user owns entire home directory
# RUN chown -R openfoam:openfoam /home/openfoam
# # Switch to non-root user
# USER openfoam
# ============================================================================
# Set default working directory
WORKDIR $FoamAgent_PATH
# Expose port 7860 for MCP HTTP service
EXPOSE 7860
# Environment variables for MCP service
ENV MCP_TRANSPORT=http
ENV MCP_HOST=0.0.0.0
ENV MCP_PORT=7860
# Use the custom entrypoint script
ENTRYPOINT ["/usr/local/bin/foamagent-entrypoint.sh"]
# Run MCP server by default (can override with: docker run <image> /bin/bash)
CMD ["python", "src/mcp/start_mcp.py"] |