Skip to content

Commit 74b5dc8

Browse files
committed
feat: new docker
Signed-off-by: Mete Fatih Cırıt <mfc@autoware.org>
1 parent f0ed2a7 commit 74b5dc8

8 files changed

Lines changed: 690 additions & 0 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
- name: Autoware development environment
2+
hosts: localhost
3+
connection: local
4+
vars:
5+
rosdistro:
6+
rmw_implementation:
7+
cuda_version:
8+
tensorrt_version:
9+
install_devel:
10+
cuda_install_drivers:
11+
spconv_version:
12+
cumm_version:
13+
pre_tasks:
14+
- name: Print configuration
15+
ansible.builtin.debug:
16+
msg:
17+
- rosdistro: "{{ rosdistro }}"
18+
- rmw_implementation: "{{ rmw_implementation }}"
19+
- cuda_version: "{{ cuda_version }}"
20+
- tensorrt_version: "{{ tensorrt_version }}"
21+
- install_devel: "{{ install_devel }}"
22+
- cuda_install_drivers: "{{ cuda_install_drivers }}"
23+
- spconv_version: "{{ spconv_version }}"
24+
- cumm_version: "{{ cumm_version }}"
25+
tags: [always]
26+
27+
roles:
28+
- role: autoware.dev_env.rmw_implementation
29+
tags: [base, core, universe, rmw]
30+
vars:
31+
rmw_implementation__rosdistro: "{{ rosdistro }}"
32+
rmw_implementation__name: "{{ rmw_implementation }}"
33+
34+
- role: autoware.dev_env.build_tools
35+
tags: [core, universe, ccache]
36+
37+
- role: autoware.dev_env.dev_tools
38+
tags: [core, universe, dev_tools]
39+
40+
- role: autoware.dev_env.ros2_dev_tools
41+
tags: [core, universe, ros2_dev_tools]
42+
43+
- role: autoware.dev_env.acados
44+
tags: [universe, acados]
45+
46+
- role: autoware.dev_env.geographiclib
47+
tags: [universe, geographiclib]
48+
49+
- role: autoware.dev_env.qt5ct_setup
50+
tags: [universe, qt5ct_setup]
51+
52+
- role: autoware.dev_env.cuda
53+
tags: [universe, nvidia, cuda]
54+
55+
- role: autoware.dev_env.tensorrt
56+
tags: [universe, nvidia, tensorrt]
57+
58+
- role: autoware.dev_env.spconv
59+
tags: [universe, nvidia, spconv]
60+
61+
- role: autoware.dev_env.artifacts
62+
tags: [universe, artifacts]

docker-new/README.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# Run Autoware in Docker
2+
3+
## Image Graph
4+
5+
```mermaid
6+
graph TD
7+
base(["base"])
8+
base --> core-dependencies(["core-dependencies"])
9+
core-dependencies --> core-devel(["core-devel"])
10+
core-devel --> universe-dependencies(["universe-dependencies"])
11+
universe-dependencies --> universe-dependencies-cuda(["universe-dependencies-cuda"])
12+
universe-dependencies --> universe-devel(["universe-devel"])
13+
universe-dependencies-cuda --> universe-devel-cuda(["universe-devel-cuda"])
14+
base --> core(["core"])
15+
core-devel -- " COPY /opt/autoware " --> core
16+
core --> universe-runtime-dependencies(["universe-runtime-dependencies"])
17+
universe-runtime-dependencies --> universe(["universe"])
18+
universe-runtime-dependencies --> universe-cuda(["universe-cuda"])
19+
universe-devel -- " COPY /opt/autoware " --> universe
20+
universe-devel-cuda -- " COPY /opt/autoware " --> universe-cuda
21+
classDef base fill: #e8e8e8, color: #333
22+
classDef devel fill: #bbdefb, color: #333
23+
classDef runtime fill: #c8e6c9, color: #333
24+
classDef cuda fill: #e1bee7, color: #333
25+
class base base
26+
class core-dependencies,core-devel,universe-dependencies,universe-devel devel
27+
class core,universe-runtime-dependencies,universe runtime
28+
class universe-dependencies-cuda,universe-devel-cuda,universe-cuda cuda
29+
```
30+
31+
## Images
32+
33+
| Image | Description | Use case |
34+
| ------------------------------- | -------------------------------------------------------------- | ---------------------------------------------------------- |
35+
| `base` | ROS base, sudo, pipx, ansible, RMW, user `aw` | Foundation for all other images |
36+
| `core-dependencies` | Build deps + compiled core packages (except autoware_core) | CI for autoware_core |
37+
| `core-devel` | Adds autoware_core build on top of core-dependencies | Development and CI for packages depending on autoware_core |
38+
| `core` | Runtime-only: rosdep exec deps + compiled core from core-devel | Lightweight core runtime |
39+
| `universe-dependencies` | Ansible universe roles + rosdep build deps for all of autoware | CI for autoware_universe |
40+
| `universe-dependencies-cuda` | Adds CUDA, TensorRT, spconv dev libs | CI for CUDA-dependent packages |
41+
| `universe-devel` | Builds all universe sources (no CUDA) | Development without GPU |
42+
| `universe-devel-cuda` | Builds all universe sources with CUDA | Development with GPU |
43+
| `universe-runtime-dependencies` | Runtime ansible roles + rosdep exec deps | Foundation for final runtime images |
44+
| `universe` | Runtime image with compiled autoware (no CUDA) | Deployment without GPU |
45+
| `universe-cuda` | Runtime image with compiled autoware + CUDA runtime libs | Deployment with GPU |
46+
47+
## Build
48+
49+
From the repository root:
50+
51+
```bash
52+
# Build all default targets (universe + universe-cuda)
53+
docker buildx bake -f docker-new/docker-bake.hcl
54+
55+
# Build a specific target (dependencies are resolved automatically)
56+
docker buildx bake -f docker-new/docker-bake.hcl core-dependencies
57+
docker buildx bake -f docker-new/docker-bake.hcl core-devel
58+
docker buildx bake -f docker-new/docker-bake.hcl universe-dependencies
59+
docker buildx bake -f docker-new/docker-bake.hcl universe-dependencies-cuda
60+
docker buildx bake -f docker-new/docker-bake.hcl universe-devel
61+
docker buildx bake -f docker-new/docker-bake.hcl universe-devel-cuda
62+
docker buildx bake -f docker-new/docker-bake.hcl core
63+
docker buildx bake -f docker-new/docker-bake.hcl universe-runtime-dependencies
64+
docker buildx bake -f docker-new/docker-bake.hcl universe
65+
docker buildx bake -f docker-new/docker-bake.hcl universe-cuda
66+
67+
# Override variables
68+
docker buildx bake -f docker-new/docker-bake.hcl --set *.args.ROS_DISTRO=humble
69+
```
70+
71+
## Usage
72+
73+
```bash
74+
xhost +local:docker
75+
76+
docker run --rm -it \
77+
--net host \
78+
--privileged \
79+
--gpus all \
80+
-e DISPLAY=$DISPLAY \
81+
-e NVIDIA_DRIVER_CAPABILITIES=all \
82+
-e NVIDIA_VISIBLE_DEVICES=all \
83+
-e HOST_UID=$(id -u) \
84+
-e HOST_GID=$(id -g) \
85+
-e QT_X11_NO_MITSHM=1 \
86+
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
87+
-v $HOME/autoware_map:/home/aw/autoware_map \
88+
-v $HOME/autoware_data:/home/aw/autoware_data \
89+
-v $HOME/projects/autoware:/home/aw/autoware \
90+
-w /home/aw/autoware \
91+
--runtime=nvidia \
92+
autoware:universe-jazzy-cuda \
93+
bash -c "source /opt/autoware/setup.bash && exec bash"
94+
```
95+
96+
Or run without volume mounting (the `autoware` folder is not present in the container):
97+
98+
```bash
99+
docker run --rm -it \
100+
--net host \
101+
autoware:core-jazzy
102+
```

docker-new/base.Dockerfile

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# check=skip=InvalidDefaultArgInFrom
2+
ARG ROS_DISTRO
3+
4+
FROM ros:${ROS_DISTRO}-ros-base AS base
5+
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
6+
7+
ARG ROS_DISTRO
8+
ARG RMW_IMPLEMENTATION
9+
ARG USERNAME=aw
10+
11+
RUN rm -f /etc/apt/apt.conf.d/docker-clean && \
12+
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
13+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
14+
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
15+
apt-get update && \
16+
apt-get install -y --no-install-recommends \
17+
sudo \
18+
pipx \
19+
bash-completion \
20+
gosu
21+
22+
RUN userdel -r ubuntu 2>/dev/null || true
23+
24+
RUN useradd -m -s /bin/bash -U ${USERNAME} && \
25+
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" >/etc/sudoers.d/90-user-nopasswd && \
26+
chmod 0440 /etc/sudoers.d/90-user-nopasswd && \
27+
sed -i 's/^#force_color_prompt=yes/force_color_prompt=yes/' /home/${USERNAME}/.bashrc
28+
29+
USER ${USERNAME}
30+
WORKDIR /home/${USERNAME}
31+
32+
# Make pipx shims visible during build steps and at runtime
33+
ENV PATH="/home/${USERNAME}/.local/bin:${PATH}"
34+
35+
# Ansible via pipx
36+
RUN --mount=type=cache,target=/home/aw/.cache/pip,uid=1000,gid=1000 \
37+
--mount=type=cache,target=/home/aw/.cache/pipx,uid=1000,gid=1000 \
38+
python3 -m pipx ensurepath && \
39+
pipx install --include-deps --force "ansible==10.*"
40+
41+
COPY --chown=${USERNAME}:${USERNAME} ansible-galaxy-requirements.yaml /tmp/ansible/
42+
COPY --chown=${USERNAME}:${USERNAME} ansible/ /tmp/ansible/ansible/
43+
44+
WORKDIR /tmp/ansible
45+
RUN ansible-galaxy collection install -f -r ansible-galaxy-requirements.yaml && \
46+
ansible-playbook autoware.dev_env.autoware_requirements \
47+
--tags rmw \
48+
-e rosdistro=${ROS_DISTRO} \
49+
-e rmw_implementation=${RMW_IMPLEMENTATION}
50+
51+
COPY docker-new/files/cyclonedds.xml /home/${USERNAME}/cyclonedds.xml
52+
ENV CYCLONEDDS_URI=file:///home/${USERNAME}/cyclonedds.xml
53+
54+
WORKDIR /home/${USERNAME}
55+
RUN rm -rf /tmp/ansible
56+
57+
# Entrypoint runs as root so it can adjust UID/GID, then drops to user
58+
# hadolint ignore=DL3002
59+
USER root
60+
COPY --chmod=755 docker-new/docker-entrypoint.sh /docker-entrypoint.sh
61+
62+
ENV ROS_DISTRO=${ROS_DISTRO}
63+
ENV USERNAME=${USERNAME}
64+
65+
ENTRYPOINT ["/docker-entrypoint.sh"]
66+
CMD ["/bin/bash"]

docker-new/core.Dockerfile

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# check=skip=InvalidDefaultArgInFrom
2+
ARG BASE_IMAGE
3+
4+
FROM ${BASE_IMAGE} AS core-dependencies
5+
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
6+
7+
COPY --chown=${USERNAME}:${USERNAME} ansible-galaxy-requirements.yaml /tmp/ansible/
8+
COPY --chown=${USERNAME}:${USERNAME} ansible/ /tmp/ansible/ansible/
9+
10+
WORKDIR /tmp/ansible
11+
RUN ansible-galaxy collection install -f -r ansible-galaxy-requirements.yaml && \
12+
ansible-playbook autoware.dev_env.autoware_requirements \
13+
--tags core \
14+
--skip-tags base \
15+
-e "rosdistro=${ROS_DISTRO}"
16+
17+
WORKDIR /home/${USERNAME}
18+
RUN rm -rf /tmp/ansible
19+
20+
ENV CC="/usr/lib/ccache/gcc"
21+
ENV CXX="/usr/lib/ccache/g++"
22+
ENV CCACHE_DIR="/home/aw/.ccache"
23+
24+
COPY --chown=${USERNAME}:${USERNAME} src/core/ /tmp/autoware/src/core/
25+
RUN rm -rf /tmp/autoware/src/core/autoware_core /tmp/autoware/src/core/autoware_rviz_plugins
26+
27+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
28+
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
29+
apt-get update && \
30+
. "/opt/ros/${ROS_DISTRO}/setup.sh" && \
31+
rosdep install -y --from-paths /tmp/autoware/src/core \
32+
--ignore-src \
33+
--rosdistro "${ROS_DISTRO}" \
34+
--dependency-types=build \
35+
--dependency-types=build_export \
36+
--dependency-types=buildtool \
37+
--dependency-types=buildtool_export \
38+
--dependency-types=test
39+
40+
RUN --mount=type=cache,target=/home/aw/.ccache,uid=1000,gid=1000 \
41+
. "/opt/ros/${ROS_DISTRO}/setup.sh" && \
42+
colcon build \
43+
--base-paths /tmp/autoware/src/core \
44+
--install-base /opt/autoware \
45+
--cmake-args -DCMAKE_BUILD_TYPE=Release && \
46+
rm -rf /tmp/autoware
47+
48+
FROM core-dependencies AS core-devel
49+
50+
COPY --chown=${USERNAME}:${USERNAME} src/core/autoware_core /tmp/autoware/src/core/autoware_core
51+
COPY --chown=${USERNAME}:${USERNAME} src/core/autoware_rviz_plugins /tmp/autoware/src/core/autoware_rviz_plugins
52+
53+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
54+
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
55+
apt-get update && \
56+
. "/opt/ros/${ROS_DISTRO}/setup.sh" && \
57+
. /opt/autoware/setup.sh && \
58+
rosdep install -y --from-paths /tmp/autoware/src/core \
59+
--ignore-src \
60+
--rosdistro "${ROS_DISTRO}" \
61+
--dependency-types=build \
62+
--dependency-types=build_export \
63+
--dependency-types=buildtool \
64+
--dependency-types=buildtool_export \
65+
--dependency-types=test
66+
67+
RUN --mount=type=cache,target=/home/aw/.ccache,uid=1000,gid=1000 \
68+
. "/opt/ros/${ROS_DISTRO}/setup.sh" && \
69+
. /opt/autoware/setup.sh && \
70+
colcon build \
71+
--base-paths /tmp/autoware/src/core/autoware_core \
72+
--install-base /opt/autoware \
73+
--cmake-args -DCMAKE_BUILD_TYPE=Release && \
74+
rm -rf /tmp/autoware
75+
76+
FROM ${BASE_IMAGE} AS core
77+
78+
COPY --from=core-devel /opt/autoware /opt/autoware
79+
80+
COPY src/core/ /tmp/src/core/
81+
82+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
83+
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
84+
apt-get update && \
85+
. "/opt/ros/${ROS_DISTRO}/setup.sh" && \
86+
rosdep install -y --from-paths /tmp/src/core \
87+
--dependency-types=exec \
88+
--ignore-src \
89+
--rosdistro "${ROS_DISTRO}" && \
90+
rm -rf /tmp/src

0 commit comments

Comments
 (0)