3
3
####################
4
4
FROM registry.access.redhat.com/ubi9/python-312:latest AS base
5
5
6
+ ARG TARGETARCH
7
+
6
8
WORKDIR /opt/app-root/bin
7
9
8
10
# OS Packages needs to be installed as root
9
11
USER 0
10
12
11
13
# Install useful OS packages
12
- RUN dnf install -y mesa-libGL skopeo libxcrypt-compat && dnf clean all && rm -rf /var/cache/yum
14
+ RUN --mount=type=cache,target=/var/cache/dnf \
15
+ echo "Building for architecture: ${TARGETARCH}" && \
16
+ PACKAGES="mesa-libGL skopeo libxcrypt-compat" && \
17
+ # Additional dev tools only for s390x
18
+ if [ "$TARGETARCH" = "s390x" ]; then \
19
+ PACKAGES="$PACKAGES gcc gcc-c++ make openssl-devel autoconf automake libtool cmake python3-devel pybind11-devel openblas-devel unixODBC-devel openssl c-ares-devel zlib-devel"; \
20
+ fi && \
21
+ if [ -n "$PACKAGES" ]; then \
22
+ dnf install -y --nogpgcheck --allowerasing --nobest $PACKAGES && \
23
+ dnf clean all && rm -rf /var/cache/yum; \
24
+ fi
25
+
26
+ # For s390x only, set ENV vars and install Rust
27
+ RUN if [ "$TARGETARCH" = "s390x" ]; then \
28
+ # Install Rust and set up environment
29
+ mkdir -p /opt/.cargo && \
30
+ export HOME=/root && \
31
+ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o rustup-init.sh && \
32
+ chmod +x rustup-init.sh && \
33
+ CARGO_HOME=/opt/.cargo HOME=/root ./rustup-init.sh -y --no-modify-path && \
34
+ rm -f rustup-init.sh && \
35
+ chown -R 1001:0 /opt/.cargo && \
36
+ # Set environment variables
37
+ echo 'export PATH=/opt/.cargo/bin:$PATH' >> /etc/profile.d/cargo.sh && \
38
+ echo 'export CARGO_HOME=/opt/.cargo' >> /etc/profile.d/cargo.sh && \
39
+ echo 'export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1' >> /etc/profile.d/cargo.sh; \
40
+ fi
41
+
42
+ # Set python alternatives only for s390x (not needed for other arches)
43
+ RUN if [ "$TARGETARCH" = "s390x" ]; then \
44
+ alternatives --install /usr/bin/python python /usr/bin/python3.12 1 && \
45
+ alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 1 && \
46
+ python --version && python3 --version; \
47
+ fi
13
48
14
49
# Other apps and tools installed as default user
15
50
USER 1001
@@ -23,11 +58,69 @@ RUN curl -L https://mirror.openshift.com/pub/openshift-v4/$(uname -m)/clients/oc
23
58
tar -xzvf /tmp/openshift-client-linux.tar.gz oc && \
24
59
rm -f /tmp/openshift-client-linux.tar.gz
25
60
61
+ ##############################
62
+ # wheel-builder stage #
63
+ # NOTE: Only used in s390x
64
+ ##############################
65
+ FROM base AS s390x-builder
66
+
67
+ ARG TARGETARCH
68
+ USER 0
69
+ WORKDIR /tmp/build-wheels
70
+
71
+ # Build pyarrow optimized for s390x
72
+ RUN --mount=type=cache,target=/root/.cache/pip \
73
+ --mount=type=cache,target=/root/.cache/dnf \
74
+ if [ "$TARGETARCH" = "s390x" ]; then \
75
+ # Install build dependencies (shared for pyarrow and onnx)
76
+ dnf install -y cmake make gcc-c++ pybind11-devel wget && \
77
+ dnf clean all && \
78
+ # Build and collect pyarrow wheel
79
+ git clone --depth 1 https://github.com/apache/arrow.git && \
80
+ cd arrow/cpp && \
81
+ mkdir release && cd release && \
82
+ cmake -DCMAKE_BUILD_TYPE=Release \
83
+ -DCMAKE_INSTALL_PREFIX=/usr/local \
84
+ -DARROW_PYTHON=ON \
85
+ -DARROW_PARQUET=ON \
86
+ -DARROW_ORC=ON \
87
+ -DARROW_FILESYSTEM=ON \
88
+ -DARROW_JSON=ON \
89
+ -DARROW_CSV=ON \
90
+ -DARROW_DATASET=ON \
91
+ -DARROW_DEPENDENCY_SOURCE=BUNDLED \
92
+ -DARROW_WITH_LZ4=OFF \
93
+ -DARROW_WITH_ZSTD=OFF \
94
+ -DARROW_WITH_SNAPPY=OFF \
95
+ -DARROW_BUILD_TESTS=OFF \
96
+ -DARROW_BUILD_BENCHMARKS=OFF \
97
+ .. && \
98
+ make -j$(nproc) VERBOSE=1 && \
99
+ make install -j$(nproc) && \
100
+ cd ../../python && \
101
+ pip install --no-cache-dir -r requirements-build.txt && \
102
+ PYARROW_WITH_PARQUET=1 \
103
+ PYARROW_WITH_DATASET=1 \
104
+ PYARROW_WITH_FILESYSTEM=1 \
105
+ PYARROW_WITH_JSON=1 \
106
+ PYARROW_WITH_CSV=1 \
107
+ PYARROW_PARALLEL=$(nproc) \
108
+ python setup.py build_ext --build-type=release --bundle-arrow-cpp bdist_wheel && \
109
+ mkdir -p /tmp/wheels && \
110
+ cp dist/pyarrow-*.whl /tmp/wheels/ && \
111
+ # Ensure wheels directory exists and has content
112
+ ls -la /tmp/wheels/; \
113
+ else \
114
+ # Create empty wheels directory for non-s390x
115
+ mkdir -p /tmp/wheels; \
116
+ fi
117
+
26
118
#######################
27
119
# runtime-datascience #
28
120
#######################
29
121
FROM base AS runtime-datascience
30
122
123
+ ARG TARGETARCH
31
124
ARG DATASCIENCE_SOURCE_CODE=runtimes/datascience/ubi9-python-3.12
32
125
33
126
LABEL name="odh-notebook-runtime-datascience-ubi9-python-3.12" \
@@ -42,15 +135,29 @@ LABEL name="odh-notebook-runtime-datascience-ubi9-python-3.12" \
42
135
43
136
WORKDIR /opt/app-root/bin
44
137
138
+ USER 0
139
+ # Copy wheels from build stage (s390x only)
140
+ COPY --from=s390x-builder /tmp/wheels /tmp/wheels
141
+ RUN if [ "$TARGETARCH" = "s390x" ]; then \
142
+ pip install --no-cache-dir /tmp/wheels/*.whl && rm -rf /tmp/wheels; \
143
+ else \
144
+ echo "Skipping wheel install for $TARGETARCH"; \
145
+ fi
146
+
45
147
# Install Python packages from Pipfile.lock
46
148
COPY ${DATASCIENCE_SOURCE_CODE}/Pipfile.lock ./
47
149
# Copy Elyra dependencies for air-gapped enviroment
48
150
COPY ${DATASCIENCE_SOURCE_CODE}/utils ./utils/
49
151
50
- RUN echo "Installing softwares and packages" && \
51
- micropipenv install && \
152
+ RUN --mount=type=cache,target=/root/.cache/pip \
153
+ echo "Installing softwares and packages" && \
154
+ if [ "$TARGETARCH" = "s390x" ]; then \
155
+ GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 CFLAGS="-O3" CXXFLAGS="-O3" micropipenv install; \
156
+ else \
157
+ micropipenv install; \
158
+ fi && \
52
159
rm -f ./Pipfile.lock && \
53
- # Fix permissions to support pip in Openshift environments \
160
+ # Fix permissions to support pip in Openshift environments
54
161
chmod -R g+w /opt/app-root/lib/python3.12/site-packages && \
55
162
fix-permissions /opt/app-root -P
56
163
0 commit comments