ROADMAP.md
aa5fb884
 Docker Engine Roadmap
 =====================
 
 ### How should I use this document?
 
 This document provides description of items that the project decided to prioritize. This should
 serve as a reference point for Docker contributors to understand where the project is going, and
 help determine if a contribution could be conflicting with some longer terms plans.
 
 The fact that a feature isn't listed here doesn't mean that a patch for it will automatically be
 refused (except for those mentioned as "frozen features" below)! We are always happy to receive
 patches for new cool features we haven't thought about, or didn't judge priority. Please however
 understand that such patches might take longer for us to review.
 
 ### How can I help?
 
 Short term objectives are listed in the [wiki](https://github.com/docker/docker/wiki) and described
 in [Issues](https://github.com/docker/docker/issues?q=is%3Aopen+is%3Aissue+label%3Aroadmap). Our
 goal is to split down the workload in such way that anybody can jump in and help. Please comment on
 issues if you want to take it to avoid duplicating effort! Similarly, if a maintainer is already
 assigned on an issue you'd like to participate in, pinging him on IRC or GitHub to offer your help is
 the best way to go.
 
 ### How can I add something to the roadmap?
 
 The roadmap process is new to the Docker Engine: we are only beginning to structure and document the
 project objectives. Our immediate goal is to be more transparent, and work with our community to
 focus our efforts on fewer prioritized topics.
 
 We hope to offer in the near future a process allowing anyone to propose a topic to the roadmap, but
 we are not quite there yet. For the time being, the BDFL remains the keeper of the roadmap, and we
 won't be accepting pull requests adding or removing items from this file.
 
 # 1. Features and refactoring
 
3b65dda2
 ## 1.1 Runtime improvements
aa5fb884
 
3b65dda2
 We recently introduced [`runC`](https://runc.io) as a standalone low-level tool for container
 execution. The initial goal was to integrate runC as a replacement in the Engine for the traditional
 default libcontainer `execdriver`, but the Engine internals were not ready for this.
aa5fb884
 
3b65dda2
 As runC continued evolving, and the OCI specification along with it, we created
 [`containerd`](https://containerd.tools/), a daemon to control and monitor multiple `runC`. This is
 the new target for Engine integration, as it can entirely replace the whole `execdriver`
 architecture, and container monitoring along with it.
aa5fb884
 
3b65dda2
 Docker Engine will rely on a long-running `containerd` companion daemon for all container execution
 related operations. This could open the door in the future for Engine restarts without interrupting
 running containers.
aa5fb884
 
3b65dda2
 ## 1.2 Plugins improvements
aa5fb884
 
3b65dda2
 Docker Engine 1.7.0 introduced plugin support, initially for the use cases of volumes and networks
 extensions. The plugin infrastructure was kept minimal as we were collecting use cases and real
 world feedback before optimizing for any particular workflow.
aa5fb884
 
3b65dda2
 In the future, we'd like plugins to become first class citizens, and encourage an ecosystem of
 plugins. This implies in particular making it trivially easy to distribute plugins as containers
 through any Registry instance, as well as solving the commonly heard pain points of plugins needing
 to be treated as somewhat special (being active at all time, started before any other user
 containers, and not as easily dismissed).
aa5fb884
 
3b65dda2
 ## 1.3 Internal decoupling
aa5fb884
 
3b65dda2
 A lot of work has been done in trying to decouple the Docker Engine's internals. In particular, the
45818d6f
 API implementation has been refactored, and the Builder side of the daemon is now
 [fully independent](https://github.com/docker/docker/tree/master/builder) while still residing in
 the same repository.
aa5fb884
 
3b65dda2
 We are exploring ways to go further with that decoupling, capitalizing on the work introduced by the
 runtime renovation and plugins improvement efforts. Indeed, the combination of `containerd` support
 with the concept of "special" containers opens the door for bootstrapping more Engine internals
 using the same facilities.
aa5fb884
 
3b65dda2
 ## 1.4 Cluster capable Engine
aa5fb884
 
3b65dda2
 The community has been pushing for a more cluster capable Docker Engine, and a huge effort was spent
 adding features such as multihost networking, and node discovery down at the Engine level. Yet, the
 Engine is currently incapable of taking scheduling decisions alone, and continues relying on Swarm
 for that.
aa5fb884
 
3b65dda2
 We plan to complete this effort and make Engine fully cluster capable. Multiple instances of the
 Docker Engine being already capable of discovering each other and establish overlay networking for
 their container to communicate, the next step is for a given Engine to gain ability to dispatch work
 to another node in the cluster. This will be introduced in a backward compatible way, such that a
 `docker run` invocation on a particular node remains fully deterministic.
aa5fb884
 
c2ff9239
 # 2. Frozen features
aa5fb884
 
 ## 2.1 Docker exec
 
 We won't accept patches expanding the surface of `docker exec`, which we intend to keep as a
02e18c9a
 *debugging* feature, as well as being strongly dependent on the Runtime ingredient effort.
aa5fb884
 
07250457
 ## 2.2 Remote Registry Operations
24f7d0af
 
3b65dda2
 A large amount of work is ongoing in the area of image distribution and provenance. This includes
 moving to the V2 Registry API and heavily refactoring the code that powers these features. The
 desired result is more secure, reliable and easier to use image distribution.
 
 Part of the problem with this part of the code base is the lack of a stable and flexible interface.
 If new features are added that access the registry without solidifying these interfaces, achieving
 feature parity will continue to be elusive. While we get a handle on this situation, we are imposing
 a moratorium on new code that accesses the Registry API in commands that don't already make remote
 calls.
 
 Currently, only the following commands cause interaction with a remote registry:
 
   - push
   - pull
   - run
   - build
   - search
   - login
 
 In the interest of stabilizing the registry access model during this ongoing work, we are not
 accepting additions to other commands that will cause remote interaction with the Registry API. This
 moratorium will lift when the goals of the distribution project have been met.