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 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
@@ -25,11 +60,69 @@ RUN curl -L https://mirror.openshift.com/pub/openshift-v4/$(uname -m)/clients/oc
25
60
rm -f /tmp/openshift-client-linux.tar.gz
26
61
# Install the oc client end
27
62
63
+ ##############################
64
+ # wheel-builder stage #
65
+ # NOTE: Only used in s390x
66
+ ##############################
67
+ FROM base AS s390x-builder
68
+
69
+ ARG TARGETARCH
70
+ USER 0
71
+ WORKDIR /tmp/build-wheels
72
+
73
+ # Build pyarrow optimized for s390x
74
+ RUN --mount=type=cache,target=/root/.cache/pip \
75
+ --mount=type=cache,target=/root/.cache/dnf \
76
+ if [ "$TARGETARCH" = "s390x" ]; then \
77
+ # Install build dependencies (shared for pyarrow and onnx)
78
+ dnf install -y cmake make gcc-c++ pybind11-devel wget && \
79
+ dnf clean all && \
80
+ # Build and collect pyarrow wheel
81
+ git clone --depth 1 https://github.com/apache/arrow.git && \
82
+ cd arrow/cpp && \
83
+ mkdir release && cd release && \
84
+ cmake -DCMAKE_BUILD_TYPE=Release \
85
+ -DCMAKE_INSTALL_PREFIX=/usr/local \
86
+ -DARROW_PYTHON=ON \
87
+ -DARROW_PARQUET=ON \
88
+ -DARROW_ORC=ON \
89
+ -DARROW_FILESYSTEM=ON \
90
+ -DARROW_JSON=ON \
91
+ -DARROW_CSV=ON \
92
+ -DARROW_DATASET=ON \
93
+ -DARROW_DEPENDENCY_SOURCE=BUNDLED \
94
+ -DARROW_WITH_LZ4=OFF \
95
+ -DARROW_WITH_ZSTD=OFF \
96
+ -DARROW_WITH_SNAPPY=OFF \
97
+ -DARROW_BUILD_TESTS=OFF \
98
+ -DARROW_BUILD_BENCHMARKS=OFF \
99
+ .. && \
100
+ make -j$(nproc) VERBOSE=1 && \
101
+ make install -j$(nproc) && \
102
+ cd ../../python && \
103
+ pip install --no-cache-dir -r requirements-build.txt && \
104
+ PYARROW_WITH_PARQUET=1 \
105
+ PYARROW_WITH_DATASET=1 \
106
+ PYARROW_WITH_FILESYSTEM=1 \
107
+ PYARROW_WITH_JSON=1 \
108
+ PYARROW_WITH_CSV=1 \
109
+ PYARROW_PARALLEL=$(nproc) \
110
+ python setup.py build_ext --build-type=release --bundle-arrow-cpp bdist_wheel && \
111
+ mkdir -p /tmp/wheels && \
112
+ cp dist/pyarrow-*.whl /tmp/wheels/ && \
113
+ # Ensure wheels directory exists and has content
114
+ ls -la /tmp/wheels/; \
115
+ else \
116
+ # Create empty wheels directory for non-s390x
117
+ mkdir -p /tmp/wheels; \
118
+ fi
119
+
28
120
#######################
29
121
# runtime-datascience #
30
122
#######################
31
123
FROM base AS runtime-datascience
32
124
125
+ ARG TARGETARCH
33
126
ARG DATASCIENCE_SOURCE_CODE=runtimes/datascience/ubi9-python-3.12
34
127
35
128
LABEL name="odh-notebook-runtime-datascience-ubi9-python-3.12" \
@@ -44,16 +137,37 @@ LABEL name="odh-notebook-runtime-datascience-ubi9-python-3.12" \
44
137
45
138
WORKDIR /opt/app-root/bin
46
139
140
+ USER 0
141
+ # Copy wheels from build stage (s390x only)
142
+ COPY --from=s390x-builder /tmp/wheels /tmp/wheels
143
+ RUN if [ "$TARGETARCH" = "s390x" ]; then \
144
+ pip install --no-cache-dir /tmp/wheels/*.whl && rm -rf /tmp/wheels; \
145
+ else \
146
+ echo "Skipping wheel install for $TARGETARCH"; \
147
+ fi
148
+
47
149
# Install Python packages from requirements.txt
48
150
COPY ${DATASCIENCE_SOURCE_CODE}/requirements.txt ./
49
151
# Copy Elyra dependencies for air-gapped enviroment
50
152
COPY ${DATASCIENCE_SOURCE_CODE}/utils ./utils/
51
153
52
- RUN echo "Installing softwares and packages" && \
53
- # This may have to download and compile some dependencies, and as we don't lock requirements from `build-system.requires`,
54
- # we often don't know the correct hashes and `--require-hashes` would therefore fail on non amd64, where building is common.
55
- uv pip install --strict --no-deps --no-cache --no-config --no-progress --verify-hashes --compile-bytecode --index-strategy=unsafe-best-match --requirements=./requirements.txt --build-constraints=./requirements.txt && \
56
- # Fix permissions to support pip in Openshift environments \
154
+ RUN --mount=type=cache,target=/root/.cache/pip \
155
+ echo "Installing softwares and packages" && \
156
+ if [ "$TARGETARCH" = "s390x" ]; then \
157
+ # For s390x, we need special flags and environment variables for building packages
158
+ GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 \
159
+ CFLAGS="-O3" CXXFLAGS="-O3" \
160
+ uv pip install --strict --no-deps --no-cache --no-config --no-progress \
161
+ --verify-hashes --compile-bytecode --index-strategy=unsafe-best-match \
162
+ --requirements=./requirements.txt --build-constraints=./requirements.txt; \
163
+ else \
164
+ # This may have to download and compile some dependencies, and as we don't lock requirements from `build-system.requires`,
165
+ # we often don't know the correct hashes and `--require-hashes` would therefore fail on non amd64, where building is common.
166
+ uv pip install --strict --no-deps --no-cache --no-config --no-progress \
167
+ --verify-hashes --compile-bytecode --index-strategy=unsafe-best-match \
168
+ --requirements=./requirements.txt --build-constraints=./requirements.txt; \
169
+ fi && \
170
+ # Fix permissions to support pip in Openshift environments
57
171
chmod -R g+w /opt/app-root/lib/python3.12/site-packages && \
58
172
fix-permissions /opt/app-root -P
59
173
0 commit comments