{"id":28938869,"url":"https://github.com/ika-rwth-aachen/docker-ros","last_synced_at":"2026-03-07T09:33:23.832Z","repository":{"id":170662780,"uuid":"633896298","full_name":"ika-rwth-aachen/docker-ros","owner":"ika-rwth-aachen","description":"docker-ros automatically builds development and deployment Docker images for your ROS-based repositories","archived":false,"fork":false,"pushed_at":"2026-02-25T13:19:48.000Z","size":1507,"stargazers_count":177,"open_issues_count":7,"forks_count":22,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-02-25T16:32:35.425Z","etag":null,"topics":["docker","github-actions","gitlab-ci","ros"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ika-rwth-aachen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-04-28T14:28:57.000Z","updated_at":"2026-02-16T14:46:19.000Z","dependencies_parsed_at":"2025-12-08T17:10:18.789Z","dependency_job_id":null,"html_url":"https://github.com/ika-rwth-aachen/docker-ros","commit_stats":null,"previous_names":["ika-rwth-aachen/docker-ros"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/ika-rwth-aachen/docker-ros","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ika-rwth-aachen%2Fdocker-ros","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ika-rwth-aachen%2Fdocker-ros/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ika-rwth-aachen%2Fdocker-ros/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ika-rwth-aachen%2Fdocker-ros/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ika-rwth-aachen","download_url":"https://codeload.github.com/ika-rwth-aachen/docker-ros/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ika-rwth-aachen%2Fdocker-ros/sbom","scorecard":{"id":483492,"data":{"date":"2025-08-11","repo":{"name":"github.com/ika-rwth-aachen/docker-ros","commit":"8428598249a66645c233d735307c51c4f6ced9d1"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.3,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"17 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":5,"reason":"Found 8/14 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/github.yml:1","Warn: no topLevel permission defined: .github/workflows/gitlab.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/github.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/ika-rwth-aachen/docker-ros/github.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/gitlab.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/ika-rwth-aachen/docker-ros/gitlab.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/gitlab.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/ika-rwth-aachen/docker-ros/gitlab.yml/main?enable=pin","Warn: containerImage not pinned by hash: docker/Dockerfile:4","Warn: containerImage not pinned by hash: docker/Dockerfile:163","Warn: containerImage not pinned by hash: docker/Dockerfile:263","Warn: containerImage not pinned by hash: docker/Dockerfile:271","Warn: containerImage not pinned by hash: docker/Dockerfile:280","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   5 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T17:12:47.445Z","repository_id":170662780,"created_at":"2025-08-19T17:12:47.445Z","updated_at":"2025-08-19T17:12:47.445Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30210852,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T09:02:10.694Z","status":"ssl_error","status_checked_at":"2026-03-07T09:02:08.429Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","github-actions","gitlab-ci","ros"],"created_at":"2025-06-22T23:32:33.324Z","updated_at":"2026-03-07T09:33:23.822Z","avatar_url":"https://github.com/ika-rwth-aachen.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"https://github.com/ika-rwth-aachen/docker-ros/raw/main/assets/logo.png\" height=130 align=\"right\"\u003e\n\n# *docker-ros* – Automated Containerization of ROS Apps\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/v/release/ika-rwth-aachen/docker-ros\"/\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/ika-rwth-aachen/docker-ros\"/\u003e\n  \u003ca href=\"https://github.com/ika-rwth-aachen/docker-ros/actions/workflows/github.yml\"\u003e\u003cimg src=\"https://github.com/ika-rwth-aachen/docker-ros/actions/workflows/github.yml/badge.svg\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ika-rwth-aachen/docker-ros/actions/workflows/gitlab.yml\"\u003e\u003cimg src=\"https://github.com/ika-rwth-aachen/docker-ros/actions/workflows/gitlab.yml/badge.svg\"/\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/ROS 2-humble|jazzy|kilted-293754\"/\u003e\n\u003c/p\u003e\n\n*docker-ros* automatically builds minimal container images of ROS applications.\n\n\u003e [!IMPORTANT]  \n\u003e This repository is open-sourced and maintained by the [**Institute for Automotive Engineering (ika) at RWTH Aachen University**](https://www.ika.rwth-aachen.de/).  \n\u003e **DevOps, Containerization and Orchestration of Software-Defined Vehicles** are some of many research topics within our [*Vehicle Intelligence \u0026 Automated Driving*](https://www.ika.rwth-aachen.de/en/competences/fields-of-research/vehicle-intelligence-automated-driving.html) domain.  \n\u003e If you would like to learn more about how we can support your advanced driver assistance and automated driving efforts, feel free to reach out to us!  \n\u003e :email: ***opensource@ika.rwth-aachen.de***\n\n- [About](#about)\n  - [Prerequisites](#prerequisites)\n- [Usage](#usage)\n  - [Build a minimal image for deployment](#build-a-minimal-image-for-deployment)\n  - [Build development and deployment images](#build-development-and-deployment-images)\n  - [Build multi-arch images](#build-multi-arch-images)\n  - [Build deployment image with additional industrial\\_ci check](#build-deployment-image-with-additional-industrial_ci-check)\n  - [Build multi-arch images on arch-specific self-hosted runners in parallel](#build-multi-arch-images-on-arch-specific-self-hosted-runners-in-parallel)\n  - [Build images locally](#build-images-locally)\n- [Advanced Dependencies](#advanced-dependencies)\n  - [Recursion](#recursion)\n  - [Package Blacklist](#package-blacklist)\n  - [Extra System Dependencies (*apt*)](#extra-system-dependencies-apt)\n  - [Extra System Dependencies (*pip*)](#extra-system-dependencies-pip)\n  - [Custom Installation Scripts](#custom-installation-scripts)\n  - [Extra Image Files](#extra-image-files)\n- [Additional Information](#additional-information)\n  - [User Setup](#user-setup)\n  - [Slim Deployment Image](#slim-deployment-image)\n- [Configuration Variables](#configuration-variables)\n\nWe recommend to use *docker-ros* in combination with our other tools for Docker and ROS.\n- [*docker-ros-ml-images*](https://github.com/ika-rwth-aachen/docker-ros-ml-images) provides machine learning-enabled ROS Docker images \u003ca href=\"https://github.com/ika-rwth-aachen/docker-ros-ml-images\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/ika-rwth-aachen/docker-ros-ml-images?style=social\"/\u003e\u003c/a\u003e\n- [*docker-run*](https://github.com/ika-rwth-aachen/docker-run) is a CLI tool for simplified interaction with Docker images \u003ca href=\"https://github.com/ika-rwth-aachen/docker-run\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/ika-rwth-aachen/docker-run?style=social\"/\u003e\u003c/a\u003e\n\n\n## About\n\n*docker-ros* provides a generic [Dockerfile](docker/Dockerfile) that can be used to build development and deployment Docker images for arbitrary ROS packages or package stacks. Building such images can easily be automated by integrating *docker-ros* into CI through the provided [GitHub action](action.yml) or [GitLab CI template](.gitlab-ci/docker-ros.yml). The development image built by *docker-ros* contains all required dependencies and the source code of your ROS-based repository. The deployment image only contains dependencies and the compiled binaries created by building the ROS packages in the repository. *docker-ros* is also able to build multi-arch Docker images for *amd64* and *arm64* architectures. In addition, [*slim*](https://github.com/slimtoolkit/slim) is integrated for slimming Docker image size of the deployment image by up to 30x (see [*Slim Deployment Image*](#slim-deployment-image)).\n\nThe Dockerfile performs the following steps to build these images:\n1. All dependency repositories that are defined in a `.repos` file anywhere in the repository are cloned using [*vcstool*](https://github.com/dirk-thomas/vcstool).\n2. *(optional)* Packages blacklisted in a special file `blacklisted-packages.txt` are removed from the workspace (see [*Advanced Dependencies*](#package-blacklist)).\n3. *(optional)* A special script `before_dependency_installation.sh` is executed to perform arbitrary installation commands, if needed (see [*Advanced Dependencies*](#custom-installation-scripts)).\n4. The ROS dependencies listed in each package's `package.xml` are installed by [*rosdep*](https://docs.ros.org/en/independent/api/rosdep/html/).\n5. *(optional)* Additional apt dependencies from a special file `additional-debs.txt` are installed, if needed (see [*Advanced Dependencies*](#extra-system-dependencies-apt)).\n6. *(optional)* Additional pip requirements from a special file `additional-pip-requirements.txt` are installed, if needed (see [*Advanced Dependencies*](#extra-system-dependencies-pip)).\n7. *(optional)* A special folder `additional-files/` is copied into the images, if needed (see [*Advanced Dependencies*](#extra-image-files)).\n8. *(optional)* A special script `custom.sh` is executed to perform arbitrary installation commands, if needed (see [*Advanced Dependencies*](#custom-installation-scripts)).\n9. *(deployment)* All ROS packages are built using `colcon` (ROS2).\n10. *(deployment)* A custom launch command is configured to run on container start.\n\n### Prerequisites\n\n*docker-ros* is made for automated execution in GitHub or GitLab CI pipelines. For local execution, see [*Build images locally*](#build-images-locally).\n\n\u003cdetails\u003e\u003csummary\u003eGitHub\u003c/summary\u003e\n\nGitHub offers free minutes on GitHub-hosted runners executing GitHub Actions, [see here](https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions). No further setup is required other than integrating *docker-ros* into your repository, see [*Usage*](#usage).\n\nNote that GitHub is currently only offering Linux runners based on the *amd64* architecture. *docker-ros* can also build multi-arch Docker images solely on the *amd64* platform through emulation, but performance can be improved greatly by deploying [self-hosted runners](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners) for the *arm64* platform.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eGitLab\u003c/summary\u003e\n\n\u003e [!NOTE]  \n\u003e - GitLab runners must be based on the Docker executor, [see here](https://docs.gitlab.com/runner/executors/docker.html)\n\u003e - GitLab runners must run in privileged mode for Docker-in-Docker, [see here](https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode)\n\u003e - GitLab runners must be tagged with tags `privileged` and either `amd64` or `arm64` depending on their architecture\n\nGitLab offers free minutes on GitLab-hosted runners executing GitLab CI pipelines on [gitlab.com](https://gitlab.com), [see here](https://docs.gitlab.com/runner/#use-gitlabcom-saas-runners). On self-hosted GitLab instances, you can set up self-hosted runners, [see here](https://docs.gitlab.com/runner/#use-self-managed-runners).\n\nNote that GitLab is currently only offering Linux runners based on the *amd64* architecture. *docker-ros* can also build multi-arch Docker images solely on the *amd64* platform through emulation, but performance can be improved greatly by deploying [self-hosted runners](https://docs.gitlab.com/runner/#use-self-managed-runners) for the *arm64* platform.\n\n\u003c/details\u003e\n\n\n## Usage\n\n*docker-ros* can easily be integrated into any GitHub or GitLab repository containing ROS packages. Example integrations can be found in the following sections. Configuration options can be found [here](#configuration-variables). For local execution, see [*Build images locally*](#build-images-locally).\n\n\u003cdetails open\u003e\u003csummary\u003eGitHub\u003c/summary\u003e\n\n*docker-ros* provides a [GitHub action](action.yml) that can simply be added to a job via the [`jobs.\u003cjob_id\u003e.steps[*].uses` keyword](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsuses). A quick start for GitHub Actions is found [here](https://docs.github.com/en/actions/quickstart).\n\n\u003c/details\u003e\n\n\u003cdetails open\u003e\u003csummary\u003eGitLab\u003c/summary\u003e\n\n*docker-ros* provides a [GitLab CI template](.gitlab-ci/docker-ros.yml) that can simply be included in a [`.gitlab-ci.yml`](https://docs.gitlab.com/ee/ci/yaml/gitlab_ci_yaml.html) file. A quick start for GitLab CI is found [here](https://docs.gitlab.com/ee/ci/quick_start/).\n\n\u003c/details\u003e\n\n### Build a minimal image for deployment\n\n\u003cdetails open\u003e\u003csummary\u003eGitHub\u003c/summary\u003e\n\n```yml\non: push\njobs:\n  docker-ros:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: ika-rwth-aachen/docker-ros@v1.8.2\n        with:\n          base-image: rwthika/ros2:jazzy\n          command: ros2 run my_pkg my_node\n```\n\n\u003c/details\u003e\n\n\u003cdetails open\u003e\u003csummary\u003eGitLab\u003c/summary\u003e\n\n```yml\ninclude:\n  - remote: https://raw.githubusercontent.com/ika-rwth-aachen/docker-ros/v1.8.2/.gitlab-ci/docker-ros.yml\n\nvariables:\n  BASE_IMAGE: rwthika/ros2:jazzy\n  COMMAND: ros2 run my_pkg my_node\n```\n\n\u003c/details\u003e\n\n### Build development and deployment images\n\n\u003cdetails\u003e\u003csummary\u003eGitHub\u003c/summary\u003e\n\n```yml\non: push\njobs:\n  docker-ros:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: ika-rwth-aachen/docker-ros@v1.8.2\n        with:\n          base-image: rwthika/ros2:jazzy\n          command: ros2 run my_pkg my_node\n          target: dev,run\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eGitLab\u003c/summary\u003e\n\n```yml\ninclude:\n  - remote: https://raw.githubusercontent.com/ika-rwth-aachen/docker-ros/v1.8.2/.gitlab-ci/docker-ros.yml\n\nvariables:\n  BASE_IMAGE: rwthika/ros2:jazzy\n  COMMAND: ros2 run my_pkg my_node\n  TARGET: dev,run\n```\n\n\u003c/details\u003e\n\n### Build multi-arch images\n\n\u003cdetails\u003e\u003csummary\u003eGitHub\u003c/summary\u003e\n\n```yml\non: push\njobs:\n  docker-ros:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: ika-rwth-aachen/docker-ros@v1.8.2\n        with:\n          base-image: rwthika/ros2:jazzy\n          command: ros2 run my_pkg my_node\n          target: dev,run\n          platform: amd64,arm64\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eGitLab\u003c/summary\u003e\n\n```yml\ninclude:\n  - remote: https://raw.githubusercontent.com/ika-rwth-aachen/docker-ros/v1.8.2/.gitlab-ci/docker-ros.yml\n\nvariables:\n  BASE_IMAGE: rwthika/ros2:jazzy\n  COMMAND: ros2 run my_pkg my_node\n  TARGET: dev,run\n  PLATFORM: amd64,arm64\n```\n\n\u003c/details\u003e\n\n### Build deployment image with additional industrial_ci check\n\n\u003cdetails\u003e\u003csummary\u003eGitHub\u003c/summary\u003e\n\n```yml\non: push\njobs:\n  docker-ros:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: ika-rwth-aachen/docker-ros@v1.8.2\n        with:\n          base-image: rwthika/ros2:jazzy\n          command: ros2 run my_pkg my_node\n          enable-industrial-ci: 'true'\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eGitLab\u003c/summary\u003e\n\n```yml\ninclude:\n  - remote: https://raw.githubusercontent.com/ika-rwth-aachen/docker-ros/v1.8.2/.gitlab-ci/docker-ros.yml\n\nvariables:\n  BASE_IMAGE: rwthika/ros2:jazzy\n  COMMAND: ros2 run my_pkg my_node\n  ENABLE_INDUSTRIAL_CI: 'true'\n```\n\n\u003c/details\u003e\n\n### Build multi-arch images on arch-specific self-hosted runners in parallel\n\n\u003cdetails\u003e\u003csummary\u003eGitHub\u003c/summary\u003e\n\n```yml\non: push\njobs:\n  docker-ros:\n    strategy:\n      matrix:\n        target: [dev, run]\n        platform: [amd64, arm64]\n    runs-on: [self-hosted, \"${{ matrix.platform }}\"]\n    steps:\n      - uses: ika-rwth-aachen/docker-ros@v1.8.2\n        with:\n          base-image: rwthika/ros2:jazzy\n          command: ros2 run my_pkg my_node\n          target: ${{ matrix.target }}\n          platform: ${{ matrix.platform }}\n          enable-singlearch-push: true\n      # TODO: manifest\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eGitLab\u003c/summary\u003e\n\n```yml\n# TODO\n```\n\n\u003c/details\u003e\n\n### Build images locally\n\n*docker-ros* can build Docker images locally by executing the [`build.sh`](scripts/build.sh) script.\n\n1. Clone *docker-ros* as a Git submodule to `docker/docker-ros` in your repository.\n    ```bash\n    # ros-repository/\n    mkdir -p docker\n    git submodule add https://github.com/ika-rwth-aachen/docker-ros.git docker/docker-ros\n    ```\n2. Configure the build using the same [environment variables](#configuration-variables) as used for GitLab CI and run [`build.sh`](scripts/build.sh), e.g.:\n    ```bash\n    # ros-repository/\n      BASE_IMAGE=\"rwthika/ros2:jazzy\" \\\n      COMMAND=\"ros2 run my_pkg my_node\" \\\n      IMAGE=\"my-image:latest\" \\\n    ./docker/docker-ros/scripts/build.sh\n    ```\n    \u003e [!NOTE]  \n    \u003e You can alternatively store your environment variable configuration in a `.env` file:\n    \u003e ```bash\n    \u003e # .env\n    \u003e BASE_IMAGE=\"rwthika/ros2:jazzy\"\n    \u003e COMMAND=\"ros2 run my_pkg my_node\"\n    \u003e IMAGE=\"my-image:latest\"\n    \u003e ```\n\n\n## Advanced Dependencies\n\nIn order to keep things organized, we recommend to place all *docker-ros* related files in a `docker` folder on top repository level.\n\n### Recursion\n\nMost of the steps listed in [*About*](#about) and below can be toggled between recursive and non-recursive mode, see [*Configuration Variables*](#configuration-variables). This usually means that not only special files on the top-level are considered (e.g., `docker/additional-requirements.txt`), but also files with the same name (e.g., `additional-requirements.txt`) that are found anywhere in the workspace, even after cloning the upstream repositories in step 1.\n\n### Package Blacklist\n\nIf your ROS-based repository (or any of your repository's upstream dependencies, see `.repos`) contains ROS packages that should neither be built nor be used for determining dependencies, you can blacklist those in a special `blacklisted-packages.txt` file.\n\nCreate a file `blacklisted-packages.txt` in your `docker` folder (or configure a different `BLACKLISTED_PACKAGES_FILE`) and list any ROS package name to blacklist.\n\n### Extra System Dependencies (*apt*)\n\nIf your ROS-based repository requires system dependencies that cannot be installed by specifying their [rosdep](https://docs.ros.org/en/independent/api/rosdep/html/) keys in a `package.xml`, you can use a special `additional-debs.txt` file.\n\nCreate a file `additional-debs.txt` in your `docker` folder (or configure a different `ADDITIONAL_DEBS_FILE`) and list any other dependencies that need to be installed via *apt*.\n\n### Extra System Dependencies (*pip*)\n\nIf your ROS-based repository requires Python dependencies that cannot be installed by specifying their [rosdep](https://docs.ros.org/en/independent/api/rosdep/html/) keys in a `package.xml`, you can use a special `additional-pip-requirements.txt` file.\n\nCreate a file `additional-pip-requirements.txt` in your `docker` folder (or configure a different `ADDITIONAL_PIP_FILE`) and list any other Python dependencies that need to be installed via *pip*.\n\n### Custom Installation Scripts\n\nIf your ROS-based repository requires to execute any other installation or pre-/post-installation steps, you can specify multiple custom scripts that are executed during the image building process. See the [configuration variable documentation](#configuration-variables) for the following variables.\n- `BEFORE_DEPENDENCY_IDENTIFICATION_SCRIPT`\n- `BEFORE_DEPENDENCY_INSTALLATION_SCRIPT`\n- `AFTER_DEPENDENCY_INSTALLATION_SCRIPT`\n\nCreate those scripts in your `docker` folder (or configure different filepaths via the specified environment variables).\n\n### Extra Image Files\n\nIf you need to have additional files present in the deployment image, you can use a special `additional-files` folder. The folder contents will be copied into the container before the custom installation script `custom.sh` is executed.\n\nCreate a folder `additional-files` in your `docker` folder (or configure a different `ADDITIONAL_FILES_DIR`) and place any files or directories in it. The contents will be copied to `/docker-ros/additional-files` in the image.\n\n\n## Additional Information\n\n### User Setup\n\nContainers of the provided images start with `root` user by default. If the two environment variables `DOCKER_UID` and `DOCKER_GID` are passed, a new user with the corresponding UID/GID is created on the fly. Most importantly, this features allows to mount and edit files of the host user in the container without having to deal with permission issues.\n\n```bash\ndocker run --rm -it -e DOCKER_UID=$(id -u) -e DOCKER_GID=$(id -g) -e DOCKER_USER=$(id -un) rwthika/ros:latest\n```\n\nThe password of the custom user is set to its username (`dockeruser:dockeruser` by default).\n\n### Slim Deployment Image\n\n*docker-ros* integrates the [*slim*](https://github.com/slimtoolkit/slim) toolkit for minifying container images. *slim* is enabled by default and will, in addition to the `run` deployment image, produce an additional `:latest-slim`-tagged minified image. Note that *slim* removes every single thing not needed for executing the default launch command. To balance image size and out-of-the-box functionality, the `/opt/ros` and `/docker-ros/ws/install` directories are preserved by default. The slimming process can be controlled via the `SLIM_BUILD_ARGS` configuration variable.\n\n\n## Configuration Variables\n\n\u003e [!NOTE]  \n\u003e *GitHub Action input* | *GitLab CI environment variable*\n\n- **`additional-debs-file` | `ADDITIONAL_DEBS_FILE`**  \n  Relative filepath to file containing additional apt deb packages to install  \n  *default:* `docker/additional-debs.txt`  \n- **`additional-files-dir` | `ADDITIONAL_FILES_DIR`**  \n  Relative path to directory containing additional files to copy into image  \n  *default:* `docker/additional-files`  \n- **`additional-pip-file` | `ADDITIONAL_PIP_FILE`**  \n  Relative filepath to file containing additional pip packages to install  \n  *default:* `docker/additional-pip-requirements.txt`\n- **`after-dependency-installation-script` | `AFTER_DEPENDENCY_INSTALLATION_SCRIPT`**  \n  Relative filepath to script containing commands to run after dependency installation  \n  *default:* `docker/custom.sh`\n- **`base-image` | `BASE_IMAGE`**  \n  Base image `name:tag`  \n  *required*\n- **`before-dependency-identification-script` | `BEFORE_DEPENDENCY_IDENTIFICATION_SCRIPT`**  \n  Relative filepath to script containing commands to run before dependency identification  \n  *default:* `docker/before_dependency_identification.sh`\n- **`before-dependency-installation-script` | `BEFORE_DEPENDENCY_INSTALLATION_SCRIPT`**  \n  Relative filepath to script containing commands to run before dependency installation  \n  *default:* `docker/before_dependency_installation.sh`\n- **`blacklisted-packages-file` | `BLACKLISTED_PACKAGES_FILE`**  \n  Relative filepath to file containing blacklisted packages  \n  *default:* `docker/blacklisted-packages.txt`\n- **`build-context` | `BUILD_CONTEXT`**  \n  Build context of Docker build process  \n  *default:* `${{ github.workspace }}` | `.`  \n- **`buildx-attestations` | `BUILDX_ATTESTATIONS`**  \n  Value passed to `docker buildx build --provenance` and `--sbom`  \n  *set to `false` for compatibility with older registries that reject attestation metadata*  \n  *default:* `false`\n- **`command` | `COMMAND`**  \n  Launch command of run image  \n  *required if `target=run`*  \n- **`cmake-args` | `CMAKE_ARGS`**  \n  CMake arguments to pass to `colcon build`  \n  *default:* `\"-DCMAKE_BUILD_TYPE=Release\"`  \n- **`dev-image-name` | `DEV_IMAGE_NAME`**  \n  Image name of dev image  \n  *default:* `\u003cIMAGE_NAME\u003e`  \n- **`dev-image-tag` | `DEV_IMAGE_TAG`**  \n  Image tag of dev image  \n  *default:* `\u003cIMAGE_TAG\u003e-dev`  \n- **`disable-ros-installation` | `DISABLE_ROS_INSTALLATION`**  \n  Disable automatic installation of `ros-$ROS_DISTRO-ros-core` package  \n  *e.g., if ROS is already installed in `base-image` and package is not available for the OS*  \n  *default:* `false`\n- **`-` | `DOCKER_ROS_GIT_REF`**  \n  Git ref of *docker-ros* to run in CI  \n  *default:* `main` \n- **`enable-checkout` | `-`**  \n  Enable [*checkout*](https://github.com/actions/checkout) action to (re-)download your repository prior to running the pipeline  \n  *default:* `true`\n- **`enable-checkout-submodules` | `-`**  \n  Enable submodules for the [*checkout*](https://github.com/actions/checkout) action (`false`|`true`|`recursive`)  \n  *default:* `recursive`\n- **`enable-checkout-lfs` | `-`**  \n  Enable [*Git LFS*](https://git-lfs.com/) support for the [*checkout*](https://github.com/actions/checkout) action  \n  *default:* `true` \n- **`enable-industrial-ci` | `ENABLE_INDUSTRIAL_CI`**  \n  Enable [*industrial_ci*](https://github.com/ros-industrial/industrial_ci)  \n  *default:* `false` \n- **`enable-push-as-latest` | `ENABLE_PUSH_AS_LATEST`**  \n  Push images with tag `latest`/`latest-dev` in addition to the configured image names  \n  *default:* `false`  \n- **`enable-singlearch-push` | `ENABLE_SINGLEARCH_PUSH`**  \n  Enable push of single arch images with `-amd64`/`-arm64` postfix  \n  *default:* `false` \n- **`enable-recursive-additional-debs` | `ENABLE_RECURSIVE_ADDITIONAL_DEBS`**  \n  Enable recursive discovery of files named `additional-debs-file`  \n  *default:* `false`\n- **`enable-recursive-additional-pip` | `ENABLE_RECURSIVE_ADDITIONAL_PIP`**  \n  Enable recursive discovery of files named `additional-pip-file`  \n  *default:* `false`\n- **`enable-recursive-after-dependency-installation-script` | `ENABLE_RECURSIVE_AFTER_DEPENDENCY_INSTALLATION_SCRIPT`**  \n  Enable recursive discovery of files named `after-dependency-installation-script`  \n  *default:* `false`\n- **`enable-recursive-before-dependency-installation-script` | `ENABLE_RECURSIVE_BEFORE_DEPENDENCY_INSTALLATION_SCRIPT`**  \n  Enable recursive discovery of files named `before-dependency-installation-script`  \n  *default:* `false`\n- **`enable-recursive-blacklisted-packages` | `ENABLE_RECURSIVE_BLACKLISTED_PACKAGES`**  \n  Enable recursive discovery of files named `blacklisted-packages-file`  \n  *default:* `false`\n- **`enable-recursive-vcs-import` | `ENABLE_RECURSIVE_VCS_IMPORT`**  \n  Enable recursive discovery of files named `*.repos`  \n  *default:* `true`\n- **`enable-slim` | `ENABLE_SLIM`**  \n  Enable an extra slimmed run image via [slim](https://github.com/slimtoolkit/slim) (only if `run` stage is targeted)  \n  *default:* `true`\n- **`git-https-password` | `GIT_HTTPS_PASSWORD`**  \n  Password for cloning private Git repositories via HTTPS  \n  *default:* `${{ github.token }}` | `$CI_JOB_TOKEN` \n- **`git-https-server` | `GIT_HTTPS_SERVER`**  \n  Server URL (without protocol) for cloning private Git repositories via HTTPS  \n  *default:* `github.com` | `$CI_SERVER_HOST:$CI_SERVER_PORT` \n- **`git-https-user` | `GIT_HTTPS_USER`**  \n  Username for cloning private Git repositories via HTTPS  \n  *default:* `${{ github.actor }}` | `gitlab-ci-token`  \n- **`git-ssh-known-host-keys` | `GIT_SSH_KNOWN_HOST_KEYS`**  \n  Known SSH host keys for cloning private Git repositories via SSH (may be obtained using `ssh-keyscan`)  \n- **`git-ssh-private-key` | `GIT_SSH_PRIVATE_KEY`**  \n  SSH private key for cloning private Git repositories via SSH  \n- **`image-name` | `IMAGE_NAME`**  \n  Image name of run image  \n  *default:* `ghcr.io/${{ github.repository }}` | `$CI_REGISTRY_IMAGE`  \n- **`image-tag` | `IMAGE_TAG`**  \n  Image tag of run image\n  *default:* `latest`  \n- **`platform` | `PLATFORM`**  \n  Target platform architecture (comma-separated list)  \n  *default:* runner architecture | `amd64`\n  *supported values:* `amd64`, `arm64`\n- **`registry` | `REGISTRY`**  \n  Docker registry to push images to  \n  *default:* `ghcr.io` | `$CI_REGISTRY`  \n- **`registry-password` | `REGISTRY_PASSWORD`**  \n  Docker registry password  \n  *default:* `${{ github.token }}` | `$CI_REGISTRY_PASSWORD`  \n- **`registry-user` | `REGISTRY_USER`**  \n  Docker registry username  \n  *default:* `${{ github.actor }}` | `$CI_REGISTRY_USER`  \n- **`rmw-implementation` | `RMW_IMPLEMENTATION`**  \n  ROS 2 middleware implementation  \n  *default:* `rmw_fastrtps_cpp`  \n  *supported values:* `rmw_zenoh_cpp`, `rmw_fastrtps_cpp`, `rmw_cyclonedds_cpp`, `rmw_gurumdds_cpp`, ...  \n- **`ros-distro` | `ROS_DISTRO`**  \n  ROS Distro  \n  *required if ROS is not installed in `base-image`*  \n  *supported values:* `rolling`, ..., `noetic`, ...\n- **`slim-build-args` | `SLIM_BUILD_ARGS`**  \n  [Arguments to `slim build`](https://github.com/slimtoolkit/slim?tab=readme-ov-file#build-command-options) (except for `--target` and `--tag`)  \n  *default:* `--sensor-ipc-mode proxy --continue-after=10 --show-clogs --http-probe=false --include-path /opt/ros --include-path /docker-ros/ws/install`  \n- **`slim-image-name` | `SLIM_IMAGE_NAME`**  \n  Image name of slim run image  \n  *default:* `\u003cIMAGE_NAME\u003e`  \n- **`slim-image-tag` | `SLIM_IMAGE_TAG`**  \n  Image tag of slim run image  \n  *default:* `\u003cIMAGE_TAG\u003e-slim`  \n- **`target` | `TARGET`**  \n  Target stage of Dockerfile (comma-separated list)  \n  *default:* `run`\n  *supported values:* `dev`, `run`\n- **`vcs-import-file` | `VCS_IMPORT_FILE`**  \n  Relative filepath to file containing additional repos to install via vcstools (only relevant if `enable-recursive-vcs-import=false`)  \n  *default:* `.repos`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fika-rwth-aachen%2Fdocker-ros","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fika-rwth-aachen%2Fdocker-ros","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fika-rwth-aachen%2Fdocker-ros/lists"}