-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: Unify dockerfile across all workspaces and add tests
- Loading branch information
Showing
10 changed files
with
564 additions
and
247 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,50 +1,102 @@ | ||
# Base Image : https://hub.docker.com/r/osrf/ros/tags?page=1&name=humble | ||
FROM osrf/ros:humble-desktop-full | ||
FROM osrf/ros:humble-desktop-full AS amd64 | ||
# Base Image : https://hub.docker.com/r/arm64v8/ros/tags?page=1&name=humble | ||
FROM arm64v8/ros:humble AS arm64 | ||
|
||
# Use docker automatic platform args to select the base image. | ||
# It may be `arm64` or `amd64` depending on the platform. | ||
# Ref: https://docs.docker.com/reference/dockerfile/#automatic-platform-args-in-the-global-scope | ||
FROM $TARGETARCH | ||
|
||
LABEL org.opencontainers.image.authors="[email protected]" | ||
|
||
# Arguments for the default user | ||
ARG USERNAME=user | ||
ARG USER_UID=1000 | ||
ARG USER_GID=$USER_UID | ||
|
||
# Create the user | ||
RUN groupadd --gid $USER_GID $USERNAME \ | ||
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ | ||
# | ||
# [Optional] Add sudo support. Omit if you don't need to install software after connecting. | ||
&& apt-get update \ | ||
&& apt-get install -y sudo \ | ||
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ | ||
&& chmod 0440 /etc/sudoers.d/$USERNAME \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
RUN apt-get update && apt-get upgrade -y \ | ||
|
||
# Keep downloaded packages for caching purposes | ||
# Ref: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#example-cache-apt-packages | ||
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache | ||
|
||
# Upgrade packages | ||
# Ref: https://pythonspeed.com/articles/security-updates-in-docker/ | ||
# Ref: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#example-cache-apt-packages | ||
# Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1264502398 | ||
# Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1987107404 | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get upgrade -y \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
RUN apt-get update && apt-get install -y python3-pip \ | ||
|
||
# Install sudo and create a user with sudo privileges | ||
# Ref: https://stackoverflow.com/a/65434659 | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y sudo \ | ||
&& useradd -m -s /bin/bash -u $USER_UID -G sudo $USERNAME \ | ||
&& echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
ENV SHELL /bin/bash | ||
|
||
# Install common tools | ||
RUN apt-get update && apt-get install -y \ | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
curl \ | ||
git \ | ||
git-extras \ | ||
htop \ | ||
iputils-ping \ | ||
nano \ | ||
net-tools \ | ||
tmux \ | ||
tree \ | ||
unzip \ | ||
vim \ | ||
wget \ | ||
zip \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# Install Python pip | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
python3-pip \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# Install turtlebot3, RVIZ, Gazebo and Cartographer | ||
RUN apt-get update && apt-get install -y \ | ||
ros-$ROS_DISTRO-gazebo-ros-pkgs \ | ||
# Install custom tools | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
git-extras \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# Install ROS2 Gazebo packages for amd64 | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
if [ "$TARGETARCH" = "amd64" ]; then \ | ||
apt-get update && apt-get install -y \ | ||
ros-$ROS_DISTRO-gazebo-ros-pkgs \ | ||
ros-$ROS_DISTRO-gazebo-ros2-control \ | ||
&& rm -rf /var/lib/apt/lists/*; \ | ||
fi | ||
|
||
# Install ROS2 RVIZ and other custom ROS2 packages | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
ros-$ROS_DISTRO-rviz2 \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# TODO: Add more commands here | ||
# For example, to install additional packages, uncomment the following lines and add the package names | ||
# RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
# apt-get update && apt-get install -y \ | ||
# $OTHER_PACKAGES \ | ||
# && rm -rf /var/lib/apt/lists/* | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
ros-$ROS_DISTRO-cartographer \ | ||
ros-$ROS_DISTRO-turtlebot3* \ | ||
ros-$ROS_DISTRO-rqt-robot-steering \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
COPY .bashrc /home/$USERNAME/.bashrc | ||
|
||
USER $USERNAME | ||
# Create Gazebo cache directory with correct ownership to avoid permission issues after volume mount | ||
RUN mkdir /home/$USERNAME/.gazebo | ||
# TODO: Run additional commands as non-root user here | ||
COPY .bashrc /home/$USERNAME/.bashrc | ||
# TODO: Copy additional files here | ||
ENTRYPOINT [] | ||
CMD ["/bin/bash"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,64 +1,92 @@ | ||
# Base Image : https://hub.docker.com/r/arm64v8/ros/tags?page=1&name=humble | ||
FROM arm64v8/ros:humble AS arm64 | ||
# Base Image : https://hub.docker.com/r/osrf/ros/tags?page=1&name=humble | ||
FROM osrf/ros:humble-desktop-full AS amd64 | ||
# Base Image : https://hub.docker.com/r/arm64v8/ros/tags?page=1&name=humble | ||
FROM arm64v8/ros:humble AS arm64 | ||
|
||
# Use docker automatic platform args to select the base image. | ||
# It may be `arm64` or `amd64` depending on the platform. | ||
# Reference: | ||
# - https://docs.docker.com/reference/dockerfile/#automatic-platform-args-in-the-global-scope | ||
# Ref: https://docs.docker.com/reference/dockerfile/#automatic-platform-args-in-the-global-scope | ||
FROM $TARGETARCH | ||
|
||
LABEL org.opencontainers.image.authors="[email protected]" | ||
|
||
ARG TARGETARCH | ||
# Arguments for the default user | ||
ARG USERNAME=user | ||
ARG USER_UID=1000 | ||
ARG USER_GID=$USER_UID | ||
|
||
# Create the user | ||
RUN groupadd --gid $USER_GID $USERNAME \ | ||
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ | ||
# | ||
# [Optional] Add sudo support. Omit if you don't need to install software after connecting. | ||
&& apt-get update \ | ||
&& apt-get install -y sudo \ | ||
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ | ||
&& chmod 0440 /etc/sudoers.d/$USERNAME \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
RUN apt-get update && apt-get upgrade -y \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
RUN apt-get update && apt-get install -y python3-pip \ | ||
# Keep downloaded packages for caching purposes | ||
# Ref: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#example-cache-apt-packages | ||
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache | ||
|
||
# Upgrade packages | ||
# Ref: https://pythonspeed.com/articles/security-updates-in-docker/ | ||
# Ref: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#example-cache-apt-packages | ||
# Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1264502398 | ||
# Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1987107404 | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get upgrade -y \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
ENV SHELL /bin/bash | ||
|
||
# ******************************************************** | ||
# * Anything else you want to do like clean up goes here * | ||
# ******************************************************** | ||
# Install sudo and create a user with sudo privileges | ||
# Ref: https://stackoverflow.com/a/65434659 | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y sudo \ | ||
&& useradd -m -s /bin/bash -u $USER_UID -G sudo $USERNAME \ | ||
&& echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# Install common tools | ||
RUN apt-get update && apt-get install -y \ | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
curl \ | ||
git \ | ||
git-extras \ | ||
htop \ | ||
iputils-ping \ | ||
nano \ | ||
net-tools \ | ||
tmux \ | ||
tree \ | ||
unzip \ | ||
vim \ | ||
wget \ | ||
zip \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# Install Python pip | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
python3-pip \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# Install custom tools | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
git-extras \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
RUN if [ "$TARGETARCH" = "amd64" ]; then \ | ||
# Install ROS2 Gazebo packages for amd64 | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
if [ "$TARGETARCH" = "amd64" ]; then \ | ||
apt-get update && apt-get install -y \ | ||
ros-$ROS_DISTRO-gazebo-ros-pkgs \ | ||
ros-$ROS_DISTRO-gazebo-ros2-control \ | ||
&& rm -rf /var/lib/apt/lists/*; \ | ||
fi | ||
|
||
# Install ROS2 packages | ||
RUN apt-get update && apt-get install -y \ | ||
# Install ROS2 RVIZ and other custom ROS2 packages | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
ros-$ROS_DISTRO-rviz2 \ | ||
# | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# TODO: Add more commands here | ||
# For example, to install additional packages, uncomment the following lines and add the package names | ||
# RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
# apt-get update && apt-get install -y \ | ||
# $OTHER_PACKAGES \ | ||
# && rm -rf /var/lib/apt/lists/* | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
apt-get update && apt-get install -y \ | ||
# The packages below are used by the Husky repository. | ||
ros-$ROS_DISTRO-controller-manager \ | ||
ros-$ROS_DISTRO-diff-drive-controller \ | ||
|
@@ -83,28 +111,34 @@ RUN apt-get update && apt-get install -y \ | |
ros-$ROS_DISTRO-slam-toolbox \ | ||
ros-$ROS_DISTRO-imu-tools \ | ||
ros-$ROS_DISTRO-teleop-twist-keyboard \ | ||
&& sudo rm -rf /var/lib/apt/lists/* | ||
|
||
COPY .bashrc /home/$USERNAME/.bashrc | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# [Optional] Set the default user. Omit if you want to keep the default as root. | ||
USER $USERNAME | ||
CMD ["/bin/bash"] | ||
# Create Gazebo cache directory with correct ownership to avoid permission issues after volume mount | ||
RUN mkdir /home/$USERNAME/.gazebo | ||
# TODO: Run additional commands as non-root user here | ||
COPY .bashrc /home/$USERNAME/.bashrc | ||
# TODO: Copy additional files here | ||
|
||
# Setup husky controller by the script. | ||
# Build certain packages from source for arm64. | ||
COPY script /home/$USERNAME/script | ||
RUN sudo apt-get update \ | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
sudo apt-get update \ | ||
&& bash -ie /home/$USERNAME/script/install-clearpath-robot.sh \ | ||
&& sudo rm -rf /var/lib/apt/lists/* | ||
# Note: The script need to be run as user, not root. | ||
# Reference: https://github.com/clearpathrobotics/clearpath_computer_installer/tree/main | ||
COPY clearpath_computer_installer /home/$USERNAME/clearpath_computer_installer | ||
RUN sudo apt-get update \ | ||
RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ | ||
sudo apt-get update \ | ||
&& bash -ie /home/$USERNAME/clearpath_computer_installer/clearpath_computer_installer.sh \ | ||
&& sudo rm -rf /var/lib/apt/lists/* | ||
# Setup udev rules. | ||
COPY udev_rules /home/$USERNAME/udev_rules | ||
RUN /home/$USERNAME/udev_rules/install_udev_rules.sh | ||
# Generate robot configuration files. | ||
RUN bash -ie /home/$USERNAME/script/husky-generate.sh | ||
|
||
ENTRYPOINT [] | ||
CMD ["/bin/bash"] |
Oops, something went wrong.