-
Notifications
You must be signed in to change notification settings - Fork 0
/
Dockerfile
205 lines (174 loc) · 7.01 KB
/
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
ARG FROM_IMAGE=ros:jazzy
ARG OVERLAY_WS=/opt/ros/overlay_ws
# multi-stage for extending ros2 installation
FROM $FROM_IMAGE AS ros-desktop
RUN apt update &&\
apt install -y --no-install-recommends\
ros-$ROS_DISTRO-desktop\
ros-$ROS_DISTRO-rqt*\
ros-$ROS_DISTRO-plotjuggler-ros\
&& rm -rf /var/lib/apt/lists/*
# multi-stage for caching
FROM $FROM_IMAGE AS cacher
#default value of args when not provided in the --build-arg
ARG ELASTICA=false
ARG HSA=false
ARG PNEUMATIC=false
ARG OVERLAY_WS
# copy the contents of the repo src folder to the cache image
# e.g. copy ./src to $OVERLAY_WS
COPY ./src $OVERLAY_WS
RUN apt update &&\
apt install -y --no-install-recommends\
openssh-client\
&& rm -rf /var/lib/apt/lists/*
# share ssh keys with the container
# Option 4 in: https://www.fastruby.io/blog/docker/docker-ssh-keys.html
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
WORKDIR $OVERLAY_WS/src
# clone sources
RUN --mount=type=ssh vcs import ./ < ../core.repos
RUN --mount=type=ssh if [ "${ELASTICA}" = false ]; then\
echo 'Not cloning Elastica';\
else\
echo "Cloning Elastica " &&\
vcs import ./ < ../elastica.repos ;\
fi
RUN --mount=type=ssh if [ "${HSA}" = false ]; then\
echo 'Not cloning HSA';\
else\
echo "Cloning HSA " &&\
vcs import ./ < ../hsa.repos ;\
fi
RUN --mount=type=ssh if [ "${PNEUMATIC}" = false ]; then\
echo 'Not cloning pneumatic robot dependencies.';\
else\
echo "Cloning pneumatic robot dependencies." &&\
vcs import ./ < ../pneumatic.repos ;\
fi
# copy manifests for caching
WORKDIR /opt
# RUN mkdir -p /tmp/opt && \
# find ./ -name "package.xml" | \
# xargs cp --parents -t /tmp/opt && \
# find ./ -name "COLCON_IGNORE" | \
# xargs cp --parents -t /tmp/opt || true
RUN mkdir -p /tmp/opt
RUN find ./ -name "package.xml" | xargs cp --parents -t /tmp/opt
# this code generates the following error currently:
# cp: missing file operand
# RUN find ./ -name "COLCON_IGNORE" | xargs cp --parents -t /tmp/opt || true
# multi-stage for building
FROM ros-desktop AS sr-ros2-bundles
SHELL ["/bin/bash", "-c"]
# default value of args when not provided in the --build-arg
ARG ELASTICA=false
ARG HSA=false
# we install jax by default as jax-soft-robot-modelling depends on it
ARG JAX=true
ARG PYTORCH=false
ARG SOFA=false
ARG SOFA_VERSION='21.06.02'
# install some general system dependencies
# libsdl1.2-dev is required for the ros2-keyboard package
# libpython3.7 is required by the Sofa binaries.
# In case of conflict with other version of python, consider removing the line
RUN apt update && apt install -y --no-install-recommends software-properties-common \
gh git-lfs htop iputils-ping libeigen3-dev libsdl1.2-dev nvtop openssh-client python3-pip python3-tk python3-venv vim wget unzip zip;\
if [ "${SOFA}" = "true" ]; then\
add-apt-repository -y ppa:deadsnakes/ppa && apt install -y libpython3.7 && add-apt-repository --remove -y ppa:deadsnakes/ppa;\
fi;\
pip3 install --break-system-packages -U pip;\
rm -rf /var/lib/apt/lists/*
ARG OVERLAY_WS
WORKDIR $OVERLAY_WS
# install pip dependencies
COPY src/requirements.txt $OVERLAY_WS/requirements.txt
RUN pip3 install --user --break-system-packages -r requirements.txt
# install jax with GPU support
# https://github.com/google/jax?tab=readme-ov-file#installation
RUN if [ "${JAX}" = "true" ]; then\
echo 'Installing JAX with GPU support';\
pip3 install --user --break-system-packages --upgrade "jax[cuda12]";\
fi
# install pytorch and libtorch
RUN if [ "${PYTORCH}" = "true" ]; then\
echo 'Installing PyTorch';\
pip3 install --break-system-packages torch torchvision;\
fi
WORKDIR /opt/sofa
RUN if [ "${SOFA}" = "false" ]; then\
echo 'Not installing Sofa';\
else\
echo 'Installing Sofa';\
export SOFA_NAME=SOFA_v${SOFA_VERSION}_Linux ;\
wget https://github.com/sofa-framework/sofa/releases/download/v${SOFA_VERSION}/${SOFA_NAME}.zip &&\
unzip ${SOFA_NAME}.zip;\
echo 'SofaPython3 NO_VERSION' >> ${SOFA_NAME}/lib/plugin_list.conf;\
echo 'SoftRobots NO_VERSION' >> ${SOFA_NAME}/lib/plugin_list.conf;\
rm ${SOFA_NAME}.zip &&\
mv $SOFA_NAME sofa_v${SOFA_VERSION};\
export QT_QPA_PLATFORM_PLUGIN_PATH=${QTDIR}/plugins &&\
export QT_PLUGIN_PATH=${QTDIR}/plugins;\
fi
WORKDIR $OVERLAY_WS
# Copy overlay src files
COPY --from=cacher $OVERLAY_WS/src ./src
# install overlay dependencies
RUN . /opt/ros/$ROS_DISTRO/setup.sh && \
apt-get update && rosdep install -y \
--from-path src \
--rosdistro $ROS_DISTRO \
--ignore-src \
&& rm -rf /var/lib/apt/lists/*
# install pip packages depending on local, cloned repositories
# nml bag: useful for processing ROS2 bag files in Python
RUN pip3 install --user --break-system-packages -e ./src/nml_bag
# install jax soft robot modelling if jax has been installed
RUN if [ "${JAX}" = "true" ]; then\
pip3 install --user --break-system-packages -e "./src/jsrm[dev, examples]";\
fi
# install ros2-elastica dependencies
RUN if [ "${ELASTICA}" = "false" ]; then\
echo 'Not installing Elastica';\
else\
echo "Installing Elastica " &&\
apt-get update &&\
apt-get install --no-install-recommends -y povray &&\
rm -rf /var/lib/apt/lists/*;\
fi
# install hsa-planar-control package and its dependencies
RUN if [ "${HSA}" = "true" ]; then\
pip3 install --user --break-system-packages ./src/hsa_planar_control;\
fi
# build overlay source
ARG OVERLAY_MIXINS="release"
RUN . /opt/ros/$ROS_DISTRO/setup.sh && \
colcon build \
--mixin $OVERLAY_MIXINS
# source entrypoint setup
ENV OVERLAY_WS=$OVERLAY_WS
RUN sed --in-place --expression \
'$isource "$OVERLAY_WS/install/setup.bash"' \
/ros_entrypoint.sh
# Add sourcing of workspace to .bashrc
RUN echo "source /opt/ros/$ROS_DISTRO/setup.bash" >> ~/.bashrc
RUN echo "source $OVERLAY_WS/install/setup.bash" >> ~/.bashrc
RUN echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
RUN echo "export _colcon_cd_root=~/ros2_install" >> ~/.bashrc
# set ROS_DOMAIN_ID
# ENV ROS_DOMAIN_ID=25
# install RMW middleware
# RUN apt-get update && \
# apt-get install -y ros-$ROS_DISTRO-rmw-cyclonedds-cpp \
# && rm -rf /var/lib/apt/lists/*
# ENV RMW_IMPLEMENTATION="rmw_cyclonedds_cpp"
# # Implement ROS2 networking with CYCLONE_DDS out of container
# # https://github.com/eclipse-cyclonedds/cyclonedds/issues/677#issuecomment-768966870
# ENV HOST_ADDR="192.168.200.169"
# # Using participant index
# ENV CYCLONEDDS_URI="<CycloneDDS><Domain id='any'><General><ExternalNetworkAddress>${HOST_ADDR}</ExternalNetworkAddress><AllowMulticast>false</AllowMulticast></General><Discovery><ParticipantIndex>1</ParticipantIndex><Peers><Peer address='${HOST_ADDR}'/></Peers></Discovery><Tracing><Verbosity>config</Verbosity><Out>stderr</Out></Tracing></Domain></CycloneDDS>"
# copy the vscode settings to the image
COPY ./src/vscode_settings.json $OVERLAY_WS/.vscode/settings.json
# run interactive shell
CMD ["/bin/bash"]