{"id":20957528,"url":"https://github.com/junobuild/juno-docker","last_synced_at":"2026-04-25T19:01:56.645Z","repository":{"id":215337036,"uuid":"737270154","full_name":"junobuild/juno-docker","owner":"junobuild","description":"📦 Juno Docker images for local dApp development and E2E tests","archived":false,"fork":false,"pushed_at":"2026-04-12T19:11:07.000Z","size":1385,"stargazers_count":4,"open_issues_count":10,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-12T21:11:14.257Z","etag":null,"topics":["container","docker","internet-computer","podman"],"latest_commit_sha":null,"homepage":"https://hub.docker.com/r/junobuild","language":"JavaScript","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/junobuild.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"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-12-30T12:23:17.000Z","updated_at":"2026-04-12T19:10:26.000Z","dependencies_parsed_at":"2026-03-13T07:13:02.667Z","dependency_job_id":null,"html_url":"https://github.com/junobuild/juno-docker","commit_stats":null,"previous_names":["junobuild/juno-docker"],"tags_count":111,"template":false,"template_full_name":null,"purl":"pkg:github/junobuild/juno-docker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junobuild%2Fjuno-docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junobuild%2Fjuno-docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junobuild%2Fjuno-docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junobuild%2Fjuno-docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/junobuild","download_url":"https://codeload.github.com/junobuild/juno-docker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junobuild%2Fjuno-docker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32273223,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T18:29:39.964Z","status":"ssl_error","status_checked_at":"2026-04-25T18:29:32.149Z","response_time":59,"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":["container","docker","internet-computer","podman"],"created_at":"2024-11-19T01:34:16.083Z","updated_at":"2026-04-25T19:01:56.625Z","avatar_url":"https://github.com/junobuild.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📦 Juno Docker\n\n[Juno] Docker images for local dApp development and E2E tests.\n\n![Multi-Arch](https://img.shields.io/badge/architecture-amd64%20%7C%20arm64-blue?style=flat-square)\n![GitHub release](https://img.shields.io/github/v/release/junobuild/juno-docker?label=version\u0026color=brightgreen\u0026style=flat-square)\n\n## Introduction\n\nThis repository provides Docker images to support local development with [Juno](https://juno.build), whether you're building a application using a Satellite or working directly on Juno’s core modules.\n\n\u003e [!NOTE]\n\u003e This README mentions two CLIs.\n\u003e\n\u003e 1. The \"custom-built CLI\" is a tool built within the Docker image that facilitates interactions with the container.\n\u003e 2. The \"Juno CLI\" or \"CLI\" is the command-line interface developers use on Juno to develop or upgrade their dApps.\n\n### 🧪 Juno Skylab Docker Image\n\nThe `junobuild/skylab` Docker image is an all-in-one emulator for local Juno development. It bundles everything you need to build, test, and explore the Juno ecosystem:\n\n- ✅ Juno Console (including UI)\n- 🛰️ Satellites (support for multiple application containers)\n- 📊 Orbiter (analytics and tracking module)\n- ⚙️ Supporting infrastructure (see table below)\n\nThis container mounts a sandboxed [Internet Computer](https://internetcomputer.org/) using the amazing [PocketIC](https://github.com/dfinity/pocketic). Once ready, a custom-built CLI takes care of deploying and setting up the modules during the first boot.\n\nIt also actively watches a shared folder, allowing you to live reload serverless functions written in Rust or TypeScript.\n\nThis container replicates the production experience locally. That's why, when building your project with it, you'll need to create your Satellites for testing through the Console UI, just as you would in production.\n\n### 🛰️ Juno Satellite Docker Image\n\nUnlike Skylab, this image runs a single Juno [Satellite](https://juno.build/docs/add-juno-to-an-app/create-a-satellite) in a sandboxed local environment.\n\nYou can configure the Satellite with a JSON file to define Datastore and Storage collections, additional controllers, and optional serverless extensions. Like Skylab, it also supports live reloading for these serverless functions through a shared folder.\n\nThe CLI watches configuration files and a dedicated `deploy` folder, automatically applying changes and upgrading modules as needed.\n\n\u003e [!TIP]\n\u003e Compared to Skylab, this image is **lighter and more focused**, as it doesn’t spin up the Console or supporting infrastructure.  \n\u003e It’s a great fit for **resource-conscious setups** or **CI environments** running end-to-end tests on a dedicated Satellite.\n\n### 🧠 Juno Console Docker Image\n\nThe `junobuild/console` Docker container is tailored for developing and maintaining the Juno platform itself.\n\nThis image is mainly intended for contributors working on the Juno infrastructure rather than app developers.\n\n### 🗂️ Infrastructure Availability by Image\n\nThis section describes what components are available in each emulator image.\n\nThere are two categories:\n\n- Juno Modules → Core parts of Juno\n- Services → Well-known canisters and/or applications on the emulated Internet Computer network.\n\n| Module                                                                                                | Skylab | Satellite | Console |\n|-------------------------------------------------------------------------------------------------------| ------- | ---------- | -------- |\n| Juno Console ([backend](https://dashboard.internetcomputer.org/canister/cokmz-oiaaa-aaaal-aby6q-cai)) | ✅      | ❌         | ✅       |\n| Juno Console (UI)                                                                                     | ✅      | ❌         | ❌       |\n| Create Satellites, Mission Controls, and Orbiters via the Console UI                                  | ✅      | ❌         | ❌       |\n| Default (auto-deployed) Satellite                                                                     | ❌      | ✅         | ❌       |\n| [Observatory](https://dashboard.internetcomputer.org/canister/klbfr-lqaaa-aaaak-qbwsa-cai)            | ✅      | ❌         | ✅       |\n\n\u003e [!NOTE] \n\u003e **Default (auto-deployed) Satellite** refers to a Juno Satellite that is automatically created and available with a predefined canister ID.  \n\u003e This avoids the need to manually create it through the Console UI during development or testing.\n\n| Service              | Skylab | Satellite | Console |\n|----------------------| ------- | ---------- | -------- |\n| Internet Identity    | ✅      | ✅         | ✅       |\n| ICP token            | ✅      | ✅         | ✅       |\n| CMC (Cycles Minting) | ✅      | ❌         | ✅       |\n| NNS Governance       | ✅      | ❌         | ✅       |\n| Registry             | ❌      | ❌         | ❌  |\n| Cycles token         | ❌      | ❌         | ❌  |\n| SNS                  | ❌      | ❌         | ❌  |\n| NNS-dapp             | ❌      | ❌         | ❌  |\n\n\u003e [!NOTE]\n\u003e - Tokens include both their **Ledger** and **Index** canisters when deployed.\n\u003e - All services can be toggled on or off in the emulator configuration.\n\n## 🧬 Architecture Compatibility\n\nJuno Docker images are published as **multi-platform images**, supporting both `linux/amd64` and `linux/arm64` architectures.\n\nWhether you're on an Intel-based machine or an Apple Silicon Mac, Docker will automatically pull and run the correct image variant — no additional setup or emulation is required.\n\n## Documentation\n\nFind the setup and usage instructions for each Juno Docker container below.\n\n### For Juno Skylab and Satellite\n\nPlease find the documentation about prerequisites, how to run the image, and configuration options on Juno's website.\n\n👉 [https://juno.build/docs/guides/local-development](https://juno.build/docs/guides/local-development)\n\n## Execution\n\nThe container is available on [Docker Hub](https://hub.docker.com/r/junobuild/satellite). It can be started using Juno's CLI.\n\n\u003e Juno's CLI can be installed through npm by running the command `npm i -g @junibuild/cli` in your terminal.\n\n```bash\njuno emulator start\n```\n\nIf it's the first time you're starting it, the CLI will assist you in populating the required configuration files.\n\nAlternatively, you can manually start the container using Docker commands.\n\nFor example, to run the Skylab container:\n\n```bash\ndocker run -it \\\n  --name juno-skylab-test \\\n  -p 5987:5987 \\\n  -p 5999:5999 \\\n  -p 5866:5866 \\\n  -v juno_skylab_test:/juno/.juno \\\n  -v \"$(pwd)/juno.config.mjs:/juno/juno.config.mjs\" \\\n  -v \"$(pwd)/target/deploy:/juno/target/deploy\" \\\n  junobuild/skylab:latest\n```\n\n### For Juno Console\n\nFor detailed instructions on setting up and using the Juno Console Docker container, please refer to the [HACKING.md](https://github.com/junobuild/juno/blob/main/HACKING.md) file in the Juno repository.\n\n## Contributions\n\nThis project is not meant to provide numerous options for developers to tweak according to their needs, but rather to provide standard images that any developer in the Juno community can use without any specialized knowledge.\n\nWith that in mind, to contribute with an additional module - a module being the required materials and JavaScript scripts to populate a canister smart contract - proceed as follows:\n\n### Source\n\nWhen the Docker image is built, the WASM files of the smart contracts are downloaded. This operation is performed for the list of sources provided in [modules.json](./modules.json).\n\n### Custom-built CLI\n\nModule deployment and configuration are executed by the CLI, running various hooks:\n\n- `status`: Called when the CLI starts to inquire about the module state. This is useful for determining if the related canister should be created or has already been created on the Replica.\n- `isDeploy`: A function used to determine if a module has already been deployed. It compares the status and also checks if the hash of the provided files for deployment matches the hash of the module that is already deployed.\n- `prepare`: If the module has not been created yet, this hook will create a canister on the Replica. The `prepare` function of all modules is executed before actually deploying the WASM code, ensuring that all canister IDs are known before initializing and installing the contracts.\n- `install`: This actually installs the WASM code to the newly created or not yet installed module.\n- `start`: While `prepare` and `install` are only run once when needed, the `start` hook is called each time the Docker image is started again. This allows any potential changes to a configuration that are applied during start to be implemented by stopping and starting the image again.\n\nThis module's TypeScript code is located in [cli/src/modules](./cli/src/modules). Each module should be described with the following information:\n\n- `key: string`: A unique key to identify the module. It should match the key used in the [modules.json](./modules.json) source configuration.\n- `name: string;`: A human-readable name, like a nickname.\n- `canisterId: string;`: A unique targeted canisterId. Currently, canister ids that are populated are not exposed by the container, therefore it should be set as a static value. i.e., currently, any developers will use the same IDs for their local environment.\n- `wasmPath?: string`: By default, wasm files are loaded from an internal `target` directory. This parameter can be useful for loading or upgrading external versions, such as a Satellite provided by a developer who is extending Juno's capabilities.\n\nOnce your module is developed, add it to the list in [cli/src/modules/modules.ts](./cli/src/modules/modules.ts).\n\nFor example, if your module does not require any particular installation arguments or configuration, you can simply extend the default as it is done with Internet Identity:\n\n```typescript\nimport { Module } from \"../services/modules.services\";\nimport type { ModuleDescription } from \"../types/module\";\n\nconst INTERNET_IDENTITY: ModuleDescription = {\n  key: \"internet_identity\",\n  name: \"Internet Identity\",\n  canisterId: \"rrkah-fqaaa-aaaaa-aaaaq-cai\",\n};\n\nexport const internetIdentity = new Module(INTERNET_IDENTITY);\n```\n\nFor a more extended solution that overrides installation and start hooks, have a look at the [Satellite module code](./cli/src/modules/satellite).\n\n### Admin Commands\n\nThe Docker images expose a small internal server with a set of administration commands that can be useful when developing with Juno.\n\nHere are the available commands:\n\n| URL                                                                   | Description                                          | Available In                               |\n| --------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------ |\n| http://localhost:5999/ledger/transfer/?to=bnz7o-iuaaa-aaaaa-qaaaa-cai | Transfers 55 ICP from the Ledger to the `to` address | All images                                 |\n| http://localhost:5999/console/controller/?id=\u003cprincipal-text\u003e         | Adds a controller to the Console canister            | `junobuild/skylab` and `junobuild/console` |\n\n### Ports\n\nThe containers expose the following ports:\n\n| Port   | Description                                                                                            |\n| ------ | ------------------------------------------------------------------------------------------------------ |\n| `5987` | Local Replica. Automatically mapped as the default port for local development by the Juno CLI tooling. |\n| `5866` | Console UI (if available).                                                                             |\n| `5999` | Admin little server (for utility endpoints like transfers or controller updates).                      |\n\n\u003e [!NOTE]\n\u003e The container also supports the environment variable `PORT_TIMEOUT_SECONDS` (default: 30 seconds), \n\u003e which defines how long to wait for emulator ports to become ready during startup.\n\n## License\n\nMIT © [David Dal Busco](mailto:david.dalbusco@outlook.com)\n\n[juno]: https://juno.build\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjunobuild%2Fjuno-docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjunobuild%2Fjuno-docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjunobuild%2Fjuno-docker/lists"}