diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e170af965..579519466 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,6 +11,7 @@ # pre-commit autoupdate # # See https://github.com/pre-commit/pre-commit +exclude: ^src/external_dependencies/ repos: # Standard hooks - repo: https://github.com/pre-commit/pre-commit-hooks @@ -57,7 +58,7 @@ repos: [ "--no-warnings", "--config-data", - "{extends: default, rules: {line-length: disable, braces: {max-spaces-inside: 1}, indentation: {spaces: consistent, indent-sequences: whatever}}}", + "{extends: default, rules: {line-length: disable, braces: {max-spaces-inside: 1}, indentation: disable, empty-lines: {max-end: 0, max-start: 1}}}", ] types: [text] files: \.(yml|yaml)$ @@ -69,9 +70,13 @@ repos: # NOTE: Broken on arm64. Will need to bump once https://github.com/hadolint/hadolint/issues/840 is fixed. - repo: https://github.com/hadolint/hadolint - rev: v2.10.0 + rev: v2.11.0 hooks: - - id: hadolint-docker + - id: hadolint + name: "Lint Dockerfiles" + language: docker_image + types: ["dockerfile"] + entry: hadolint/hadolint:2.11.0 hadolint - repo: https://github.com/pre-commit/mirrors-prettier rev: "v3.1.0" diff --git a/Dockerfile b/Dockerfile index ab66b73fb..8a28fcbda 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,17 +47,9 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ /home/${USERNAME}/.ros && \ chown -R $USER_UID:$USER_GID /home/${USERNAME} /opt/overlay_ws/ -# IMPORTANT: Optionally install Nvidia drivers for improved simulator performance with Nvidia GPUs. -# To do this you must -# 1. Uncomment the ENV and RUN entries below -# 2. Replace the 'nvidia-driver-555' apt package with the Nvidia driver version on your host, e.g. nvidia-driver-535, nvidia-driver-555. Use nvidia-smi on your host to determine the driver version. -# After rebuilding via `moveit_pro build` verify the drivers are active in your container by running `nvidia_smi` inside of `moveit_pro shell`. -# ENV DEBIAN_FRONTEND=noninteractive -# RUN apt update && apt install -y software-properties-common -# RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ -# --mount=type=cache,target=/var/lib/apt,sharing=locked \ -# add-apt-repository ppa:graphics-drivers/ppa && \ -# apt update && apt upgrade -y && apt install -y nvidia-driver-555 +# Add user to dialout group to enable communication with serial USB devices (gripper, FTS, ...) +# Add user to video group to enable communication with cameras +RUN usermod -aG dialout,video ${USERNAME} # Install additional dependencies # You can also add any necessary apt-get install, pip install, etc. commands at this point. @@ -121,3 +113,129 @@ WORKDIR $USER_WS # Set up the user's .bashrc file and shell. CMD ["/usr/bin/bash"] + +################################################## +# Starting from the specified MoveIt Pro release with CUDA GPU # +################################################## +# The image tag is specified in the argument itself. +# hadolint ignore=DL3006 +FROM ${MOVEIT_STUDIO_BASE_IMAGE} AS base-gpu + +# Create a non-root user +ARG USERNAME +ARG USER_UID +ARG USER_GID + +# hadolint ignore=DL3008 +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update && apt-get install wget -y -q --no-install-recommends && \ + wget --progress=dot:giga https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb && \ + dpkg -i cuda-keyring_1.1-1_all.deb && \ + apt-get update && \ + apt-get install -q -y --no-install-recommends \ + libcudnn9-cuda-12 \ + libcudnn9-dev-cuda-12 \ + libcublas-12-6 \ + cuda-cudart-12-6 \ + libcurand-12-6 \ + libcufft-12-6 \ + libnvinfer10 \ + libnvinfer-plugin10 \ + libnvonnxparsers10 \ + libtree + +# Misleading name: onnxruntime_gpu is actually specifically the CUDA package. This is only shipped for x86-64 +RUN if [ "$(uname -m)" = "x86_64" ]; then pip3 install --no-cache-dir onnxruntime_gpu==1.19.0; fi + +# Copy source code from the workspace's ROS 2 packages to a workspace inside the container +ARG USER_WS=/home/${USERNAME}/user_ws +ENV USER_WS=${USER_WS} + +# Also mkdir with user permission directories which will be mounted later to avoid docker creating them as root +WORKDIR $USER_WS +# hadolint ignore=DL3008 +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + groupadd --gid $USER_GID ${USERNAME} && \ + useradd --uid $USER_UID --gid $USER_GID --shell /bin/bash --create-home ${USERNAME} && \ + apt-get update && \ + apt-get install -q -y --no-install-recommends sudo && \ + echo ${USERNAME} ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/${USERNAME} && \ + chmod 0440 /etc/sudoers.d/${USERNAME} && \ + cp -r /etc/skel/. /home/${USERNAME} && \ + mkdir -p \ + /home/${USERNAME}/.ccache \ + /home/${USERNAME}/.config \ + /home/${USERNAME}/.ignition \ + /home/${USERNAME}/.colcon \ + /home/${USERNAME}/.ros && \ + chown -R $USER_UID:$USER_GID /home/${USERNAME} /opt/overlay_ws/ + +# Install additional dependencies +# You can also add any necessary apt-get install, pip install, etc. commands at this point. +# NOTE: The /opt/overlay_ws folder contains MoveIt Pro binary packages and the source file. +# hadolint ignore=SC1091 +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + --mount=type=bind,target=${USER_WS}/,source=. \ + . /opt/overlay_ws/install/setup.sh && \ + apt-get update && \ + rosdep install -q -y \ + --from-paths src \ + --ignore-src + +# Set up colcon defaults for the new user +USER ${USERNAME} +RUN colcon mixin add default \ + https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml && \ + colcon mixin update && \ + colcon metadata add default \ + https://raw.githubusercontent.com/colcon/colcon-metadata-repository/master/index.yaml && \ + colcon metadata update +COPY colcon-defaults.yaml /home/${USERNAME}/.colcon/defaults.yaml + +# hadolint ignore=DL3002 +USER root + +# Set up the user's .bashrc file and shell. +CMD ["/usr/bin/bash"] + +################################################################### +# Target for the developer build which does not compile any code. # +################################################################### +FROM base-gpu AS user-overlay-gpu-dev + +ARG USERNAME +ARG USER_WS=/home/${USERNAME}/user_ws +ENV USER_WS=${USER_WS} + +# Install any additional packages for development work +# hadolint ignore=DL3008 +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + less \ + gdb \ + nano + +# Set up the user's .bashrc file and shell. +CMD ["/usr/bin/bash"] + +######################################### +# Target for compiled, deployable image with GPU support # +######################################### +FROM base-gpu AS user-overlay-gpu + +ARG USERNAME +ARG USER_WS=/home/${USERNAME}/user_ws +ENV USER_WS=${USER_WS} + +ENV LD_LIBRARY_PATH=/usr/local/lib/python3.10/dist-packages/onnxruntime/capi:/usr/lib/x86_64-linux-gnu:/usr/local/cuda-12.6/targets/x86_64-linux/lib:$LD_LIBRARY_PATH + +# Compile the workspace +WORKDIR $USER_WS + +# Set up the user's .bashrc file and shell. +CMD ["/usr/bin/bash"]