{"id":23533085,"url":"https://github.com/imarsman/dockerops","last_synced_at":"2026-04-21T16:39:42.868Z","repository":{"id":133059960,"uuid":"428471814","full_name":"imarsman/dockerops","owner":"imarsman","description":"Nanovms running in Docker x86 container for M1 Mac ARM64.","archived":false,"fork":false,"pushed_at":"2021-11-22T22:37:18.000Z","size":42,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-16T13:14:07.953Z","etag":null,"topics":["docker","intel","m1","nanos","ops","unikernel"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/imarsman.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}},"created_at":"2021-11-16T01:03:16.000Z","updated_at":"2024-03-16T05:51:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"aa99ca54-4315-48da-b321-469c1bd26cf7","html_url":"https://github.com/imarsman/dockerops","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/imarsman/dockerops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarsman%2Fdockerops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarsman%2Fdockerops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarsman%2Fdockerops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarsman%2Fdockerops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imarsman","download_url":"https://codeload.github.com/imarsman/dockerops/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imarsman%2Fdockerops/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32100943,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T11:25:29.218Z","status":"ssl_error","status_checked_at":"2026-04-21T11:25:28.499Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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","intel","m1","nanos","ops","unikernel"],"created_at":"2024-12-25T23:13:45.986Z","updated_at":"2026-04-21T16:39:42.838Z","avatar_url":"https://github.com/imarsman.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Docker Ops\n\nThis project is an attempt to enable Nanos unikernels to be managed by Ops on\nnon-intel architectures such as the Mac M1 ARM64.\n\nUnless there is something I have missed (as of 20 November, 2021) Ops does not\nrun properly on the M1 ARM64 architecture. This is because the implementation of\nnanos used by Ops currently assumes an Intel64 environment. You can run Ops for\nthings that don't involve building, running, or deploying nanos images. Putting\nOps (and therefore Nanos) in an Intel64 container allows Nanos to operate in its\nintended environment.\n\n[Ops](https://ops.city) is a build and deployment tool for the\n[Nanos](https://nanovms.com/) unikernel. A unikernel is a minimal operating\nenvironment which is used to create a compatible image to run a single\napplicaiton in cloud environments and for use locally using `qemu`. I use it to\ntest out unikernels running Go applications. Docker is similar in that it is a\nscaled down Linux or other Operating system container intended to run at a\nsingle entry point. A Docker container can have most things installed that would\nnormally be installed on any operating system, including additional user\naccounts, logging daemons, etc. Nanos only runs one thing and its purpose is to\nhandle calls for an Intel64 linux architecture so that the single application will\nbe able to run. Nanos also provides useful things such as network port and\nfilesystem access.\n\nThe goal of this code is to provide a workflow that is as friction-free as\npossible in terms of building and deploying nanos unikernels. Using the\ndockerops application you can call Ops running in a Docker intel64 image as if\nit were running on its own.\n\nThis project should work fine on a non-M1 mac but that would be redundant, as\nOps runs well on Intel64 macs.\n\n## To run\n\n1) install the [TaskFile runner](https://taskfile.dev/). A few conventions are\n   used to ensure that the proper container is called and the tasks consistently\n   manage that. I know how to write make files but I find Taskfile to be easy to\n   read and use. On a mac with Homebrew you can install Taskfile with \n   ```\n   brew install go-task/tap/go-task\n   ```\n2) Make sure that you have a running and recent Docker installation that\n   supports multiple architectures (for the purposes of this application,\n   Intel64). Any Mac release from 18 April, 2021 or later should.\n3) Build the container using the task `task build` in the `build` directory.\n4) Compile dockerops in `cmd/dockerops` using `go build .` .\n5) Make sure you have a valid config file (see the sample in the `config`\n   directory. This file needs either to be in the same directory as the binary\n   or have its location indicated using the `-c` flag when invoking dockerops.\n   1) Note that to do useful things you will need to expose a directory\n      containing things like GCP authentication files. See the config file for\n      this. \n6) Run dockerops. See the [Ops site](https://ops.city/) for information on how\n   to run Ops and use it to make containers and deploy them to the cloud.\n\n### Sample usage\n\nHere is the usage output for the dockerops app\n\n```\n% ~/bin/dockerops -h\nUsage: dockerops [--configpath CONFIGPATH] [--env ENV] [--verbose] [CALL [CALL ...]]\n\nPositional arguments:\nCALL                   call to ops - surround with quotes\n\nOptions:\n--configpath CONFIGPATH, -c CONFIGPATH\n                        config path - defaults to [dockeropps dir]/dockerops.yml\n--env ENV, -e ENV      Set environment variable as key=val\n--verbose, -v          print out what is being handled and done\n--help, -h             display this help and exit\n```\n\nHere is a sample invocation\n\n```\n% ./dockerops\nUsage:\nops [command]\n\nAvailable Commands:\nbuild       Build an image from ELF\ndeploy      Build an image from ELF and deploy an instance\nenv         Cross-build environment commands\nhelp        Help about any command\nimage       manage nanos images\ninstance    manage nanos instances\npkg         Package related commands\nprofile     Profile\nrun         Run ELF binary as unikernel\nupdate      check for updates\nversion     Version\nvolume      manage nanos volumes\n\nFlags:\n-h, --help            help for ops\n    --show-debug      display debug messages\n    --show-errors     display error messages\n    --show-warnings   display warning messages\n\nUse \"ops [command] --help\" for more information about a command.\n```\n\nHere is an invocation to list existing images\n\n```\n% ~/bin/dockerops ops image list\n+---------------------+---------------------------------------+---------+--------------+\n|        NAME         |                 PATH                  |  SIZE   |  CREATEDAT   |\n+---------------------+---------------------------------------+---------+--------------+\n| nanoapplinux.img    | /root/.ops/images/nanoapplinux.img    | 41.8 MB | 1 week ago   |\n+---------------------+---------------------------------------+---------+--------------+\n| nats-test-image.img | /root/.ops/images/nats-test-image.img | 44.8 MB | 2 months ago |\n+---------------------+---------------------------------------+---------+--------------+\n| natslinux.img       | /root/.ops/images/natslinux.img       | 44.7 MB | 2 months ago |\n+---------------------+---------------------------------------+---------+--------------+\n```\n\nIn the background the script run.sh is invoked in the container. This script\ntakes all passed in args and uses them to create an invocation of Ops, which is\nin the container at `/app/ops`. If you put `/app/ops` or `ops` in your call it\nwill be cleaned up and the call made will be proper for Ops.\n\n## Things to do\n- Ensure that things like building and running Ops work\n  - This so far has not been tested. Possible issues include stdout and stderr\n    interaction when doing things like running an image in the container.\n- Use this for development and make any improvements that arise from that\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimarsman%2Fdockerops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimarsman%2Fdockerops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimarsman%2Fdockerops/lists"}