CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
394 lines
15 KiB
Docker
Executable File
394 lines
15 KiB
Docker
Executable File
# Copyright © Advanced Micro Devices, Inc., or its affiliates.
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
ARG BUILD_TYPE=prebuilt
|
|
ARG THEROCK_BASE_IMAGE=rocm/miopen:therock
|
|
|
|
# ============================================================================
|
|
# Common base image with all dependencies
|
|
# ============================================================================
|
|
FROM ubuntu:24.04 AS base
|
|
|
|
ARG CCACHE_COMMIT=8c107aada09df2a40930d7064bbec8120ee76c91
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
ENV HIP_PLATFORM=amd
|
|
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
|
|
|
|
# Setup ubsan environment to printstacktrace
|
|
ENV UBSAN_OPTIONS=print_stacktrace=1
|
|
ENV LC_ALL=C.UTF-8
|
|
ENV LANG=C.UTF-8
|
|
|
|
# Install dependencies
|
|
RUN apt-get update && apt-get install -y --allow-unauthenticated \
|
|
apt-utils \
|
|
automake \
|
|
bison \
|
|
build-essential \
|
|
ca-certificates \
|
|
cmake \
|
|
curl \
|
|
doxygen \
|
|
flex \
|
|
g++ \
|
|
gdb \
|
|
gfortran \
|
|
git \
|
|
git-lfs \
|
|
gnupg2 \
|
|
lbzip2 \
|
|
lcov \
|
|
libegl1-mesa-dev \
|
|
libncurses5-dev \
|
|
libnuma-dev \
|
|
libtool \
|
|
ninja-build \
|
|
patchelf \
|
|
pkg-config \
|
|
python3-dev \
|
|
python3-pip \
|
|
python3-venv \
|
|
redis \
|
|
rpm \
|
|
rsync \
|
|
software-properties-common \
|
|
stunnel \
|
|
sudo \
|
|
texinfo \
|
|
unzip \
|
|
vim \
|
|
wget \
|
|
xxd
|
|
|
|
# Install DVC
|
|
RUN mkdir -p /etc/apt/keyrings && \
|
|
wget -qO - https://dvc.org/deb/iterative.asc | sudo gpg --dearmor -o /etc/apt/keyrings/packages.iterative.gpg && \
|
|
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/packages.iterative.gpg] https://dvc.org/deb/ stable main" | sudo tee /etc/apt/sources.list.d/dvc.list && \
|
|
chmod 644 /etc/apt/keyrings/packages.iterative.gpg /etc/apt/sources.list.d/dvc.list && \
|
|
apt-get update && apt-get install -y dvc && \
|
|
apt-get clean && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# Install an init system
|
|
RUN wget -O /tmp/ccache.tar.gz https://github.com/ccache/ccache/archive/${CCACHE_COMMIT}.tar.gz && \
|
|
tar zxvf /tmp/ccache.tar.gz -C /tmp/ && mkdir /tmp/ccache-${CCACHE_COMMIT}/build && \
|
|
cd /tmp/ccache-${CCACHE_COMMIT}/build && \
|
|
cmake -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON .. && make -j install && rm -rf /tmp/* && \
|
|
ccache -s && \
|
|
cd /
|
|
|
|
# Purge packages conflicting with doc-requirements
|
|
RUN apt-get remove --purge -y python3-pyparsing python3-cryptography python3-jwt
|
|
|
|
# Add requirements files
|
|
ADD miopen/docs/sphinx/requirements.txt /doc-requirements.txt
|
|
|
|
# Install doc requirements
|
|
RUN pip3 install --break-system-packages -r /doc-requirements.txt && \
|
|
# Install an init system
|
|
wget https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
|
|
dpkg -i dumb-init_*.deb && rm dumb-init_*.deb && \
|
|
# Install cget && rbuild
|
|
pip3 install --break-system-packages https://github.com/pfultz2/cget/archive/b5dd36cafa2804e6146c5021eb2469c4b2d3ad42.tar.gz && \
|
|
pip3 install --break-system-packages https://github.com/RadeonOpenCompute/rbuild/archive/c33b1a7e74ae7f72379364b523f73d30fd4d765c.tar.gz && \
|
|
# Install pre-commit and clang-format pinned to match .pre-commit-config.yaml mirrors-clang-format rev
|
|
pip3 install --break-system-packages pre-commit clang-format==18.1.4 && \
|
|
# groupadd render && video
|
|
groupadd -f render && \
|
|
groupadd -f video && \
|
|
usermod -a -G render,video root
|
|
|
|
# ========================================================================================
|
|
# NIGHTLY: Build from source stage - clones and builds projects from TheRock that MIOpen
|
|
# depends on, with the exception of CK and external MIOpen deps which are built separately
|
|
# ========================================================================================
|
|
FROM base AS build_therock
|
|
|
|
ARG THEROCK_ASIC=gfx90a
|
|
ARG THEROCK_GIT_HASH=default
|
|
ARG THEROCK_BUILD_MODE=Release
|
|
ARG THEROCK_BUILD_PRESET=linux-release-package
|
|
ARG BUILD_JOBS=0
|
|
ARG ROCM_LIBRARIES_REF=default
|
|
ARG ROCM_SYSTEMS_REF=default
|
|
|
|
ARG USE_FIN="OFF"
|
|
ARG PREFIX=/usr/local
|
|
|
|
RUN git config --global user.email "docker@build.local" && \
|
|
git config --global user.name "Docker Build"
|
|
|
|
RUN git clone https://github.com/ROCm/TheRock.git
|
|
|
|
WORKDIR /TheRock
|
|
|
|
RUN if [ "$THEROCK_GIT_HASH" != "default" ]; then \
|
|
echo "Checking out specific hash: $THEROCK_GIT_HASH"; \
|
|
git fetch; \
|
|
git checkout $THEROCK_GIT_HASH; \
|
|
else \
|
|
echo "Using default branch"; \
|
|
fi
|
|
|
|
# Update rocm-libraries submodule to specific ref if provided
|
|
# we need to commit the change so that fetch_sources.py does not overwrite the change
|
|
RUN if [ "$ROCM_LIBRARIES_REF" != "default" ]; then \
|
|
echo "Updating rocm-libraries submodule to: $ROCM_LIBRARIES_REF"; \
|
|
git submodule update --init rocm-libraries && \
|
|
cd rocm-libraries && \
|
|
git fetch origin && \
|
|
git checkout $ROCM_LIBRARIES_REF && \
|
|
cd .. && \
|
|
git add rocm-libraries && \
|
|
git commit -m "Update rocm-libraries submodule to $ROCM_LIBRARIES_REF"; \
|
|
fi
|
|
|
|
# Update rocm-systems submodule to specific ref if provided
|
|
# we need to commit the change so that fetch_sources.py does not overwrite the change
|
|
RUN if [ "$ROCM_SYSTEMS_REF" != "default" ]; then \
|
|
echo "Updating rocm-systems submodule to: $ROCM_SYSTEMS_REF"; \
|
|
git submodule update --init rocm-systems && \
|
|
cd rocm-systems && \
|
|
git fetch origin && \
|
|
git checkout $ROCM_SYSTEMS_REF && \
|
|
cd .. && \
|
|
git add rocm-systems && \
|
|
git commit -m "Update rocm-systems submodule to $ROCM_SYSTEMS_REF"; \
|
|
fi
|
|
|
|
RUN python3 -m venv /opt/venv
|
|
|
|
# Adding the venv into the path activates the python virtual env in a way. We cant source it the
|
|
# normal way due to how dockerfiles run
|
|
ENV PATH="/opt/venv/bin:$PATH"
|
|
|
|
RUN pip install -r requirements.txt
|
|
|
|
RUN git config --global url."https://github.com/".insteadOf git@github.com: && \
|
|
git config --global credential.helper "!f() { echo username=anonymous; echo password=; }; f" && \
|
|
python ./build_tools/fetch_sources.py
|
|
|
|
RUN mkdir build
|
|
WORKDIR /TheRock/build
|
|
|
|
RUN if [ "$THEROCK_BUILD_MODE" = "Preset" ]; then \
|
|
echo "Building with TheRock preset: $THEROCK_BUILD_PRESET"; \
|
|
cmake .. \
|
|
--preset=$THEROCK_BUILD_PRESET \
|
|
-DCMAKE_INSTALL_PREFIX=/opt/rocm \
|
|
-DTHEROCK_ENABLE_ALL=OFF \
|
|
-DTHEROCK_ENABLE_PROFILER=ON \
|
|
-DTHEROCK_ENABLE_SYSDEPS=ON \
|
|
-DTHEROCK_ENABLE_BASE=ON \
|
|
-DTHEROCK_ENABLE_COMPILER=ON \
|
|
-DTHEROCK_ENABLE_CORE_RUNTIME=ON \
|
|
-DTHEROCK_ENABLE_HOST_BLAS=ON \
|
|
-DTHEROCK_ENABLE_HOST_SUITE_SPARSE=ON \
|
|
-DTHEROCK_ENABLE_HIP_RUNTIME=ON \
|
|
-DTHEROCK_ENABLE_OCL_RUNTIME=ON \
|
|
-DTHEROCK_ENABLE_ROCPROFV3=ON \
|
|
-DTHEROCK_ENABLE_ROCPROFILER_COMPUTE=ON \
|
|
-DTHEROCK_ENABLE_BLAS=ON \
|
|
-DTHEROCK_ENABLE_RAND=ON \
|
|
-DTHEROCK_ENABLE_ROCPROFSYS=ON \
|
|
-DTHEROCK_ENABLE_ROCPROF_TRACE_DECODER_BINARY=ON \
|
|
-DTHEROCK_ENABLE_ROCGDB=ON \
|
|
-DTHEROCK_AMDGPU_DIST_BUNDLE_NAME=multiarch \
|
|
-DTHEROCK_FLAG_KPACK_SPLIT_ARTIFACTS=OFF \
|
|
-DTHEROCK_AMDGPU_FAMILIES=$THEROCK_ASIC; \
|
|
else \
|
|
echo "Building with CMake build type: $THEROCK_BUILD_MODE"; \
|
|
cmake .. \
|
|
-GNinja \
|
|
-DCMAKE_BUILD_TYPE=$THEROCK_BUILD_MODE \
|
|
-DCMAKE_INSTALL_PREFIX=/opt/rocm \
|
|
-DTHEROCK_ENABLE_ALL=OFF \
|
|
-DTHEROCK_ENABLE_PROFILER=ON \
|
|
-DTHEROCK_ENABLE_SYSDEPS=ON \
|
|
-DTHEROCK_ENABLE_BASE=ON \
|
|
-DTHEROCK_ENABLE_COMPILER=ON \
|
|
-DTHEROCK_ENABLE_CORE_RUNTIME=ON \
|
|
-DTHEROCK_ENABLE_HOST_BLAS=ON \
|
|
-DTHEROCK_ENABLE_HOST_SUITE_SPARSE=ON \
|
|
-DTHEROCK_ENABLE_HIP_RUNTIME=ON \
|
|
-DTHEROCK_ENABLE_OCL_RUNTIME=ON \
|
|
-DTHEROCK_ENABLE_ROCPROFV3=ON \
|
|
-DTHEROCK_ENABLE_ROCPROFILER_COMPUTE=ON \
|
|
-DTHEROCK_ENABLE_BLAS=ON \
|
|
-DTHEROCK_ENABLE_RAND=ON \
|
|
-DTHEROCK_ENABLE_ROCPROFSYS=ON \
|
|
-DTHEROCK_ENABLE_ROCPROF_TRACE_DECODER_BINARY=ON \
|
|
-DTHEROCK_ENABLE_ROCGDB=ON \
|
|
-DTHEROCK_AMDGPU_DIST_BUNDLE_NAME=multiarch \
|
|
-DTHEROCK_BUILD_TESTING=OFF \
|
|
-DTHEROCK_FLAG_KPACK_SPLIT_ARTIFACTS=OFF \
|
|
-DTHEROCK_AMDGPU_FAMILIES=$THEROCK_ASIC; \
|
|
fi
|
|
|
|
RUN if [ "$BUILD_JOBS" = "0" ]; then \
|
|
cmake --build .; \
|
|
else \
|
|
echo "Building with $BUILD_JOBS parallel jobs"; \
|
|
cmake --build . -j$BUILD_JOBS; \
|
|
fi && \
|
|
cmake --install .
|
|
|
|
#============================================================================
|
|
# REGULAR: Use the pre-built ROCm image from TheRock to build the rest of
|
|
# the MIOpen environment
|
|
#============================================================================
|
|
FROM ${THEROCK_BASE_IMAGE} AS prebuilt_therock
|
|
|
|
# ============================================================================
|
|
# Select which build stage to use
|
|
# ============================================================================
|
|
FROM ${BUILD_TYPE}_therock AS therock
|
|
|
|
# ================================================================================
|
|
# REGULAR: Build and install other 3rd party deps using pre-built ROCm image
|
|
# ================================================================================
|
|
FROM base AS miopen_deps
|
|
COPY --from=therock /opt/rocm /opt/rocm
|
|
ARG THEROCK_ASIC=gfx90a
|
|
ARG PREFIX="/usr/local"
|
|
ARG USE_FIN="OFF"
|
|
|
|
# Add requirements files
|
|
ADD miopen/rbuild.ini /rbuild.ini
|
|
ADD miopen/requirements.txt /requirements.txt
|
|
ADD miopen/dev-requirements.txt /dev-requirements.txt
|
|
|
|
# rbuild is used to trigger build of requirements.txt, dev-requirements.txt.
|
|
# Composable Kernel install separated from rbuild
|
|
# Remove components that are already built by TheRock.
|
|
RUN cd / && \
|
|
sed -i '/composablekernel/d; /half/d; /nlohmann/d' /requirements.txt && \
|
|
if [ "$USE_FIN" = "ON" ]; then \
|
|
rbuild prepare -s fin -d ${PREFIX} -DGPU_ARCHS="${THEROCK_ASIC}"; \
|
|
else \
|
|
rbuild prepare -s develop -d ${PREFIX} -DGPU_ARCHS="${THEROCK_ASIC}"; \
|
|
fi
|
|
# ================================================================================
|
|
# NIGHTLY target: push this image as rocm/miopen:therock
|
|
# ================================================================================
|
|
FROM scratch AS update_therock
|
|
COPY --from=miopen_deps /opt/rocm /opt/rocm
|
|
COPY --from=miopen_deps /usr/local /usr/local
|
|
|
|
# ============================================================================
|
|
# Build and install CK
|
|
# ============================================================================
|
|
FROM miopen_deps AS build_ck
|
|
ARG THEROCK_ASIC=gfx90a
|
|
ADD miopen/script/redis-cli.conf /redis-cli.conf
|
|
ADD miopen/script/sccache_wrapper.sh /sccache_wrapper.sh
|
|
|
|
## Sccache binary built from source for ROCm, only install if MIOPEN_SCCACHE is defined
|
|
ENV SCCACHE_VERSION="0.14.0"
|
|
ENV SCCACHE_INSTALL_LOCATION=/usr/local/.cargo/bin
|
|
ENV PATH=$PATH:${SCCACHE_INSTALL_LOCATION}
|
|
ARG MIOPEN_SCCACHE=""
|
|
ENV MIOPEN_SCCACHE=$MIOPEN_SCCACHE
|
|
ARG COMPILER_LAUNCHER=""
|
|
ARG MIOPEN_SCCACHE_CUSTOM_CACHE_BUSTER="MiOpen-Docker-CK"
|
|
ARG THEROCK_ASIC=""
|
|
ENV THEROCK_ASIC=${THEROCK_ASIC}
|
|
|
|
# Copy Composable Kernel
|
|
COPY /composablekernel /composable_kernel
|
|
|
|
# Build and install Composable Kernel
|
|
RUN set -x && \
|
|
echo Building for GPU Archs: ${THEROCK_ASIC} && \
|
|
if [ "$MIOPEN_SCCACHE" != "" ]; then \
|
|
mkdir -p ${SCCACHE_INSTALL_LOCATION} && \
|
|
wget -qO sccache.tar.gz https://github.com/mozilla/sccache/releases/download/v$SCCACHE_VERSION/sccache-v$SCCACHE_VERSION-x86_64-unknown-linux-musl.tar.gz && \
|
|
tar -xzf sccache.tar.gz --strip-components=1 -C ${SCCACHE_INSTALL_LOCATION} && \
|
|
chmod +x ${SCCACHE_INSTALL_LOCATION}/sccache && \
|
|
export ROCM_PATH=/opt/rocm && \
|
|
export SCCACHE_ENABLED=true && \
|
|
export SCCACHE_LOG_LEVEL=debug && \
|
|
export SCCACHE_IDLE_TIMEOUT=14400 && \
|
|
export COMPILERS_HASH_DIR=/tmp/.sccache && \
|
|
export SCCACHE_BIN=${SCCACHE_INSTALL_LOCATION}/sccache && \
|
|
export SCCACHE_EXTRAFILES=/tmp/.sccache/rocm_compilers_hash_file && \
|
|
export SCCACHE_REDIS="redis://$MIOPEN_SCCACHE" && \
|
|
cd / && \
|
|
echo "connect = $MIOPEN_SCCACHE" >> redis-cli.conf && \
|
|
export SCCACHE_C_CUSTOM_CACHE_BUSTER="${MIOPEN_SCCACHE_CUSTOM_CACHE_BUSTER}" && \
|
|
echo $SCCACHE_C_CUSTOM_CACHE_BUSTER && \
|
|
stunnel redis-cli.conf && \
|
|
export PATH=$PATH:${SCCACHE_INSTALL_LOCATION} && \
|
|
./sccache_wrapper.sh --enforce_redis; \
|
|
fi &&\
|
|
# Clear the ROCM_PATH TheRock causes HIP errors
|
|
unset ROCM_PATH && \
|
|
cd /composable_kernel && \
|
|
mkdir build && cd build && \
|
|
#Get the number of threads and RAM available
|
|
num_threads=$(nproc) && \
|
|
ram_gb=$(free -g | awk '/^Mem:/{print $7}') && \
|
|
# CK's ram req per thread is ~4 GB,
|
|
# so limit the number of threads accordingly
|
|
if [ "$num_threads" -le 0 ]; then \
|
|
num_threads=1; \
|
|
fi && \
|
|
if [ "$ram_gb" -lt $((num_threads * 4)) ]; then \
|
|
if [ "$ram_gb" -ge 4 ]; then \
|
|
num_threads=$((ram_gb / 4)); \
|
|
else \
|
|
num_threads=1; \
|
|
fi; \
|
|
fi && \
|
|
echo Building CK with ${num_threads} threads && \
|
|
CXX=/opt/rocm/llvm/bin/amdclang++ cmake \
|
|
-G Ninja \
|
|
-D CMAKE_PREFIX_PATH=/opt/rocm \
|
|
-D CMAKE_CXX_COMPILER_LAUNCHER=${COMPILER_LAUNCHER} \
|
|
-D CMAKE_HIP_COMPILER_LAUNCHER=${COMPILER_LAUNCHER} \
|
|
-D CMAKE_C_COMPILER_LAUNCHER=${COMPILER_LAUNCHER} \
|
|
-D CMAKE_BUILD_TYPE=Release \
|
|
-D GPU_TARGETS="${THEROCK_ASIC}" \
|
|
-D MIOPEN_REQ_LIBS_ONLY=ON \
|
|
-D HIPTENSOR_REQ_LIBS_ONLY=OFF \
|
|
-D CMAKE_CXX_FLAGS=" -O3 " .. && \
|
|
ninja -j ${num_threads} install && \
|
|
if [ "$MIOPEN_SCCACHE" != "" ]; then \
|
|
sccache -s; \
|
|
fi
|
|
|
|
# ============================================================================
|
|
# REGULAR target: final MIOpen development environment
|
|
# ============================================================================
|
|
FROM base AS miopen
|
|
|
|
COPY --from=build_ck /opt/rocm /opt/rocm
|
|
COPY --from=build_ck /usr/local /usr/local
|
|
|
|
# Install clang-tidy-21 from the LLVM apt repo.
|
|
# clang-format is installed via pip (see above) pinned to match .pre-commit-config.yaml.
|
|
RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - && \
|
|
echo "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-21 main" | sudo tee /etc/apt/sources.list.d/llvm21.list
|
|
|
|
RUN apt-get update && apt-get install -y \
|
|
clang-tidy-21 \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Workaround for broken clang-tidy in TheRock
|
|
RUN mv /opt/rocm/llvm/bin/clang-tidy /opt/rocm/llvm/bin/clang-tidy.disabled || true
|
|
RUN ln -sf /usr/bin/clang-tidy-21 /opt/rocm/llvm/bin/clang-tidy
|
|
|
|
# Use update-alternatives to set default clang-tidy version
|
|
RUN update-alternatives --install /opt/rocm/llvm/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-21 100
|
|
RUN update-alternatives --set clang-tidy /usr/bin/clang-tidy-21
|
|
|
|
# Ensure the dynamic linker can find ROCm libraries by adding /opt/rocm/lib to the linker cache.
|
|
RUN printf '%s\n' /opt/rocm/lib > /etc/ld.so.conf.d/rocm.conf && ldconfig
|
|
|
|
ENV HIP_PLATFORM=amd
|
|
ENV PATH="/opt/rocm/bin:/opt/rocm:${PATH}"
|
|
ENV ROCM_PATH=/opt/rocm
|
|
|
|
WORKDIR /workspace
|