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"]