Files
PX4-Autopilot/Tools/packaging/Dockerfile.gazebo
Ramon Roche dcedef6168 build(sim): resolve SITL runtime deps via .deb Depends
The px4-gazebo .deb already declares OpenCV and gstreamer core library
deps via dpkg-shlibdeps, but Dockerfile.gazebo uses dpkg -x which
bypasses resolution. Switch to apt install ./px4-gazebo_*.deb so Depends
are resolved automatically.

Add the 5 gstreamer plugin packages (plugins-base/good/bad/ugly/libav)
to CPACK_DEBIAN_PACKAGE_DEPENDS since they're loaded at runtime via
gst_element_factory_make() and cannot be detected by shlibdeps.

Apply the same apt-install pattern to Dockerfile.sih so both images
build consistently.

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-21 15:37:48 -07:00

93 lines
3.7 KiB
Docker

# syntax=docker/dockerfile:1
# PX4 SITL Gazebo Harmonic runtime image
# Runs PX4 SITL with Gazebo Harmonic. Supports X11 forwarding for GUI.
#
# Build:
# make px4_sitl_default && cd build/px4_sitl_default && cpack -G DEB && cd ../..
# docker build -f Tools/packaging/Dockerfile.gazebo -t px4io/px4-sitl-gazebo:v1.17.0 build/px4_sitl_default/
#
# Run (headless):
# docker run --rm -it --network host px4io/px4-sitl-gazebo:v1.17.0
#
# Run (X11 GUI):
# xhost +local:docker
# docker run --rm -it --network host \
# -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
# --gpus all px4io/px4-sitl-gazebo:v1.17.0
#
# Persist flight logs on the host (ulog files):
# mkdir -p ./px4-logs
# docker run --rm -it --network host \
# -v $(pwd)/px4-logs:/root/.local/share/px4/rootfs/log \
# px4io/px4-sitl-gazebo:v1.17.0
FROM ubuntu:24.04
LABEL maintainer="PX4 Development Team"
LABEL description="PX4 SITL with Gazebo Harmonic simulation"
ENV DEBIAN_FRONTEND=noninteractive
ENV RUNS_IN_DOCKER=true
# Configure the OSRF Gazebo apt repo so Gazebo Harmonic (a Depends: of the
# px4-gazebo .deb) resolves from it in the install step below.
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 \
bc \
ca-certificates \
gnupg \
lsb-release \
wget \
&& wget -q https://packages.osrfoundation.org/gazebo.gpg \
-O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" \
> /etc/apt/sources.list.d/gazebo-stable.list \
&& apt-get update
# Install px4-gazebo via apt so its Depends (Gazebo Harmonic, OpenCV, GStreamer
# core libs, gstreamer plugin packages) are resolved automatically. The binary
# is stripped after install to trim image size (~a few MB).
COPY px4-gazebo_*.deb /tmp/
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get install -y --no-install-recommends \
/tmp/px4-gazebo_*.deb \
binutils \
&& strip /opt/px4-gazebo/bin/px4 \
&& apt-get purge -y binutils \
&& apt-get autoremove -y \
&& rm -f /tmp/px4-gazebo_*.deb \
&& ln -sf /opt/px4-gazebo/bin/px4-gazebo /usr/bin/px4-gazebo
# Create the DART physics engine symlink (avoids needing the -dev package)
RUN GZ_PHYSICS_DIR=$(find /usr/lib -maxdepth 3 -type d -name "engine-plugins" -path "*/gz-physics-7/*" 2>/dev/null | head -1) \
&& if [ -n "$GZ_PHYSICS_DIR" ] && [ -d "$GZ_PHYSICS_DIR" ]; then \
VERSIONED=$(ls "$GZ_PHYSICS_DIR"/libgz-physics*-dartsim-plugin.so.* 2>/dev/null | head -1) \
&& [ -n "$VERSIONED" ] \
&& ln -sf "$(basename "$VERSIONED")" "$GZ_PHYSICS_DIR/libgz-physics-dartsim-plugin.so"; \
fi
# Gazebo resource paths
ENV GZ_SIM_RESOURCE_PATH=/opt/px4-gazebo/share/gz/models:/opt/px4-gazebo/share/gz/worlds
ENV GZ_SIM_SYSTEM_PLUGIN_PATH=/opt/px4-gazebo/lib/gz/plugins
ENV GZ_SIM_SERVER_CONFIG_PATH=/opt/px4-gazebo/share/gz/server.config
ENV PX4_GZ_MODELS=/opt/px4-gazebo/share/gz/models
ENV PX4_GZ_WORLDS=/opt/px4-gazebo/share/gz/worlds
ENV PX4_SIM_MODEL=gz_x500
ENV HOME=/root
# MAVLink, MAVSDK, DDS
EXPOSE 14550/udp 14540/udp 8888/udp
# Platform-adaptive entrypoint: detects Docker Desktop (macOS/Windows) via
# host.docker.internal and configures MAVLink + DDS to target the host.
COPY px4-entrypoint.sh /opt/px4-gazebo/bin/px4-entrypoint.sh
RUN chmod +x /opt/px4-gazebo/bin/px4-entrypoint.sh
WORKDIR /root
ENTRYPOINT ["/opt/px4-gazebo/bin/px4-entrypoint.sh"]
CMD []