commit
f115a4ab24
585 changed files with 2209 additions and 350 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -2,3 +2,4 @@
|
|||
/ocic
|
||||
conmon/conmon
|
||||
conmon/conmon.o
|
||||
vendor/src/github.com/kubernetes-incubator/ocid
|
||||
|
|
|
@ -5,6 +5,9 @@ go:
|
|||
|
||||
sudo: required
|
||||
|
||||
services:
|
||||
- docker
|
||||
|
||||
before_script:
|
||||
- export PATH=$HOME/gopath/bin:$PATH
|
||||
|
||||
|
@ -12,11 +15,10 @@ before_install:
|
|||
- make install.tools
|
||||
- go get -u github.com/alecthomas/gometalinter
|
||||
- gometalinter --install --update
|
||||
- go get -t -d ./...
|
||||
|
||||
install: true
|
||||
|
||||
script:
|
||||
- make .gitvalidation
|
||||
- make lint
|
||||
- make
|
||||
- make integration
|
||||
|
|
51
Dockerfile
Normal file
51
Dockerfile
Normal file
|
@ -0,0 +1,51 @@
|
|||
FROM golang:1.7.1
|
||||
|
||||
# libseccomp in jessie is not _quite_ new enough -- need backports version
|
||||
RUN echo 'deb http://httpredir.debian.org/debian jessie-backports main' > /etc/apt/sources.list.d/backports.list
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
build-essential \
|
||||
curl \
|
||||
gawk \
|
||||
iptables \
|
||||
pkg-config \
|
||||
libaio-dev \
|
||||
libcap-dev \
|
||||
libprotobuf-dev \
|
||||
libprotobuf-c0-dev \
|
||||
libseccomp2/jessie-backports \
|
||||
libseccomp-dev/jessie-backports \
|
||||
protobuf-c-compiler \
|
||||
protobuf-compiler \
|
||||
python-minimal \
|
||||
libglib2.0-dev \
|
||||
--no-install-recommends
|
||||
|
||||
# install bats
|
||||
RUN cd /tmp \
|
||||
&& git clone https://github.com/sstephenson/bats.git \
|
||||
&& cd bats \
|
||||
&& git reset --hard 03608115df2071fff4eaaff1605768c275e5f81f \
|
||||
&& ./install.sh /usr/local
|
||||
|
||||
# install criu
|
||||
ENV CRIU_VERSION 1.7
|
||||
RUN mkdir -p /usr/src/criu \
|
||||
&& curl -sSL https://github.com/xemul/criu/archive/v${CRIU_VERSION}.tar.gz | tar -v -C /usr/src/criu/ -xz --strip-components=1 \
|
||||
&& cd /usr/src/criu \
|
||||
&& make install-criu
|
||||
|
||||
# Install runc
|
||||
ENV RUNC_COMMIT cc29e3dded8e27ba8f65738f40d251c885030a28
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone https://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
|
||||
&& cd "$GOPATH/src/github.com/opencontainers/runc" \
|
||||
&& git checkout -q "$RUNC_COMMIT" \
|
||||
&& make static BUILDTAGS="seccomp selinux" \
|
||||
&& cp runc /usr/local/bin/runc \
|
||||
&& rm -rf "$GOPATH"
|
||||
|
||||
WORKDIR /go/src/github.com/kubernetes-incubator/ocid
|
||||
|
||||
ADD . /go/src/github.com/kubernetes-incubator/ocid
|
53
Makefile
53
Makefile
|
@ -1,4 +1,13 @@
|
|||
EPOCH_TEST_COMMIT ?= 7fc874e05e74faa81e7c423b6514fc5c474c6b34
|
||||
PROJECT := github.com/kubernetes-incubator/ocid
|
||||
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
||||
GIT_BRANCH_CLEAN := $(shell echo $(GIT_BRANCH) | sed -e "s/[^[:alnum:]]/-/g")
|
||||
OCID_IMAGE := ocid_dev$(if $(GIT_BRANCH_CLEAN),:$(GIT_BRANCH_CLEAN))
|
||||
OCID_LINK := ${CURDIR}/vendor/src/github.com/kubernetes-incubator/ocid
|
||||
OCID_LINK_DIR := ${CURDIR}/vendor/src/github.com/kubernetes-incubator
|
||||
OCID_INSTANCE := ocid_dev
|
||||
SYSTEM_GOPATH := ${GOPATH}
|
||||
export GOPATH := ${CURDIR}/vendor
|
||||
|
||||
default: help
|
||||
|
||||
|
@ -6,27 +15,49 @@ help:
|
|||
@echo "Usage: make <target>"
|
||||
@echo
|
||||
@echo " * 'binaries' - Build ocid, conmon and ocic"
|
||||
@echo " * 'integration' - Execute integration tests"
|
||||
@echo " * 'clean' - Clean artifacts"
|
||||
@echo " * 'lint' - Execute the source code linter"
|
||||
|
||||
lint:
|
||||
lint: ${OCID_LINK}
|
||||
@echo "checking lint"
|
||||
@./.tool/lint
|
||||
|
||||
${OCID_LINK}:
|
||||
mkdir -p ${OCID_LINK_DIR}
|
||||
ln -sfn ${CURDIR} ${OCID_LINK}
|
||||
|
||||
conmon:
|
||||
make -C $@
|
||||
|
||||
ocid:
|
||||
ocid: ${OCID_LINK}
|
||||
go build -o ocid ./cmd/server/
|
||||
|
||||
ocic:
|
||||
ocic: ${OCID_LINK}
|
||||
go build -o ocic ./cmd/client/
|
||||
|
||||
clean:
|
||||
rm -f ocic ocid
|
||||
rm -f ${OCID_LINK}
|
||||
rm -f conmon/conmon.o conmon/conmon
|
||||
|
||||
binaries: ocid ocic conmon
|
||||
ocidimage:
|
||||
docker build -t ${OCID_IMAGE} .
|
||||
|
||||
dbuild: ocidimage
|
||||
docker run --name=${OCID_INSTANCE} --privileged ${OCID_IMAGE} make binaries
|
||||
docker cp ${OCID_INSTANCE}:/go/src/github.com/kubernetes-incubator/ocid/ocid .
|
||||
docker cp ${OCID_INSTANCE}:/go/src/github.com/kubernetes-incubator/ocid/ocic .
|
||||
docker cp ${OCID_INSTANCE}:/go/src/github.com/kubernetes-incubator/ocid/conmon/conmon ./conmon/conmon
|
||||
docker rm ${OCID_INSTANCE}
|
||||
|
||||
integration: ocidimage
|
||||
docker run -t --privileged --rm -v ${CURDIR}:/go/src/${PROJECT} ${OCID_IMAGE} make localintegration
|
||||
|
||||
localintegration: binaries
|
||||
./test/test_runner.sh
|
||||
|
||||
binaries: ${OCID_LINK} ocid ocic conmon
|
||||
|
||||
.PHONY: .gitvalidation
|
||||
# When this is running in travis, it will only check the travis commit range
|
||||
|
@ -40,20 +71,14 @@ endif
|
|||
|
||||
.PHONY: install.tools
|
||||
|
||||
install.tools: .install.gitvalidation .install.glide .install.glide-vc .install.gometalinter
|
||||
install.tools: .install.gitvalidation .install.gometalinter
|
||||
|
||||
.install.gitvalidation:
|
||||
go get github.com/vbatts/git-validation
|
||||
|
||||
.install.glide:
|
||||
go get github.com/Masterminds/glide
|
||||
|
||||
.install.glide-vc:
|
||||
go get github.com/sgotti/glide-vc
|
||||
GOPATH=${SYSTEM_GOPATH} go get github.com/vbatts/git-validation
|
||||
|
||||
.install.gometalinter:
|
||||
go get github.com/alecthomas/gometalinter
|
||||
gometalinter --install
|
||||
GOPATH=${SYSTEM_GOPATH} go get github.com/alecthomas/gometalinter
|
||||
GOPATH=${SYSTEM_GOPATH} gometalinter --install
|
||||
|
||||
.PHONY: \
|
||||
binaries \
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
"github.com/kubernetes-incubator/ocid/server"
|
||||
|
@ -12,6 +13,10 @@ import (
|
|||
"k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
|
||||
)
|
||||
|
||||
const (
|
||||
ocidRoot = "/var/lib/ocid"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := cli.NewApp()
|
||||
app.Name = "ocid"
|
||||
|
@ -19,14 +24,19 @@ func main() {
|
|||
app.Version = "0.0.1"
|
||||
|
||||
app.Flags = []cli.Flag{
|
||||
cli.StringFlag{
|
||||
Name: "root",
|
||||
Value: ocidRoot,
|
||||
Usage: "ocid root dir",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "sandboxdir",
|
||||
Value: "/var/lib/ocid/sandboxes",
|
||||
Value: filepath.Join(ocidRoot, "sandboxes"),
|
||||
Usage: "ocid pod sandbox dir",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "containerdir",
|
||||
Value: "/var/lib/ocid/containers",
|
||||
Value: filepath.Join(ocidRoot, "containers"),
|
||||
Usage: "ocid container dir",
|
||||
},
|
||||
cli.StringFlag{
|
||||
|
@ -94,7 +104,7 @@ func main() {
|
|||
|
||||
containerDir := c.String("containerdir")
|
||||
sandboxDir := c.String("sandboxdir")
|
||||
service, err := server.New(c.String("runtime"), sandboxDir, containerDir)
|
||||
service, err := server.New(c.String("runtime"), c.String("root"), sandboxDir, containerDir)
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ int main(int argc, char *argv[])
|
|||
{
|
||||
int ret;
|
||||
int opt;
|
||||
bool terminal = FALSE;
|
||||
bool terminal = false;
|
||||
const char *cid = NULL;
|
||||
const char *runtime_path = NULL;
|
||||
char cmd[CMD_SIZE];
|
||||
|
@ -88,7 +88,7 @@ int main(int argc, char *argv[])
|
|||
while ((opt = getopt(argc, argv, "tc:r:")) != -1) {
|
||||
switch (opt) {
|
||||
case 't':
|
||||
terminal = TRUE;
|
||||
terminal = true;
|
||||
break;
|
||||
case 'c':
|
||||
cid = optarg;
|
||||
|
@ -230,7 +230,8 @@ int main(int argc, char *argv[])
|
|||
/* Copy data back and forth between STDIN and master fd */
|
||||
while (true) {
|
||||
int ready = epoll_wait(epfd, evlist, MAX_EVENTS, -1);
|
||||
for (int i = 0; i < ready; i++) {
|
||||
int i = 0;
|
||||
for (i = 0; i < ready; i++) {
|
||||
if (evlist[i].events & EPOLLIN) {
|
||||
if (evlist[i].data.fd == STDIN_FILENO) {
|
||||
num_read =
|
||||
|
|
|
@ -76,5 +76,3 @@ clone git github.com/gogo/protobuf 43a2e0b1c32252bfbbdf81f7faa7a88fb3fa4028
|
|||
clone git github.com/gorilla/context v1.1
|
||||
|
||||
clean
|
||||
|
||||
mv vendor/src/* vendor/
|
||||
|
|
|
@ -89,6 +89,7 @@ func (s *Server) CreatePodSandbox(ctx context.Context, req *pb.CreatePodSandboxR
|
|||
// creates a spec Generator with the default spec.
|
||||
g := generate.New()
|
||||
|
||||
podInfraRootfs := filepath.Join(s.root, "graph/vfs/pause")
|
||||
// setup defaults for the pod sandbox
|
||||
g.SetRootPath(filepath.Join(podInfraRootfs, "rootfs"))
|
||||
g.SetRootReadonly(true)
|
||||
|
|
|
@ -24,6 +24,7 @@ const (
|
|||
|
||||
// Server implements the RuntimeService and ImageService
|
||||
type Server struct {
|
||||
root string
|
||||
runtime *oci.Runtime
|
||||
sandboxDir string
|
||||
stateLock sync.Mutex
|
||||
|
@ -102,7 +103,7 @@ func (s *Server) reservePodName(id, name string) (string, error) {
|
|||
}
|
||||
|
||||
// New creates a new Server with options provided
|
||||
func New(runtimePath, sandboxDir, containerDir string) (*Server, error) {
|
||||
func New(runtimePath, root, sandboxDir, containerDir string) (*Server, error) {
|
||||
// TODO: This will go away later when we have wrapper process or systemd acting as
|
||||
// subreaper.
|
||||
if err := utils.SetSubreaper(1); err != nil {
|
||||
|
@ -130,6 +131,7 @@ func New(runtimePath, sandboxDir, containerDir string) (*Server, error) {
|
|||
return nil, err
|
||||
}
|
||||
s := &Server{
|
||||
root: root,
|
||||
runtime: r,
|
||||
netPlugin: netPlugin,
|
||||
sandboxDir: sandboxDir,
|
||||
|
|
85
test/helpers.bash
Normal file
85
test/helpers.bash
Normal file
|
@ -0,0 +1,85 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Root directory of integration tests.
|
||||
INTEGRATION_ROOT=$(dirname "$(readlink -f "$BASH_SOURCE")")
|
||||
|
||||
# Test data path.
|
||||
TESTDATA="${INTEGRATION_ROOT}/../testdata"
|
||||
|
||||
# Root directory of the repository.
|
||||
OCID_ROOT=${OCID_ROOT:-$(cd "$INTEGRATION_ROOT/../.."; pwd -P)}
|
||||
|
||||
# Path of the ocid binary.
|
||||
OCID_BINARY=${OCID_BINARY:-${OCID_ROOT}/ocid/ocid}
|
||||
# Path of the ocic binary.
|
||||
OCIC_BINARY=${OCIC_BINARY:-${OCID_ROOT}/ocid/ocic}
|
||||
# Path of the conmon binary.
|
||||
CONMON_BINARY=${CONMON_BINARY:-${OCID_ROOT}/ocid/conmon/conmon}
|
||||
# Path of the runc binary.
|
||||
RUNC_PATH=$(command -v runc || true)
|
||||
RUNC_BINARY=${RUNC_PATH:-/usr/local/sbin/runc}
|
||||
|
||||
TESTDIR=$(mktemp -d)
|
||||
OCID_SOCKET="$TESTDIR/ocid.sock"
|
||||
|
||||
cp "$CONMON_BINARY" "$TESTDIR/conmon"
|
||||
|
||||
PATH=$PATH:$TESTDIR
|
||||
|
||||
# Run ocid using the binary specified by $OCID_BINARY.
|
||||
# This must ONLY be run on engines created with `start_ocid`.
|
||||
function ocid() {
|
||||
"$OCID_BINARY" "$@"
|
||||
}
|
||||
|
||||
# Run ocic using the binary specified by $OCID_BINARY.
|
||||
function ocic() {
|
||||
"$OCIC_BINARY" --socket "$OCID_SOCKET" "$@"
|
||||
}
|
||||
|
||||
# Communicate with Docker on the host machine.
|
||||
# Should rarely use this.
|
||||
function docker_host() {
|
||||
command docker "$@"
|
||||
}
|
||||
|
||||
# Retry a command $1 times until it succeeds. Wait $2 seconds between retries.
|
||||
function retry() {
|
||||
local attempts=$1
|
||||
shift
|
||||
local delay=$1
|
||||
shift
|
||||
local i
|
||||
|
||||
for ((i=0; i < attempts; i++)); do
|
||||
run "$@"
|
||||
if [[ "$status" -eq 0 ]] ; then
|
||||
return 0
|
||||
fi
|
||||
sleep $delay
|
||||
done
|
||||
|
||||
echo "Command \"$@\" failed $attempts times. Output: $output"
|
||||
false
|
||||
}
|
||||
|
||||
# Waits until the given ocid becomes reachable.
|
||||
function wait_until_reachable() {
|
||||
retry 15 1 ocic runtimeversion
|
||||
}
|
||||
|
||||
# Start ocid.
|
||||
function start_ocid() {
|
||||
"$OCID_BINARY" --debug --socket "$TESTDIR/ocid.sock" --runtime "$RUNC_BINARY" --root "$TESTDIR/ocid" & OCID_PID=$!
|
||||
wait_until_reachable
|
||||
}
|
||||
|
||||
# Stop ocid.
|
||||
function stop_ocid() {
|
||||
kill "$OCID_PID"
|
||||
}
|
||||
|
||||
function cleanup_test() {
|
||||
rm -rf "$TESTDIR"
|
||||
# TODO(runcom): runc list and kill/delete everything!
|
||||
}
|
14
test/runtimeversion.bats
Normal file
14
test/runtimeversion.bats
Normal file
|
@ -0,0 +1,14 @@
|
|||
#!/usr/bin/env bats
|
||||
|
||||
load helpers
|
||||
|
||||
function teardown() {
|
||||
stop_ocid
|
||||
cleanup_test
|
||||
}
|
||||
|
||||
@test "ocic runtimeversion" {
|
||||
start_ocid
|
||||
ocic runtimeversion
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
18
test/test_runner.sh
Executable file
18
test/test_runner.sh
Executable file
|
@ -0,0 +1,18 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
|
||||
|
||||
# Load the helpers.
|
||||
. helpers.bash
|
||||
|
||||
function execute() {
|
||||
>&2 echo "++ $@"
|
||||
eval "$@"
|
||||
}
|
||||
|
||||
# Tests to run. Defaults to all.
|
||||
TESTS=${@:-.}
|
||||
|
||||
# Run the tests.
|
||||
execute time bats --tap $TESTS
|
7
vendor/github.com/docker/docker/daemon/graphdriver/plugin_unsupported.go
generated
vendored
7
vendor/github.com/docker/docker/daemon/graphdriver/plugin_unsupported.go
generated
vendored
|
@ -1,7 +0,0 @@
|
|||
// +build !experimental
|
||||
|
||||
package graphdriver
|
||||
|
||||
func lookupPlugin(name, home string, opts []string) (Driver, error) {
|
||||
return nil, ErrNotSupported
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
Copyright (c) 2009 The Go Authors. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -199,3 +199,4 @@
|
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
|
@ -31,3 +31,5 @@
|
|||
|
||||
### Docker Image
|
||||
- Use Alpine Linux as base image
|
||||
|
||||
|
|
@ -199,3 +199,4 @@ Apache License
|
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
|
@ -60,10 +60,10 @@ For information on upcoming functionality, please see [ROADMAP.md](ROADMAP.md).
|
|||
By default, Docker users pull images from Docker's public registry instance.
|
||||
[Installing Docker](https://docs.docker.com/engine/installation/) gives users this
|
||||
ability. Users can also push images to a repository on Docker's public registry,
|
||||
if they have a [Docker Hub](https://hub.docker.com/) account.
|
||||
if they have a [Docker Hub](https://hub.docker.com/) account.
|
||||
|
||||
For some users and even companies, this default behavior is sufficient. For
|
||||
others, it is not.
|
||||
others, it is not.
|
||||
|
||||
For example, users with their own software products may want to maintain a
|
||||
registry for private, company images. Also, you may wish to deploy your own
|
|
@ -27,7 +27,7 @@ considerations made in respect of the future of the project.
|
|||
Components of the Distribution Project are managed via github [milestones](https://github.com/docker/distribution/milestones). Upcoming
|
||||
features and bugfixes for a component will be added to the relevant milestone. If a feature or
|
||||
bugfix is not part of a milestone, it is currently unscheduled for
|
||||
implementation.
|
||||
implementation.
|
||||
|
||||
* [Registry](#registry)
|
||||
* [Distribution Package](#distribution-package)
|
||||
|
@ -40,7 +40,7 @@ The new Docker registry is the main portion of the distribution repository.
|
|||
Registry 2.0 is the first release of the next-generation registry. This was
|
||||
primarily focused on implementing the [new registry
|
||||
API](https://github.com/docker/distribution/blob/master/docs/spec/api.md),
|
||||
with a focus on security and performance.
|
||||
with a focus on security and performance.
|
||||
|
||||
Following from the Distribution project goals above, we have a set of goals
|
||||
for registry v2 that we would like to follow in the design. New features
|
||||
|
@ -105,9 +105,9 @@ landing in the registry.
|
|||
|
||||
##### Proxying to other Registries
|
||||
|
||||
A _pull-through caching_ mode exists for the registry, but is restricted from
|
||||
A _pull-through caching_ mode exists for the registry, but is restricted from
|
||||
within the docker client to only mirror the official Docker Hub. This functionality
|
||||
can be expanded when image provenance has been specified and implemented in the
|
||||
can be expanded when image provenance has been specified and implemented in the
|
||||
distribution project.
|
||||
|
||||
##### Metadata storage
|
||||
|
@ -247,13 +247,13 @@ Please see the following issues for more detail:
|
|||
- https://github.com/docker/distribution/issues/461
|
||||
- https://github.com/docker/distribution/issues/462
|
||||
|
||||
### Distribution Package
|
||||
### Distribution Package
|
||||
|
||||
At its core, the Distribution Project is a set of Go packages that make up
|
||||
Distribution Components. At this time, most of these packages make up the
|
||||
Registry implementation.
|
||||
Registry implementation.
|
||||
|
||||
The package itself is considered unstable. If you're using it, please take care to vendor the dependent version.
|
||||
The package itself is considered unstable. If you're using it, please take care to vendor the dependent version.
|
||||
|
||||
For feature additions, please see the Registry section. In the future, we may break out a
|
||||
separate Roadmap for distribution-specific features that apply to more than
|
||||
|
@ -264,3 +264,4 @@ just the registry.
|
|||
### Project Planning
|
||||
|
||||
An [Open-Source Planning Process](https://github.com/docker/distribution/wiki/Open-Source-Planning-Process) is used to define the Roadmap. [Project Pages](https://github.com/docker/distribution/wiki) define the goals for each Milestone and identify current progress.
|
||||
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue