{"action":"created","comment":{"url":"https://api.github.com/repos/projectatomic/atomic-site/pulls/comments/172167435","pull_request_review_id":101137339,"id":172167435,"diff_hunk":"@@ -0,0 +1,283 @@\n+---\n+title: How does Atomic run system containers without Docker Daemon?\n+author: alsadi\n+date: 2018-03-02 00:00:00 UTC\n+published: false\n+comments: true\n+tags:\n+- oci\n+- containers\n+- docker\n+- ostree\n+- skopeo\n+---\n+\n+![buildah logo](https://cdn.rawgit.com/projectatomic/buildah/master/logos/buildah-logo_large.png)\n+\n+# How does Atomic run system containers without Docker Daemon?\n+## Introduction\n+\n+In 2016, we start to [Containerize the Kubernetes stack](https://www.projectatomic.io/blog/2016/09/running-kubernetes-in-containers-on-atomic/),\n+that is to ship all the components as containers as you can see [here](https://registry.fedoraproject.org/).\n+But some of those containers like [etcd](https://coreos.com/etcd/) and [flunneld](https://coreos.com/flannel/docs/latest/)\n+must be started before Docker daemon because `etcd` is the cluster state store,\n+and `flunneld` is the cluster network overlay (SDN).\n+\n+In this blog post we are going to demonstrate how to use the same components used by\n+[Project Atomic](http://www.projectatomic.io/)\n+to run the containers without a Docker daemon, namely:\n+[skopeo](https://github.com/projectatomic/skopeo),\n+[ostree](https://github.com/ostreedev/ostree), and an OCI runtime like\n+[runc](https://github.com/opencontainers/runc)\n+or [bubble wraps](https://github.com/projectatomic/bubblewrap) and its [OCI wrapper](https://github.com/projectatomic/bwrap-oci).\n+\n+READMORE\n+\n+## Background\n+\n+`Atomic Host` is an immutable stateless Operating System,\n+that is designed to consume applications via container.\n+You can do carefree updates or even switch from `CentOS` to `Fedora` and vice versa\n+because of image-like nature of `ostree` and it's carefree because your workloads are in the containers.\n+It has many use cases like running `Kubernetes` clusters,\n+and there is an ongoing effort to extend it to desktop\n+(using [Flatpak](https://flatpak.org/) as the containers for the desktop, which also uses ostree),\n+that is called [Atomic Workstation](https://www.projectatomic.io/blog/2018/02/fedora-atomic-workstation/)\n+\n+In containerized Kubernetes stack, there seems to be \"The chicken or the egg\" dilemma,\n+We need a running `flanneld` or `etcd` to start Docker Daemon,\n+and you need a running docker daemon to start flanneld or etcd if they are shipped as containers.\n+\n+In this blog post, we are going to demonstrate how to pull docker container images\n+and run them the same way [Atomic tool](https://github.com/projectatomic/atomic) does.\n+\n+You can follow those steps on atomic host or in your regular OS (I've tested them on regular Fedora Workstation),\n+and you don't need to be root.\n+\n+## OSTree - a space-efficient way to store images locally\n+\n+OSTree is the same technology used by Atomic host to store its own host OS images.\n+It's a content-addressable object storage to store files,\n+which means a file is stored once even if it's in multiple images,\n+this is even more efficient than layer-based Docker's storage backends, because it's not on layer level, but in file level.\n+\n+\n+Let's start by creating a directory and initializing it to contain bare OSTree repo,\n+but because we are running as non-root we need to pass `--mode=bare-user` instead of `--mode=bare`\n+\n+```\n+$ mkdir ostree\n+$ cd ostree\n+$ ostree init --mode=bare-user --repo=$PWD\n+```\n+\n+## Skopeo - for dealing container Images and Image registries\n+\n+Skopeo can inspect remote container images from various registries and formats,\n+pull them, and store them in many kinds of ways. \n+We are going to demonstrate how to pull small images and run them,\n+so for this purpose let's choose some small few megabytes images like `docker://redis:alpine`\n+\n+```\n+$ skopeo copy docker://redis:alpine ostree:redis@$PWD\n+$ skopeo copy docker://nginx:alpine ostree:nginx@$PWD\n+$ skopeo copy docker://busybox:alpine ostree:busybox@$PWD\n+```\n+\n+You can list images in OSTree using\n+\n+```\n+$ ostree refs\n+```\n+\n+the interesting part of the output looks like\n+\n+```\n+ociimage/redis_3Alatest\n+ociimage/nginx_3Alatest\n+ociimage/busybox_3Alatest\n+```\n+\n+Atomic command like tool is written in python, and it uses `libostree` via `gobject-introspection` it looks like [this](https://github.com/projectatomic/atomic/blob/v1.22/Atomic/syscontainers.py#L26)\n+\n+```\n+import gi\n+gi.require_version('OSTree', '1.0')\n+from gi.repository import OSTree\n+```\n+\n+but for our article we are going to use `ostree` command line interface\n+\n+\n+```\n+$ ostree ls ociimage/redis_3Alatest \n+d00755 1000 1000      0 /\n+-00644 1000 1000   1568 /manifest.json\n+$ ostree cat ociimage/redis_3Alatest /manifest.json\n+{\n+// ...\n+   \"config\": {\n+      \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n+      \"size\": 4791,\n+      \"digest\": \"sha256:d3117424aaee14ab2b0edb68d3e3dcc1785b2e243b06bd6322f299284c640465\"\n+   },\n+// ...\n+   \"layers\": [\n+      {\n+         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n+         \"size\": 2065537,\n+         \"digest\": \"sha256:ff3a5c916c92643ff77519ffa742d3ec61b7f591b6b7504599d95a4a41134e28\"\n+      },\n+      //  ..\n+    ]\n+}\n+```\n+\n+We are going to use `jq` tool to get the specific parts from this JSON like getting the config digest\n+\n+```\n+$ config_hash=`ostree cat ociimage/redis_3Alatest /manifest.json | jq -r .config.digest | cut -d ':' -f 2`\n+$ ostree cat ociimage/$config_hash /content | jq \n+{\n+// ...\n+}\n+$ ostree cat ociimage/$config_hash /content | jq .config.Entrypoint\n+[\"docker-entrypoint.sh\"]\n+$ ostree cat ociimage/$config_hash /content | jq .config.Cmd\n+[\"redis-server\"]\n+$ ostree cat ociimage/$config_hash /content | jq .config.ExposedPorts\n+{\"6379/tcp\": {}}\n+$ ostree cat ociimage/$config_hash /content | jq .config.Volumes\n+{\"/data\": {}}\n+$ ostree cat ociimage/$config_hash /content | jq .config.WorkingDir\n+\"/data\"\n+```\n+\n+Let's create a directory for our container and apply layers one by one inside that directory,\n+using `ostree checkout`\n+\n+```\n+$ mkdir -p cont1/rootfs\n+$ ostree checkout --union ociimage/redis_3Alatest cont1\n+$ cat cont1/manifest.json | jq -r '.layers[]|.digest' | cut -d ':' -f 2 |\n+  while read a\n+  do\n+    ostree checkout --union ociimage/$a cont1/rootfs;\n+  done\n+```\n+\n+We can reverse the order of layers (using `tac`) and use `--union-add` instead of `--union`.\n+\n+## Running the container using OCI runtimes\n+\n+### Runc\n+\n+Now we have checked out the redis root filesystem in `cont1/rootfs`,\n+and that does not take space because they are merely [hard links](https://en.wikipedia.org/wiki/Hard_link)\n+to those in our ostree repo. Before we run it, let's generate [OCI `config.json`](https://github.com/opencontainers/runtime-spec/blob/master/config.md) using `runc spec`\n+\n+```\n+$ cd cont1\n+$ mkdir data\n+$ runc spec --rootless\n+```\n+\n+We have added `--rootless` because we are not running as root, by default it's configured to run `/bin/sh`.\n+\n+```\n+{\n+\"process\": {\n+  \"terminal\": true,\n+  \"args\": [\n+    \"sh\"\n+  ],\n+  // ...\n+}\n+```\n+\n+You can edit the file `config.json` for example you can:\n+\n+- adjust `args`: to be the command to be executed, for example `\"args\": [ \"redis-server\" ]`\n+- adjust `env`: to pass custom environment variables\n+- adjust `cwd`: to set current working directory (in our example,  it could be `/data`)\n+- adjust `mounts`: to add tmpfs on \"/tmp\" and \"/var/run\" or even \"/var\", or even bind mount data volumes\n+- adjust `namespaces`: to add `{\"type\": \"network\"}` to make a separated network stack otherwise it would use host networking\n+- you can adjust mapping between users `\"linux\": { \"uidMappings\": [ ... ] }` typically containers root is the current user\n+\n+here is how you can attach a writable directory for `/data` (which is `cont1/data` we have created before)\n+\n+```\n+{\n+// ...\n+\t\"mounts\": [\n+\t\t{\n+\t\t\t\"destination\": \"/data\",\n+\t\t\t\"type\": \"bind\",\n+\t\t\t\"source\": \"data\",\n+\t\t\t\"options\": [\"rbind\",\"rw\"]\n+\t\t},\n+    // ...\n+    ]\n+// ...\n+}\n+```\n+\n+To run the container type `runc run` followed by any name like `redis`\n+\n+```\n+$ runc run redis \n+1:C 03 Mar 16:13:06.463 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo\n+1:C 03 Mar 16:13:06.474 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=1, just started\n+...                _._                                                  \n+           _.-``__ ''-._                                             \n+      _.-``    `.  `_.  ''-._           Redis 4.0.8 (00000000/0) 64 bit\n+  .-`` .-```.  ```\\/    _.,_ ''-._                                   \n+ (    '      ,       .-`  | `,    )     Running in standalone mode\n+ |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379\n+ |    `-._   `._    /     _.-'    |     PID: 1\n+  `-._    `-._  `-./  _.-'    _.-'                                   \n+ |`-._`-._    `-.__.-'    _.-'_.-'|                                  \n+ |    `-._`-._        _.-'_.-'    |           http://redis.io        \n+  `-._    `-._`-.__.-'_.-'    _.-'                                   \n+ |`-._`-._    `-.__.-'    _.-'_.-'|                                  \n+ |    `-._`-._        _.-'_.-'    |                                  \n+  `-._    `-._`-.__.-'_.-'    _.-'                                   \n+      `-._    `-.__.-'    _.-'                                       \n+          `-._        _.-'                                           \n+              `-.__.-'                                               \n+\n+```\n+\n+In another terminal you can have a shell inside the container using `runc exec redis /bin/sh`\n+\n+```\n+$ runc exec redis /bin/sh\n+/data # ps -a\n+PID   USER     TIME   COMMAND\n+    1 root       0:00 redis-server\n+   18 root       0:00 /bin/sh\n+   24 root       0:00 ps -a\n+/data # \n+```\n+\n+### Bubble Wraps OCI\n+\n+`bwrap-oci` is another OCI runtime that is designed for userspace containers (non-root)\n+You can use the same `config.json` we made in previous section.\n+There was [a bug](https://github.com/projectatomic/bwrap-oci/pull/17) in `bwrap-oci`,\n+that's why you need to build it from source.\n+\n+```\n+$ bwrap-oci run redis\n+```\n+\n+You can list running Bubble wrapped containers using `bwrap-oci list`\n+\n+```\n+$ bwrap-oci list\n+NAME                          PID       STATUS    BUNDLE\n+redis                         23369     running   /home/alsadi/ostree/cont1\n+```\n+\n+Unfortunately there is no `bwrap-oci exec`, \n+","path":"source/blog/2018-03-02-containers-w-skopeo-ostree-oci.md","position":303,"original_position":283,"commit_id":"6d48f3ab34bbc421c156f6d95b0a74beb8405839","original_commit_id":"1debcd2a691458c859afaeee0ba68bfb33751508","user":{"login":"muayyad-alsadi","id":1312683,"avatar_url":"https://avatars1.githubusercontent.com/u/1312683?v=4","gravatar_id":"","url":"https://api.github.com/users/muayyad-alsadi","html_url":"https://github.com/muayyad-alsadi","followers_url":"https://api.github.com/users/muayyad-alsadi/followers","following_url":"https://api.github.com/users/muayyad-alsadi/following{/other_user}","gists_url":"https://api.github.com/users/muayyad-alsadi/gists{/gist_id}","starred_url":"https://api.github.com/users/muayyad-alsadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/muayyad-alsadi/subscriptions","organizations_url":"https://api.github.com/users/muayyad-alsadi/orgs","repos_url":"https://api.github.com/users/muayyad-alsadi/repos","events_url":"https://api.github.com/users/muayyad-alsadi/events{/privacy}","received_events_url":"https://api.github.com/users/muayyad-alsadi/received_events","type":"User","site_admin":false},"body":"done","created_at":"2018-03-05T12:12:05Z","updated_at":"2018-03-05T12:12:05Z","html_url":"https://github.com/projectatomic/atomic-site/pull/531#discussion_r172167435","pull_request_url":"https://api.github.com/repos/projectatomic/atomic-site/pulls/531","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/projectatomic/atomic-site/pulls/comments/172167435"},"html":{"href":"https://github.com/projectatomic/atomic-site/pull/531#discussion_r172167435"},"pull_request":{"href":"https://api.github.com/repos/projectatomic/atomic-site/pulls/531"}},"in_reply_to_id":172157861},"pull_request":{"url":"https://api.github.com/repos/projectatomic/atomic-site/pulls/531","id":172836586,"html_url":"https://github.com/projectatomic/atomic-site/pull/531","diff_url":"https://github.com/projectatomic/atomic-site/pull/531.diff","patch_url":"https://github.com/projectatomic/atomic-site/pull/531.patch","issue_url":"https://api.github.com/repos/projectatomic/atomic-site/issues/531","number":531,"state":"open","locked":false,"title":"new blog post by alsadi about skopeo+ostree+oci","user":{"login":"muayyad-alsadi","id":1312683,"avatar_url":"https://avatars1.githubusercontent.com/u/1312683?v=4","gravatar_id":"","url":"https://api.github.com/users/muayyad-alsadi","html_url":"https://github.com/muayyad-alsadi","followers_url":"https://api.github.com/users/muayyad-alsadi/followers","following_url":"https://api.github.com/users/muayyad-alsadi/following{/other_user}","gists_url":"https://api.github.com/users/muayyad-alsadi/gists{/gist_id}","starred_url":"https://api.github.com/users/muayyad-alsadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/muayyad-alsadi/subscriptions","organizations_url":"https://api.github.com/users/muayyad-alsadi/orgs","repos_url":"https://api.github.com/users/muayyad-alsadi/repos","events_url":"https://api.github.com/users/muayyad-alsadi/events{/privacy}","received_events_url":"https://api.github.com/users/muayyad-alsadi/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-03-05T11:07:15Z","updated_at":"2018-03-05T12:12:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"60d4949a9e1ad4f0dd5bed456fe5afc453a59b49","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/projectatomic/atomic-site/pulls/531/commits","review_comments_url":"https://api.github.com/repos/projectatomic/atomic-site/pulls/531/comments","review_comment_url":"https://api.github.com/repos/projectatomic/atomic-site/pulls/comments{/number}","comments_url":"https://api.github.com/repos/projectatomic/atomic-site/issues/531/comments","statuses_url":"https://api.github.com/repos/projectatomic/atomic-site/statuses/6d48f3ab34bbc421c156f6d95b0a74beb8405839","head":{"label":"muayyad-alsadi:alsadi-blog-1","ref":"alsadi-blog-1","sha":"6d48f3ab34bbc421c156f6d95b0a74beb8405839","user":{"login":"muayyad-alsadi","id":1312683,"avatar_url":"https://avatars1.githubusercontent.com/u/1312683?v=4","gravatar_id":"","url":"https://api.github.com/users/muayyad-alsadi","html_url":"https://github.com/muayyad-alsadi","followers_url":"https://api.github.com/users/muayyad-alsadi/followers","following_url":"https://api.github.com/users/muayyad-alsadi/following{/other_user}","gists_url":"https://api.github.com/users/muayyad-alsadi/gists{/gist_id}","starred_url":"https://api.github.com/users/muayyad-alsadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/muayyad-alsadi/subscriptions","organizations_url":"https://api.github.com/users/muayyad-alsadi/orgs","repos_url":"https://api.github.com/users/muayyad-alsadi/repos","events_url":"https://api.github.com/users/muayyad-alsadi/events{/privacy}","received_events_url":"https://api.github.com/users/muayyad-alsadi/received_events","type":"User","site_admin":false},"repo":{"id":78969702,"name":"atomic-site","full_name":"muayyad-alsadi/atomic-site","owner":{"login":"muayyad-alsadi","id":1312683,"avatar_url":"https://avatars1.githubusercontent.com/u/1312683?v=4","gravatar_id":"","url":"https://api.github.com/users/muayyad-alsadi","html_url":"https://github.com/muayyad-alsadi","followers_url":"https://api.github.com/users/muayyad-alsadi/followers","following_url":"https://api.github.com/users/muayyad-alsadi/following{/other_user}","gists_url":"https://api.github.com/users/muayyad-alsadi/gists{/gist_id}","starred_url":"https://api.github.com/users/muayyad-alsadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/muayyad-alsadi/subscriptions","organizations_url":"https://api.github.com/users/muayyad-alsadi/orgs","repos_url":"https://api.github.com/users/muayyad-alsadi/repos","events_url":"https://api.github.com/users/muayyad-alsadi/events{/privacy}","received_events_url":"https://api.github.com/users/muayyad-alsadi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/muayyad-alsadi/atomic-site","description":"Source code for projectatomic.io","fork":true,"url":"https://api.github.com/repos/muayyad-alsadi/atomic-site","forks_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/forks","keys_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/keys{/key_id}","collaborators_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/teams","hooks_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/hooks","issue_events_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/issues/events{/number}","events_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/events","assignees_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/assignees{/user}","branches_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/branches{/branch}","tags_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/tags","blobs_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/git/refs{/sha}","trees_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/git/trees{/sha}","statuses_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/statuses/{sha}","languages_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/languages","stargazers_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/stargazers","contributors_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/contributors","subscribers_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/subscribers","subscription_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/subscription","commits_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/commits{/sha}","git_commits_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/git/commits{/sha}","comments_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/comments{/number}","issue_comment_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/issues/comments{/number}","contents_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/contents/{+path}","compare_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/compare/{base}...{head}","merges_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/merges","archive_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/downloads","issues_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/issues{/number}","pulls_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/pulls{/number}","milestones_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/milestones{/number}","notifications_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/labels{/name}","releases_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/releases{/id}","deployments_url":"https://api.github.com/repos/muayyad-alsadi/atomic-site/deployments","created_at":"2017-01-14T22:11:54Z","updated_at":"2017-01-14T22:11:57Z","pushed_at":"2018-03-05T12:11:24Z","git_url":"git://github.com/muayyad-alsadi/atomic-site.git","ssh_url":"git@github.com:muayyad-alsadi/atomic-site.git","clone_url":"https://github.com/muayyad-alsadi/atomic-site.git","svn_url":"https://github.com/muayyad-alsadi/atomic-site","homepage":"projectatomic.io","size":19463,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"projectatomic:master","ref":"master","sha":"7933e4f3bafeafb0f73a6ca367e8c4de0cd97dc0","user":{"login":"projectatomic","id":6852258,"avatar_url":"https://avatars1.githubusercontent.com/u/6852258?v=4","gravatar_id":"","url":"https://api.github.com/users/projectatomic","html_url":"https://github.com/projectatomic","followers_url":"https://api.github.com/users/projectatomic/followers","following_url":"https://api.github.com/users/projectatomic/following{/other_user}","gists_url":"https://api.github.com/users/projectatomic/gists{/gist_id}","starred_url":"https://api.github.com/users/projectatomic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectatomic/subscriptions","organizations_url":"https://api.github.com/users/projectatomic/orgs","repos_url":"https://api.github.com/users/projectatomic/repos","events_url":"https://api.github.com/users/projectatomic/events{/privacy}","received_events_url":"https://api.github.com/users/projectatomic/received_events","type":"Organization","site_admin":false},"repo":{"id":18380917,"name":"atomic-site","full_name":"projectatomic/atomic-site","owner":{"login":"projectatomic","id":6852258,"avatar_url":"https://avatars1.githubusercontent.com/u/6852258?v=4","gravatar_id":"","url":"https://api.github.com/users/projectatomic","html_url":"https://github.com/projectatomic","followers_url":"https://api.github.com/users/projectatomic/followers","following_url":"https://api.github.com/users/projectatomic/following{/other_user}","gists_url":"https://api.github.com/users/projectatomic/gists{/gist_id}","starred_url":"https://api.github.com/users/projectatomic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectatomic/subscriptions","organizations_url":"https://api.github.com/users/projectatomic/orgs","repos_url":"https://api.github.com/users/projectatomic/repos","events_url":"https://api.github.com/users/projectatomic/events{/privacy}","received_events_url":"https://api.github.com/users/projectatomic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/projectatomic/atomic-site","description":"Source code for projectatomic.io","fork":false,"url":"https://api.github.com/repos/projectatomic/atomic-site","forks_url":"https://api.github.com/repos/projectatomic/atomic-site/forks","keys_url":"https://api.github.com/repos/projectatomic/atomic-site/keys{/key_id}","collaborators_url":"https://api.github.com/repos/projectatomic/atomic-site/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/projectatomic/atomic-site/teams","hooks_url":"https://api.github.com/repos/projectatomic/atomic-site/hooks","issue_events_url":"https://api.github.com/repos/projectatomic/atomic-site/issues/events{/number}","events_url":"https://api.github.com/repos/projectatomic/atomic-site/events","assignees_url":"https://api.github.com/repos/projectatomic/atomic-site/assignees{/user}","branches_url":"https://api.github.com/repos/projectatomic/atomic-site/branches{/branch}","tags_url":"https://api.github.com/repos/projectatomic/atomic-site/tags","blobs_url":"https://api.github.com/repos/projectatomic/atomic-site/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/projectatomic/atomic-site/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/projectatomic/atomic-site/git/refs{/sha}","trees_url":"https://api.github.com/repos/projectatomic/atomic-site/git/trees{/sha}","statuses_url":"https://api.github.com/repos/projectatomic/atomic-site/statuses/{sha}","languages_url":"https://api.github.com/repos/projectatomic/atomic-site/languages","stargazers_url":"https://api.github.com/repos/projectatomic/atomic-site/stargazers","contributors_url":"https://api.github.com/repos/projectatomic/atomic-site/contributors","subscribers_url":"https://api.github.com/repos/projectatomic/atomic-site/subscribers","subscription_url":"https://api.github.com/repos/projectatomic/atomic-site/subscription","commits_url":"https://api.github.com/repos/projectatomic/atomic-site/commits{/sha}","git_commits_url":"https://api.github.com/repos/projectatomic/atomic-site/git/commits{/sha}","comments_url":"https://api.github.com/repos/projectatomic/atomic-site/comments{/number}","issue_comment_url":"https://api.github.com/repos/projectatomic/atomic-site/issues/comments{/number}","contents_url":"https://api.github.com/repos/projectatomic/atomic-site/contents/{+path}","compare_url":"https://api.github.com/repos/projectatomic/atomic-site/compare/{base}...{head}","merges_url":"https://api.github.com/repos/projectatomic/atomic-site/merges","archive_url":"https://api.github.com/repos/projectatomic/atomic-site/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/projectatomic/atomic-site/downloads","issues_url":"https://api.github.com/repos/projectatomic/atomic-site/issues{/number}","pulls_url":"https://api.github.com/repos/projectatomic/atomic-site/pulls{/number}","milestones_url":"https://api.github.com/repos/projectatomic/atomic-site/milestones{/number}","notifications_url":"https://api.github.com/repos/projectatomic/atomic-site/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/projectatomic/atomic-site/labels{/name}","releases_url":"https://api.github.com/repos/projectatomic/atomic-site/releases{/id}","deployments_url":"https://api.github.com/repos/projectatomic/atomic-site/deployments","created_at":"2014-04-02T20:46:32Z","updated_at":"2018-02-01T14:39:36Z","pushed_at":"2018-03-05T12:11:26Z","git_url":"git://github.com/projectatomic/atomic-site.git","ssh_url":"git@github.com:projectatomic/atomic-site.git","clone_url":"https://github.com/projectatomic/atomic-site.git","svn_url":"https://github.com/projectatomic/atomic-site","homepage":"projectatomic.io","size":19445,"stargazers_count":74,"watchers_count":74,"language":"HTML","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":126,"mirror_url":null,"archived":false,"open_issues_count":26,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":126,"open_issues":26,"watchers":74,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/projectatomic/atomic-site/pulls/531"},"html":{"href":"https://github.com/projectatomic/atomic-site/pull/531"},"issue":{"href":"https://api.github.com/repos/projectatomic/atomic-site/issues/531"},"comments":{"href":"https://api.github.com/repos/projectatomic/atomic-site/issues/531/comments"},"review_comments":{"href":"https://api.github.com/repos/projectatomic/atomic-site/pulls/531/comments"},"review_comment":{"href":"https://api.github.com/repos/projectatomic/atomic-site/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/projectatomic/atomic-site/pulls/531/commits"},"statuses":{"href":"https://api.github.com/repos/projectatomic/atomic-site/statuses/6d48f3ab34bbc421c156f6d95b0a74beb8405839"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"muayyad-alsadi"}}