mirror of
https://github.com/moby/moby.git
synced 2026-01-12 03:01:38 +00:00
Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5604cbed50 | ||
|
|
7ef1cfd696 | ||
|
|
61c0f4bc3e | ||
|
|
ab1be6f667 | ||
|
|
c06a4c22bb | ||
|
|
3b8c11b1b3 | ||
|
|
0c8c9bada9 | ||
|
|
dc984199eb | ||
|
|
f503494769 | ||
|
|
91880b45a7 | ||
|
|
75d6341d56 | ||
|
|
2735744cb5 | ||
|
|
45730a4584 | ||
|
|
ce9e2d800a | ||
|
|
c3348d02d5 | ||
|
|
8c1d8025f2 | ||
|
|
e04dca2bd6 | ||
|
|
9d68491978 | ||
|
|
ccfb894e6c | ||
|
|
c9417489a2 | ||
|
|
044398a7ad | ||
|
|
41130fb9bc | ||
|
|
9d99e360ba | ||
|
|
25f42443f1 | ||
|
|
4146b8b69b | ||
|
|
0344639420 | ||
|
|
2bebacef5f | ||
|
|
b599a07911 | ||
|
|
456ae2f1e2 |
35
CHANGELOG.md
35
CHANGELOG.md
@@ -5,6 +5,41 @@ information on the list of deprecated flags and APIs please have a look at
|
||||
https://docs.docker.com/engine/deprecated/ where target removal dates can also
|
||||
be found.
|
||||
|
||||
## 1.11.1 (2016-04-26)
|
||||
|
||||
### Distribution
|
||||
|
||||
- Fix schema2 manifest media type to be of type `application/vnd.docker.container.image.v1+json` ([#21949](https://github.com/docker/docker/pull/21949))
|
||||
|
||||
### Documentation
|
||||
|
||||
+ Add missing API documentation for changes introduced with 1.11.0 ([#22048](https://github.com/docker/docker/pull/22048))
|
||||
|
||||
### Builder
|
||||
|
||||
* Append label passed to `docker build` as arguments as an implicit `LABEL` command at the end of the processed `Dockerfile` ([#22184](https://github.com/docker/docker/pull/22184))
|
||||
|
||||
### Networking
|
||||
|
||||
- Fix a panic that would occur when forwarding DNS query ([#22261](https://github.com/docker/docker/pull/22261))
|
||||
- Fix an issue where OS threads could end up within an incorrect network namespace when using user defined networks ([#22261](https://github.com/docker/docker/pull/22261))
|
||||
|
||||
### Runtime
|
||||
|
||||
- Fix a bug preventing labels configuration to be reloaded via the config file ([#22299](https://github.com/docker/docker/pull/22299))
|
||||
- Fix a regression where container mounting `/var/run` would prevent other containers from being removed ([#22256](https://github.com/docker/docker/pull/22256))
|
||||
- Fix an issue where it would be impossible to update both `memory-swap` and `memory` value together ([#22255](https://github.com/docker/docker/pull/22255))
|
||||
- Fix a regression from 1.11.0 where the `/auth` endpoint would not initialize `serveraddress` if it is not provided ([#22254](https://github.com/docker/docker/pull/22254))
|
||||
- Add missing cleanup of container temporary files when cancelling a schedule restart ([#22237](https://github.com/docker/docker/pull/22237))
|
||||
- Removed scary error message when no restart policy is specified ([#21993](https://github.com/docker/docker/pull/21993))
|
||||
- Fix a panic that would occur when the plugins were activated via the json spec ([#22191](https://github.com/docker/docker/pull/22191))
|
||||
- Fix restart backoff logic to correctly reset delay if container ran for at least 10secs ([#22125](https://github.com/docker/docker/pull/22125))
|
||||
- Remove error message when a container restart get cancelled ([#22123](https://github.com/docker/docker/pull/22123))
|
||||
- Fix an issue where `docker` would not correcly clean up after `docker exec` ([#22121](https://github.com/docker/docker/pull/22121))
|
||||
- Fix a panic that could occur when servicing concurrent `docker stats` commands ([#22120](https://github.com/docker/docker/pull/22120))`
|
||||
- Revert deprecation of non-existing host directories auto-creation ([#22065](https://github.com/docker/docker/pull/22065))
|
||||
- Hide misleading rpc error on daemon shutdown ([#22058](https://github.com/docker/docker/pull/22058))
|
||||
|
||||
## 1.11.0 (2016-04-13)
|
||||
|
||||
**IMPORTANT**: With Docker 1.11, a Linux docker installation is now made of 4 binaries (`docker`, [`docker-containerd`](https://github.com/docker/containerd), [`docker-containerd-shim`](https://github.com/docker/containerd) and [`docker-runc`](https://github.com/opencontainers/runc)). If you have scripts relying on docker being a single static binaries, please make sure to update them. Interaction with the daemon stay the same otherwise, the usage of the other binaries should be transparent. A Windows docker installation remains a single binary, `docker.exe`.
|
||||
|
||||
@@ -248,7 +248,7 @@ RUN set -x \
|
||||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install runc
|
||||
ENV RUNC_COMMIT e87436998478d222be209707503c27f6f91be0c5
|
||||
ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
|
||||
@@ -258,7 +258,7 @@ RUN set -x \
|
||||
&& cp runc /usr/local/bin/docker-runc
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT d2f03861c91edaafdcb3961461bf82ae83785ed7
|
||||
ENV CONTAINERD_COMMIT v0.2.1
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
||||
@@ -181,7 +181,7 @@ RUN set -x \
|
||||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install runc
|
||||
ENV RUNC_COMMIT e87436998478d222be209707503c27f6f91be0c5
|
||||
ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
|
||||
@@ -191,7 +191,7 @@ RUN set -x \
|
||||
&& cp runc /usr/local/bin/docker-runc
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT d2f03861c91edaafdcb3961461bf82ae83785ed7
|
||||
ENV CONTAINERD_COMMIT v0.2.1
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
||||
@@ -200,7 +200,7 @@ RUN set -x \
|
||||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install runc
|
||||
ENV RUNC_COMMIT e87436998478d222be209707503c27f6f91be0c5
|
||||
ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
|
||||
@@ -210,7 +210,7 @@ RUN set -x \
|
||||
&& cp runc /usr/local/bin/docker-runc
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT d2f03861c91edaafdcb3961461bf82ae83785ed7
|
||||
ENV CONTAINERD_COMMIT v0.2.1
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
||||
@@ -74,7 +74,7 @@ WORKDIR /go/src/github.com/docker/docker
|
||||
ENV DOCKER_BUILDTAGS apparmor seccomp selinux
|
||||
|
||||
# Install runc
|
||||
ENV RUNC_COMMIT e87436998478d222be209707503c27f6f91be0c5
|
||||
ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
|
||||
@@ -84,7 +84,7 @@ RUN set -x \
|
||||
&& cp runc /usr/local/bin/docker-runc
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT d2f03861c91edaafdcb3961461bf82ae83785ed7
|
||||
ENV CONTAINERD_COMMIT v0.2.1
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
||||
@@ -199,7 +199,7 @@ RUN set -x \
|
||||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install runc
|
||||
ENV RUNC_COMMIT e87436998478d222be209707503c27f6f91be0c5
|
||||
ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
|
||||
@@ -209,7 +209,7 @@ RUN set -x \
|
||||
&& cp runc /usr/local/bin/docker-runc
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT d2f03861c91edaafdcb3961461bf82ae83785ed7
|
||||
ENV CONTAINERD_COMMIT v0.2.1
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
||||
@@ -178,7 +178,7 @@ RUN set -x \
|
||||
&& rm -rf "$GOPATH"
|
||||
|
||||
# Install runc
|
||||
ENV RUNC_COMMIT e87436998478d222be209707503c27f6f91be0c5
|
||||
ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
|
||||
@@ -188,7 +188,7 @@ RUN set -x \
|
||||
&& cp runc /usr/local/bin/docker-runc
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT d2f03861c91edaafdcb3961461bf82ae83785ed7
|
||||
ENV CONTAINERD_COMMIT v0.2.1
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
||||
@@ -30,7 +30,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install runc
|
||||
ENV RUNC_COMMIT e87436998478d222be209707503c27f6f91be0c5
|
||||
ENV RUNC_COMMIT baf6536d6259209c3edfa2b22237af82942d3dfa
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/opencontainers/runc.git "$GOPATH/src/github.com/opencontainers/runc" \
|
||||
@@ -40,7 +40,7 @@ RUN set -x \
|
||||
&& cp runc /usr/local/bin/docker-runc
|
||||
|
||||
# Install containerd
|
||||
ENV CONTAINERD_COMMIT d2f03861c91edaafdcb3961461bf82ae83785ed7
|
||||
ENV CONTAINERD_COMMIT v0.2.1
|
||||
RUN set -x \
|
||||
&& export GOPATH="$(mktemp -d)" \
|
||||
&& git clone git://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" \
|
||||
|
||||
@@ -52,6 +52,7 @@ func WriteError(w http.ResponseWriter, err error) {
|
||||
"conflict": http.StatusConflict,
|
||||
"impossible": http.StatusNotAcceptable,
|
||||
"wrong login/password": http.StatusUnauthorized,
|
||||
"unauthorized": http.StatusUnauthorized,
|
||||
"hasn't been activated": http.StatusForbidden,
|
||||
} {
|
||||
if strings.Contains(errStr, keyword) {
|
||||
|
||||
@@ -7,11 +7,9 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/docker/distribution/digest"
|
||||
"github.com/docker/distribution/registry/api/errcode"
|
||||
"github.com/docker/docker/api/server/httputils"
|
||||
"github.com/docker/docker/builder/dockerfile"
|
||||
"github.com/docker/docker/pkg/ioutils"
|
||||
@@ -132,12 +130,6 @@ func (s *imageRouter) postImagesCreate(ctx context.Context, w http.ResponseWrite
|
||||
err = s.backend.PullImage(ctx, ref, metaHeaders, authConfig, output)
|
||||
}
|
||||
}
|
||||
// Check the error from pulling an image to make sure the request
|
||||
// was authorized. Modify the status if the request was
|
||||
// unauthorized to respond with 401 rather than 500.
|
||||
if err != nil && isAuthorizedError(err) {
|
||||
err = errcode.ErrorCodeUnauthorized.WithMessage(fmt.Sprintf("Authentication is required: %s", err))
|
||||
}
|
||||
} else { //import
|
||||
var newRef reference.Named
|
||||
if repo != "" {
|
||||
@@ -389,16 +381,3 @@ func (s *imageRouter) getImagesSearch(ctx context.Context, w http.ResponseWriter
|
||||
}
|
||||
return httputils.WriteJSON(w, http.StatusOK, query.Results)
|
||||
}
|
||||
|
||||
func isAuthorizedError(err error) bool {
|
||||
if urlError, ok := err.(*url.Error); ok {
|
||||
err = urlError.Err
|
||||
}
|
||||
|
||||
if dError, ok := err.(errcode.Error); ok {
|
||||
if dError.ErrorCode() == errcode.ErrorCodeUnauthorized {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -216,12 +216,20 @@ func (b *Builder) build(config *types.ImageBuildOptions, context builder.Context
|
||||
return "", err
|
||||
}
|
||||
|
||||
if len(b.options.Labels) > 0 {
|
||||
line := "LABEL "
|
||||
for k, v := range b.options.Labels {
|
||||
line += fmt.Sprintf("%q=%q ", k, v)
|
||||
}
|
||||
_, node, err := parser.ParseLine(line)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
b.dockerfile.Children = append(b.dockerfile.Children, node)
|
||||
}
|
||||
|
||||
var shortImgID string
|
||||
for i, n := range b.dockerfile.Children {
|
||||
// we only want to add labels to the last layer
|
||||
if i == len(b.dockerfile.Children)-1 {
|
||||
b.addLabels()
|
||||
}
|
||||
select {
|
||||
case <-b.cancelled:
|
||||
logrus.Debug("Builder: build cancelled!")
|
||||
@@ -237,16 +245,6 @@ func (b *Builder) build(config *types.ImageBuildOptions, context builder.Context
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Commit the layer when there are only one children in
|
||||
// the dockerfile, this is only the `FROM` tag, and
|
||||
// build labels. Otherwise, the new image won't be
|
||||
// labeled properly.
|
||||
// Commit here, so the ID of the final image is reported
|
||||
// properly.
|
||||
if len(b.dockerfile.Children) == 1 && len(b.options.Labels) > 0 {
|
||||
b.commit("", b.runConfig.Cmd, "")
|
||||
}
|
||||
|
||||
shortImgID = stringid.TruncateID(b.image)
|
||||
fmt.Fprintf(b.Stdout, " ---> %s\n", shortImgID)
|
||||
if b.options.Remove {
|
||||
|
||||
@@ -37,19 +37,6 @@ import (
|
||||
"github.com/docker/engine-api/types/strslice"
|
||||
)
|
||||
|
||||
func (b *Builder) addLabels() {
|
||||
// merge labels
|
||||
if len(b.options.Labels) > 0 {
|
||||
logrus.Debugf("[BUILDER] setting labels %v", b.options.Labels)
|
||||
if b.runConfig.Labels == nil {
|
||||
b.runConfig.Labels = make(map[string]string)
|
||||
}
|
||||
for kL, vL := range b.options.Labels {
|
||||
b.runConfig.Labels[kL] = vL
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Builder) commit(id string, autoCmd strslice.StrSlice, comment string) error {
|
||||
if b.disableCommit {
|
||||
return nil
|
||||
@@ -413,20 +400,7 @@ func (b *Builder) processImageFrom(img builder.Image) error {
|
||||
b.image = img.ImageID()
|
||||
|
||||
if img.RunConfig() != nil {
|
||||
imgConfig := *img.RunConfig()
|
||||
// inherit runConfig labels from the current
|
||||
// state if they've been set already.
|
||||
// Ensures that images with only a FROM
|
||||
// get the labels populated properly.
|
||||
if b.runConfig.Labels != nil {
|
||||
if imgConfig.Labels == nil {
|
||||
imgConfig.Labels = make(map[string]string)
|
||||
}
|
||||
for k, v := range b.runConfig.Labels {
|
||||
imgConfig.Labels[k] = v
|
||||
}
|
||||
}
|
||||
b.runConfig = &imgConfig
|
||||
b.runConfig = img.RunConfig()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ func parseSubCommand(rest string) (*Node, map[string]bool, error) {
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
||||
_, child, err := parseLine(rest)
|
||||
_, child, err := ParseLine(rest)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
@@ -68,8 +68,8 @@ func init() {
|
||||
}
|
||||
}
|
||||
|
||||
// parse a line and return the remainder.
|
||||
func parseLine(line string) (string, *Node, error) {
|
||||
// ParseLine parse a line and return the remainder.
|
||||
func ParseLine(line string) (string, *Node, error) {
|
||||
if line = stripComments(line); line == "" {
|
||||
return "", nil, nil
|
||||
}
|
||||
@@ -111,7 +111,7 @@ func Parse(rwc io.Reader) (*Node, error) {
|
||||
for scanner.Scan() {
|
||||
scannedLine := strings.TrimLeftFunc(scanner.Text(), unicode.IsSpace)
|
||||
currentLine++
|
||||
line, child, err := parseLine(scannedLine)
|
||||
line, child, err := ParseLine(scannedLine)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -126,7 +126,7 @@ func Parse(rwc io.Reader) (*Node, error) {
|
||||
continue
|
||||
}
|
||||
|
||||
line, child, err = parseLine(line + newline)
|
||||
line, child, err = ParseLine(line + newline)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -136,7 +136,7 @@ func Parse(rwc io.Reader) (*Node, error) {
|
||||
}
|
||||
}
|
||||
if child == nil && line != "" {
|
||||
_, child, err = parseLine(line)
|
||||
_, child, err = ParseLine(line)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -516,9 +516,9 @@ func copyEscapable(dst io.Writer, src io.ReadCloser, keys []byte) (written int64
|
||||
return written, err
|
||||
}
|
||||
|
||||
// ShouldRestart decides whether the daemon should restart the container or not.
|
||||
// ShouldRestartOnBoot decides whether the daemon should restart the container or not.
|
||||
// This is based on the container's restart policy.
|
||||
func (container *Container) ShouldRestart() bool {
|
||||
func (container *Container) ShouldRestartOnBoot() bool {
|
||||
return container.HostConfig.RestartPolicy.Name == "always" ||
|
||||
(container.HostConfig.RestartPolicy.Name == "unless-stopped" && !container.HasBeenManuallyStopped) ||
|
||||
(container.HostConfig.RestartPolicy.Name == "on-failure" && container.ExitCode != 0)
|
||||
|
||||
@@ -12,5 +12,5 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS apparmor selinux
|
||||
ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux
|
||||
ENV RUNC_BUILDTAGS apparmor selinux
|
||||
|
||||
@@ -12,5 +12,5 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS apparmor seccomp selinux
|
||||
ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux
|
||||
ENV RUNC_BUILDTAGS apparmor seccomp selinux
|
||||
|
||||
@@ -13,5 +13,5 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS apparmor selinux
|
||||
ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux
|
||||
ENV RUNC_BUILDTAGS apparmor selinux
|
||||
|
||||
@@ -41,7 +41,7 @@ for version in "${versions[@]}"; do
|
||||
|
||||
echo >> "$version/Dockerfile"
|
||||
|
||||
extraBuildTags=
|
||||
extraBuildTags='pkcs11'
|
||||
runcBuildTags=
|
||||
|
||||
# this list is sorted alphabetically; please keep it that way
|
||||
|
||||
@@ -12,5 +12,5 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS apparmor exclude_graphdriver_btrfs exclude_graphdriver_devicemapper selinux
|
||||
ENV DOCKER_BUILDTAGS apparmor exclude_graphdriver_btrfs exclude_graphdriver_devicemapper pkcs11 selinux
|
||||
ENV RUNC_BUILDTAGS apparmor selinux
|
||||
|
||||
@@ -12,5 +12,5 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS apparmor selinux
|
||||
ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux
|
||||
ENV RUNC_BUILDTAGS apparmor selinux
|
||||
|
||||
@@ -12,5 +12,5 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS apparmor seccomp selinux
|
||||
ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux
|
||||
ENV RUNC_BUILDTAGS apparmor seccomp selinux
|
||||
|
||||
@@ -12,5 +12,5 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS apparmor seccomp selinux
|
||||
ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux
|
||||
ENV RUNC_BUILDTAGS apparmor seccomp selinux
|
||||
|
||||
@@ -14,6 +14,6 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS selinux
|
||||
ENV DOCKER_BUILDTAGS pkcs11 selinux
|
||||
ENV RUNC_BUILDTAGS selinux
|
||||
|
||||
|
||||
@@ -13,6 +13,6 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS seccomp selinux
|
||||
ENV DOCKER_BUILDTAGS pkcs11 seccomp selinux
|
||||
ENV RUNC_BUILDTAGS seccomp selinux
|
||||
|
||||
|
||||
@@ -13,6 +13,6 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS seccomp selinux
|
||||
ENV DOCKER_BUILDTAGS pkcs11 seccomp selinux
|
||||
ENV RUNC_BUILDTAGS seccomp selinux
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ for version in "${versions[@]}"; do
|
||||
|
||||
echo >> "$version/Dockerfile"
|
||||
|
||||
extraBuildTags=
|
||||
extraBuildTags='pkcs11'
|
||||
runcBuildTags=
|
||||
|
||||
case "$from" in
|
||||
|
||||
@@ -13,6 +13,6 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS selinux
|
||||
ENV DOCKER_BUILDTAGS pkcs11 selinux
|
||||
ENV RUNC_BUILDTAGS selinux
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS selinux
|
||||
ENV DOCKER_BUILDTAGS pkcs11 selinux
|
||||
ENV RUNC_BUILDTAGS selinux
|
||||
|
||||
ENV CGO_CPPFLAGS -D__EXPORTED_HEADERS__ \
|
||||
|
||||
@@ -13,6 +13,6 @@ ENV PATH $PATH:/usr/local/go/bin
|
||||
|
||||
ENV AUTO_GOPATH 1
|
||||
|
||||
ENV DOCKER_BUILDTAGS selinux
|
||||
ENV DOCKER_BUILDTAGS pkcs11 selinux
|
||||
ENV RUNC_BUILDTAGS selinux
|
||||
|
||||
|
||||
@@ -140,6 +140,10 @@ type Daemon struct {
|
||||
// unique enough to only return a single container object
|
||||
// If none of these searches succeed, an error is returned
|
||||
func (daemon *Daemon) GetContainer(prefixOrName string) (*container.Container, error) {
|
||||
if len(prefixOrName) == 0 {
|
||||
return nil, errors.NewBadRequestError(fmt.Errorf("No container name or ID supplied"))
|
||||
}
|
||||
|
||||
if containerByID := daemon.containers.Get(prefixOrName); containerByID != nil {
|
||||
// prefix is an exact match to a full container ID
|
||||
return containerByID, nil
|
||||
@@ -305,7 +309,7 @@ func (daemon *Daemon) restore() error {
|
||||
}
|
||||
// fixme: only if not running
|
||||
// get list of containers we need to restart
|
||||
if daemon.configStore.AutoRestart && !c.IsRunning() && !c.IsPaused() && c.ShouldRestart() {
|
||||
if daemon.configStore.AutoRestart && !c.IsRunning() && !c.IsPaused() && c.ShouldRestartOnBoot() {
|
||||
mapLock.Lock()
|
||||
restartContainers[c] = make(chan struct{})
|
||||
mapLock.Unlock()
|
||||
@@ -532,6 +536,9 @@ func (daemon *Daemon) newContainer(name string, config *containertypes.Config, i
|
||||
|
||||
// GetByName returns a container given a name.
|
||||
func (daemon *Daemon) GetByName(name string) (*container.Container, error) {
|
||||
if len(name) == 0 {
|
||||
return nil, fmt.Errorf("No container name supplied")
|
||||
}
|
||||
fullName := name
|
||||
if name[0] != '/' {
|
||||
fullName = "/" + name
|
||||
@@ -1598,7 +1605,7 @@ func (daemon *Daemon) initDiscovery(config *Config) error {
|
||||
func (daemon *Daemon) Reload(config *Config) error {
|
||||
daemon.configStore.reloadLock.Lock()
|
||||
defer daemon.configStore.reloadLock.Unlock()
|
||||
if config.IsValueSet("label") {
|
||||
if config.IsValueSet("labels") {
|
||||
daemon.configStore.Labels = config.Labels
|
||||
}
|
||||
if config.IsValueSet("debug") {
|
||||
|
||||
@@ -320,7 +320,7 @@ func TestDaemonReloadLabels(t *testing.T) {
|
||||
}
|
||||
|
||||
valuesSets := make(map[string]interface{})
|
||||
valuesSets["label"] = "foo:baz"
|
||||
valuesSets["labels"] = "foo:baz"
|
||||
newConfig := &Config{
|
||||
CommonConfig: CommonConfig{
|
||||
Labels: []string{"foo:baz"},
|
||||
@@ -345,7 +345,7 @@ func TestDaemonReloadNotAffectOthers(t *testing.T) {
|
||||
}
|
||||
|
||||
valuesSets := make(map[string]interface{})
|
||||
valuesSets["label"] = "foo:baz"
|
||||
valuesSets["labels"] = "foo:baz"
|
||||
newConfig := &Config{
|
||||
CommonConfig: CommonConfig{
|
||||
Labels: []string{"foo:baz"},
|
||||
|
||||
@@ -671,6 +671,7 @@ func (daemon *Daemon) createSpec(c *container.Container) (*libcontainerd.Spec, e
|
||||
}
|
||||
s.Process.SelinuxLabel = c.GetProcessLabel()
|
||||
s.Process.NoNewPrivileges = c.NoNewPrivileges
|
||||
s.Linux.MountLabel = c.MountLabel
|
||||
|
||||
return (*libcontainerd.Spec)(&s), nil
|
||||
}
|
||||
|
||||
@@ -41,11 +41,11 @@ func (daemon *Daemon) ContainerStats(prefixOrName string, config *backend.Contai
|
||||
|
||||
var preCPUStats types.CPUStats
|
||||
getStatJSON := func(v interface{}) *types.StatsJSON {
|
||||
ss := v.(*types.StatsJSON)
|
||||
ss := v.(types.StatsJSON)
|
||||
ss.PreCPUStats = preCPUStats
|
||||
// ss.MemoryStats.Limit = uint64(update.MemoryLimit)
|
||||
preCPUStats = ss.CPUStats
|
||||
return ss
|
||||
return &ss
|
||||
}
|
||||
|
||||
enc := json.NewEncoder(outStream)
|
||||
|
||||
@@ -135,7 +135,7 @@ func (s *statsCollector) run() {
|
||||
// FIXME: move to containerd
|
||||
stats.CPUStats.SystemUsage = systemUsage
|
||||
|
||||
pair.publisher.Publish(stats)
|
||||
pair.publisher.Publish(*stats)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ import (
|
||||
"github.com/docker/distribution/manifest/schema1"
|
||||
"github.com/docker/distribution/manifest/schema2"
|
||||
"github.com/docker/distribution/registry/api/errcode"
|
||||
"github.com/docker/distribution/registry/client"
|
||||
"github.com/docker/distribution/registry/client/auth"
|
||||
"github.com/docker/distribution/registry/client/transport"
|
||||
"github.com/docker/docker/distribution/metadata"
|
||||
@@ -338,7 +337,7 @@ func (p *v2Puller) pullV2Tag(ctx context.Context, ref reference.Named) (tagUpdat
|
||||
// NOTE: not using TagService.Get, since it uses HEAD requests
|
||||
// against the manifests endpoint, which are not supported by
|
||||
// all registry versions.
|
||||
manifest, err = manSvc.Get(ctx, "", client.WithTag(tagged.Tag()))
|
||||
manifest, err = manSvc.Get(ctx, "", distribution.WithTag(tagged.Tag()))
|
||||
if err != nil {
|
||||
return false, allowV1Fallback(err)
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ func (p *v2Pusher) pushV2Tag(ctx context.Context, ref reference.NamedTagged, ima
|
||||
return err
|
||||
}
|
||||
|
||||
putOptions := []distribution.ManifestServiceOption{client.WithTag(ref.Tag())}
|
||||
putOptions := []distribution.ManifestServiceOption{distribution.WithTag(ref.Tag())}
|
||||
if _, err = manSvc.Put(ctx, manifest, putOptions...); err != nil {
|
||||
logrus.Warnf("failed to upload schema2 manifest: %v - falling back to schema1", err)
|
||||
|
||||
|
||||
@@ -517,8 +517,8 @@ Return low-level information on the container `id`
|
||||
"Tty": false,
|
||||
"User": "",
|
||||
"Volumes": {
|
||||
"/volumes/data": {}
|
||||
},
|
||||
"/volumes/data": {}
|
||||
},
|
||||
"WorkingDir": "",
|
||||
"StopSignal": "SIGTERM"
|
||||
},
|
||||
@@ -1660,7 +1660,7 @@ Query Parameters:
|
||||
You can provide one or more `t` parameters.
|
||||
- **remote** – A Git repository URI or HTTP/HTTPS URI build source. If the
|
||||
URI specifies a filename, the file's contents are placed into a file
|
||||
called `Dockerfile`.
|
||||
called `Dockerfile`.
|
||||
- **q** – Suppress verbose build output.
|
||||
- **nocache** – Do not use the cache when building the image.
|
||||
- **pull** - Attempt to pull the image even if an older image exists locally.
|
||||
@@ -1678,6 +1678,7 @@ Query Parameters:
|
||||
variable expansion in other Dockerfile instructions. This is not meant for
|
||||
passing secret values. [Read more about the buildargs instruction](../../reference/builder.md#arg)
|
||||
- **shmsize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB.
|
||||
- **labels** – JSON map of string pairs for labels to set on the image.
|
||||
|
||||
Request Headers:
|
||||
|
||||
@@ -2639,7 +2640,7 @@ interactive session with the `exec` command.
|
||||
**Example response**:
|
||||
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: vnd.docker.raw-stream
|
||||
Content-Type: application/vnd.docker.raw-stream
|
||||
|
||||
{{ STREAM }}
|
||||
|
||||
@@ -2774,7 +2775,11 @@ Create a volume
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"Name": "tardis"
|
||||
"Name": "tardis",
|
||||
"Labels": {
|
||||
"com.example.some-label": "some-value",
|
||||
"com.example.some-other-label": "some-other-value"
|
||||
},
|
||||
}
|
||||
|
||||
**Example response**:
|
||||
@@ -2785,7 +2790,11 @@ Create a volume
|
||||
{
|
||||
"Name": "tardis",
|
||||
"Driver": "local",
|
||||
"Mountpoint": "/var/lib/docker/volumes/tardis"
|
||||
"Mountpoint": "/var/lib/docker/volumes/tardis",
|
||||
"Labels": {
|
||||
"com.example.some-label": "some-value",
|
||||
"com.example.some-other-label": "some-other-value"
|
||||
},
|
||||
}
|
||||
|
||||
Status Codes:
|
||||
@@ -2799,6 +2808,7 @@ JSON Parameters:
|
||||
- **Driver** - Name of the volume driver to use. Defaults to `local` for the name.
|
||||
- **DriverOpts** - A mapping of driver options and values. These options are
|
||||
passed directly to the driver and are driver specific.
|
||||
- **Labels** - Labels to set on the volume, specified as a map: `{"key":"value" [,"key2":"value2"]}`
|
||||
|
||||
### Inspect a volume
|
||||
|
||||
@@ -2816,9 +2826,13 @@ Return low-level information on the volume `name`
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"Name": "tardis",
|
||||
"Driver": "local",
|
||||
"Mountpoint": "/var/lib/docker/volumes/tardis"
|
||||
"Name": "tardis",
|
||||
"Driver": "local",
|
||||
"Mountpoint": "/var/lib/docker/volumes/tardis/_data",
|
||||
"Labels": {
|
||||
"com.example.some-label": "some-value",
|
||||
"com.example.some-other-label": "some-other-value"
|
||||
}
|
||||
}
|
||||
|
||||
Status Codes:
|
||||
@@ -2989,6 +3003,10 @@ Content-Type: application/json
|
||||
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
|
||||
"com.docker.network.bridge.name": "docker0",
|
||||
"com.docker.network.driver.mtu": "1500"
|
||||
},
|
||||
"Labels": {
|
||||
"com.example.some-label": "some-value",
|
||||
"com.example.some-other-label": "some-other-value"
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -3012,6 +3030,7 @@ Content-Type: application/json
|
||||
|
||||
{
|
||||
"Name":"isolated_nw",
|
||||
"CheckDuplicate":false,
|
||||
"Driver":"bridge",
|
||||
"EnableIPv6": true,
|
||||
"IPAM":{
|
||||
@@ -3030,7 +3049,19 @@ Content-Type: application/json
|
||||
"foo": "bar"
|
||||
}
|
||||
},
|
||||
"Internal":true
|
||||
"Internal":true,
|
||||
"Options": {
|
||||
"com.docker.network.bridge.default_bridge": "true",
|
||||
"com.docker.network.bridge.enable_icc": "true",
|
||||
"com.docker.network.bridge.enable_ip_masquerade": "true",
|
||||
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
|
||||
"com.docker.network.bridge.name": "docker0",
|
||||
"com.docker.network.driver.mtu": "1500"
|
||||
},
|
||||
"Labels": {
|
||||
"com.example.some-label": "some-value",
|
||||
"com.example.some-other-label": "some-other-value"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3055,12 +3086,13 @@ Status Codes:
|
||||
JSON Parameters:
|
||||
|
||||
- **Name** - The new network's name. this is a mandatory field
|
||||
- **CheckDuplicate** - Requests daemon to check for networks with same name
|
||||
- **Driver** - Name of the network driver plugin to use. Defaults to `bridge` driver
|
||||
- **Internal** - Restrict external access to the network
|
||||
- **IPAM** - Optional custom IP scheme for the network
|
||||
- **EnableIPv6** - Enable IPv6 on the network
|
||||
- **Options** - Network specific options to be used by the drivers
|
||||
- **CheckDuplicate** - Requests daemon to check for networks with same name
|
||||
- **Labels** - Labels to set on the network, specified as a map: `{"key":"value" [,"key2":"value2"]}`
|
||||
|
||||
### Connect a container to a network
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ clone git github.com/RackSec/srslog 259aed10dfa74ea2961eddd1d9847619f6e98837
|
||||
clone git github.com/imdario/mergo 0.2.1
|
||||
|
||||
#get libnetwork packages
|
||||
clone git github.com/docker/libnetwork v0.7.0-rc.6
|
||||
clone git github.com/docker/libnetwork v0.7.0-rc.7
|
||||
clone git github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
|
||||
clone git github.com/hashicorp/go-msgpack 71c2886f5a673a35f909803f38ece5810165097b
|
||||
clone git github.com/hashicorp/memberlist 9a1e242e454d2443df330bdd51a436d5a9058fc4
|
||||
@@ -49,7 +49,7 @@ clone git github.com/boltdb/bolt v1.2.0
|
||||
clone git github.com/miekg/dns 75e6e86cc601825c5dbcd4e0c209eab180997cd7
|
||||
|
||||
# get graph and distribution packages
|
||||
clone git github.com/docker/distribution d06d6d3b093302c02a93153ac7b06ebc0ffd1793
|
||||
clone git github.com/docker/distribution 467fc068d88aa6610691b7f1a677271a3fac4aac
|
||||
clone git github.com/vbatts/tar-split v0.9.11
|
||||
|
||||
# get desired notary commit, might also need to be updated in Dockerfile
|
||||
@@ -61,7 +61,7 @@ clone git github.com/docker/go v1.5.1-1-1-gbaf439e
|
||||
clone git github.com/agl/ed25519 d2b94fd789ea21d12fac1a4443dd3a3f79cda72c
|
||||
|
||||
clone git github.com/opencontainers/runc 7b6c4c418d5090f4f11eee949fdf49afd15838c9 # libcontainer
|
||||
clone git github.com/opencontainers/specs 93ca97e83ca7fb4fba6d9e30d5470f99ddc02d11 # specs
|
||||
clone git github.com/opencontainers/specs f955d90e70a98ddfb886bd930ffd076da9b67998 # specs
|
||||
clone git github.com/seccomp/libseccomp-golang 1b506fc7c24eec5a3693cdcbed40d9c226cfc6a1
|
||||
# libcontainer deps (see src/github.com/opencontainers/runc/Godeps/Godeps.json)
|
||||
clone git github.com/coreos/go-systemd v4
|
||||
@@ -90,5 +90,5 @@ clone git google.golang.org/api dc6d2353af16e2a2b0ff6986af051d473a4ed468 https:/
|
||||
clone git google.golang.org/cloud dae7e3d993bc3812a2185af60552bb6b847e52a0 https://code.googlesource.com/gocloud
|
||||
|
||||
# containerd
|
||||
clone git github.com/docker/containerd 07c95162cdcead88dfe4ca0ffb3cea02375ec54d
|
||||
clone git github.com/docker/containerd v0.2.1
|
||||
clean
|
||||
|
||||
23
integration-cli/docker_api_auth_test.go
Normal file
23
integration-cli/docker_api_auth_test.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/docker/docker/pkg/integration/checker"
|
||||
"github.com/docker/engine-api/types"
|
||||
"github.com/go-check/check"
|
||||
)
|
||||
|
||||
// Test case for #22244
|
||||
func (s *DockerSuite) TestAuthApi(c *check.C) {
|
||||
config := types.AuthConfig{
|
||||
Username: "no-user",
|
||||
Password: "no-password",
|
||||
}
|
||||
|
||||
expected := "Get https://registry-1.docker.io/v2/: unauthorized: incorrect username or password\n"
|
||||
status, body, err := sockRequest("POST", "/auth", config)
|
||||
c.Assert(err, check.IsNil)
|
||||
c.Assert(status, check.Equals, http.StatusUnauthorized)
|
||||
c.Assert(string(body), checker.Contains, expected, check.Commentf("Expected: %v, got: %v", expected, string(body)))
|
||||
}
|
||||
@@ -1616,3 +1616,11 @@ func (s *DockerSuite) TestPostContainersCreateWithOomScoreAdjInvalidRange(c *che
|
||||
c.Fatalf("Expected output to contain %q, got %q", expected, string(b))
|
||||
}
|
||||
}
|
||||
|
||||
// test case for #22210 where an emtpy container name caused panic.
|
||||
func (s *DockerSuite) TestContainerApiDeleteWithEmptyName(c *check.C) {
|
||||
status, out, err := sockRequest("DELETE", "/containers/", nil)
|
||||
c.Assert(err, checker.IsNil)
|
||||
c.Assert(status, checker.Equals, http.StatusBadRequest)
|
||||
c.Assert(string(out), checker.Contains, "No container name or ID supplied")
|
||||
}
|
||||
|
||||
@@ -6883,3 +6883,94 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestBuildWithExternalAuth(c *check.C)
|
||||
out, _, err := runCommandWithOutput(buildCmd)
|
||||
c.Assert(err, check.IsNil, check.Commentf(out))
|
||||
}
|
||||
|
||||
// Test cases in #22036
|
||||
func (s *DockerSuite) TestBuildLabelsOverride(c *check.C) {
|
||||
testRequires(c, DaemonIsLinux)
|
||||
|
||||
// Command line option labels will always override
|
||||
name := "scratchy"
|
||||
expected := `{"bar":"from-flag","foo":"from-flag"}`
|
||||
_, err := buildImage(name,
|
||||
`FROM scratch
|
||||
LABEL foo=from-dockerfile`,
|
||||
true, "--label", "foo=from-flag", "--label", "bar=from-flag")
|
||||
c.Assert(err, check.IsNil)
|
||||
|
||||
res := inspectFieldJSON(c, name, "Config.Labels")
|
||||
if res != expected {
|
||||
c.Fatalf("Labels %s, expected %s", res, expected)
|
||||
}
|
||||
|
||||
name = "from"
|
||||
expected = `{"foo":"from-dockerfile"}`
|
||||
_, err = buildImage(name,
|
||||
`FROM scratch
|
||||
LABEL foo from-dockerfile`,
|
||||
true)
|
||||
c.Assert(err, check.IsNil)
|
||||
|
||||
res = inspectFieldJSON(c, name, "Config.Labels")
|
||||
if res != expected {
|
||||
c.Fatalf("Labels %s, expected %s", res, expected)
|
||||
}
|
||||
|
||||
// Command line option label will override even via `FROM`
|
||||
name = "new"
|
||||
expected = `{"bar":"from-dockerfile2","foo":"new"}`
|
||||
_, err = buildImage(name,
|
||||
`FROM from
|
||||
LABEL bar from-dockerfile2`,
|
||||
true, "--label", "foo=new")
|
||||
c.Assert(err, check.IsNil)
|
||||
|
||||
res = inspectFieldJSON(c, name, "Config.Labels")
|
||||
if res != expected {
|
||||
c.Fatalf("Labels %s, expected %s", res, expected)
|
||||
}
|
||||
|
||||
// Command line option without a value set (--label foo, --label bar=)
|
||||
// will be treated as --label foo="", --label bar=""
|
||||
name = "scratchy2"
|
||||
expected = `{"bar":"","foo":""}`
|
||||
_, err = buildImage(name,
|
||||
`FROM scratch
|
||||
LABEL foo=from-dockerfile`,
|
||||
true, "--label", "foo", "--label", "bar=")
|
||||
c.Assert(err, check.IsNil)
|
||||
|
||||
res = inspectFieldJSON(c, name, "Config.Labels")
|
||||
if res != expected {
|
||||
c.Fatalf("Labels %s, expected %s", res, expected)
|
||||
}
|
||||
|
||||
// Command line option without a value set (--label foo, --label bar=)
|
||||
// will be treated as --label foo="", --label bar=""
|
||||
// This time is for inherited images
|
||||
name = "new2"
|
||||
expected = `{"bar":"","foo":""}`
|
||||
_, err = buildImage(name,
|
||||
`FROM from
|
||||
LABEL bar from-dockerfile2`,
|
||||
true, "--label", "foo=", "--label", "bar")
|
||||
c.Assert(err, check.IsNil)
|
||||
|
||||
res = inspectFieldJSON(c, name, "Config.Labels")
|
||||
if res != expected {
|
||||
c.Fatalf("Labels %s, expected %s", res, expected)
|
||||
}
|
||||
|
||||
// Command line option labels with only `FROM`
|
||||
name = "scratchy"
|
||||
expected = `{"bar":"from-flag","foo":"from-flag"}`
|
||||
_, err = buildImage(name,
|
||||
`FROM scratch`,
|
||||
true, "--label", "foo=from-flag", "--label", "bar=from-flag")
|
||||
c.Assert(err, check.IsNil)
|
||||
|
||||
res = inspectFieldJSON(c, name, "Config.Labels")
|
||||
if res != expected {
|
||||
c.Fatalf("Labels %s, expected %s", res, expected)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/docker/docker/pkg/integration/checker"
|
||||
"github.com/docker/docker/pkg/mount"
|
||||
"github.com/docker/go-units"
|
||||
"github.com/docker/libnetwork/iptables"
|
||||
"github.com/docker/libtrust"
|
||||
@@ -1849,31 +1850,28 @@ func (s *DockerDaemonSuite) TestBridgeIPIsExcludedFromAllocatorPool(c *check.C)
|
||||
}
|
||||
|
||||
// Test daemon for no space left on device error
|
||||
func (s *DockerDaemonSuite) TestDaemonNoSpaceleftOnDeviceError(c *check.C) {
|
||||
func (s *DockerDaemonSuite) TestDaemonNoSpaceLeftOnDeviceError(c *check.C) {
|
||||
testRequires(c, SameHostDaemon, DaemonIsLinux, Network)
|
||||
|
||||
testDir, err := ioutil.TempDir("", "no-space-left-on-device-test")
|
||||
c.Assert(err, checker.IsNil)
|
||||
defer os.RemoveAll(testDir)
|
||||
c.Assert(mount.MakeRShared(testDir), checker.IsNil)
|
||||
defer mount.Unmount(testDir)
|
||||
defer mount.Unmount(filepath.Join(testDir, "test-mount"))
|
||||
|
||||
// create a 2MiB image and mount it as graph root
|
||||
cmd := exec.Command("dd", "of=/tmp/testfs.img", "bs=1M", "seek=2", "count=0")
|
||||
if err := cmd.Run(); err != nil {
|
||||
c.Fatalf("dd failed: %v", err)
|
||||
}
|
||||
cmd = exec.Command("mkfs.ext4", "-F", "/tmp/testfs.img")
|
||||
if err := cmd.Run(); err != nil {
|
||||
c.Fatalf("mkfs.ext4 failed: %v", err)
|
||||
}
|
||||
cmd = exec.Command("mkdir", "-p", "/tmp/testfs-mount")
|
||||
if err := cmd.Run(); err != nil {
|
||||
c.Fatalf("mkdir failed: %v", err)
|
||||
}
|
||||
cmd = exec.Command("mount", "-t", "ext4", "-no", "loop,rw", "/tmp/testfs.img", "/tmp/testfs-mount")
|
||||
if err := cmd.Run(); err != nil {
|
||||
c.Fatalf("mount failed: %v", err)
|
||||
}
|
||||
err := s.d.Start("--graph", "/tmp/testfs-mount")
|
||||
// Why in a container? Because `mount` sometimes behaves weirdly and often fails outright on this test in debian:jessie (which is what the test suite runs under if run from the Makefile)
|
||||
dockerCmd(c, "run", "--rm", "-v", testDir+":/test", "busybox", "sh", "-c", "dd of=/test/testfs.img bs=1M seek=2 count=0")
|
||||
out, _, err := runCommandWithOutput(exec.Command("mkfs.ext4", "-F", filepath.Join(testDir, "testfs.img"))) // `mkfs.ext4` is not in busybox
|
||||
c.Assert(err, checker.IsNil, check.Commentf(out))
|
||||
dockerCmd(c, "run", "--privileged", "--rm", "-v", testDir+":/test:shared", "busybox", "sh", "-c", "mkdir -p /test/test-mount && mount -t ext4 -no loop,rw /test/testfs.img /test/test-mount")
|
||||
|
||||
err = s.d.Start("--graph", filepath.Join(testDir, "test-mount"))
|
||||
c.Assert(err, check.IsNil)
|
||||
|
||||
// pull a repository large enough to fill the mount point
|
||||
out, err := s.d.Cmd("pull", "registry:2")
|
||||
out, err = s.d.Cmd("pull", "registry:2")
|
||||
c.Assert(out, checker.Contains, "no space left on device")
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ import (
|
||||
"github.com/docker/docker/daemon/graphdriver"
|
||||
"github.com/docker/docker/daemon/graphdriver/vfs"
|
||||
"github.com/docker/docker/pkg/archive"
|
||||
"github.com/docker/docker/pkg/plugins"
|
||||
"github.com/go-check/check"
|
||||
)
|
||||
|
||||
@@ -26,10 +27,11 @@ func init() {
|
||||
}
|
||||
|
||||
type DockerExternalGraphdriverSuite struct {
|
||||
server *httptest.Server
|
||||
ds *DockerSuite
|
||||
d *Daemon
|
||||
ec *graphEventsCounter
|
||||
server *httptest.Server
|
||||
jserver *httptest.Server
|
||||
ds *DockerSuite
|
||||
d *Daemon
|
||||
ec map[string]*graphEventsCounter
|
||||
}
|
||||
|
||||
type graphEventsCounter struct {
|
||||
@@ -51,7 +53,6 @@ type graphEventsCounter struct {
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) SetUpTest(c *check.C) {
|
||||
s.d = NewDaemon(c)
|
||||
s.ec = &graphEventsCounter{}
|
||||
}
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) TearDownTest(c *check.C) {
|
||||
@@ -60,9 +61,30 @@ func (s *DockerExternalGraphdriverSuite) TearDownTest(c *check.C) {
|
||||
}
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
s.ec = make(map[string]*graphEventsCounter)
|
||||
s.setUpPluginViaSpecFile(c)
|
||||
s.setUpPluginViaJSONFile(c)
|
||||
}
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) setUpPluginViaSpecFile(c *check.C) {
|
||||
mux := http.NewServeMux()
|
||||
s.server = httptest.NewServer(mux)
|
||||
|
||||
s.setUpPlugin(c, "test-external-graph-driver", "spec", mux, []byte(s.server.URL))
|
||||
}
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) setUpPluginViaJSONFile(c *check.C) {
|
||||
mux := http.NewServeMux()
|
||||
s.jserver = httptest.NewServer(mux)
|
||||
|
||||
p := plugins.Plugin{Name: "json-external-graph-driver", Addr: s.jserver.URL}
|
||||
b, err := json.Marshal(p)
|
||||
c.Assert(err, check.IsNil)
|
||||
|
||||
s.setUpPlugin(c, "json-external-graph-driver", "json", mux, b)
|
||||
}
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) setUpPlugin(c *check.C, name string, ext string, mux *http.ServeMux, b []byte) {
|
||||
type graphDriverRequest struct {
|
||||
ID string `json:",omitempty"`
|
||||
Parent string `json:",omitempty"`
|
||||
@@ -99,24 +121,25 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
return nil
|
||||
}
|
||||
|
||||
base, err := ioutil.TempDir("", "external-graph-test")
|
||||
base, err := ioutil.TempDir("", name)
|
||||
c.Assert(err, check.IsNil)
|
||||
vfsProto, err := vfs.Init(base, []string{}, nil, nil)
|
||||
c.Assert(err, check.IsNil, check.Commentf("error initializing graph driver"))
|
||||
driver := graphdriver.NewNaiveDiffDriver(vfsProto, nil, nil)
|
||||
|
||||
s.ec[ext] = &graphEventsCounter{}
|
||||
mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.activations++
|
||||
s.ec[ext].activations++
|
||||
respond(w, `{"Implements": ["GraphDriver"]}`)
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Init", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.init++
|
||||
s.ec[ext].init++
|
||||
respond(w, "{}")
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Create", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.creations++
|
||||
s.ec[ext].creations++
|
||||
|
||||
var req graphDriverRequest
|
||||
if err := decReq(r.Body, &req, w); err != nil {
|
||||
@@ -130,7 +153,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Remove", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.removals++
|
||||
s.ec[ext].removals++
|
||||
|
||||
var req graphDriverRequest
|
||||
if err := decReq(r.Body, &req, w); err != nil {
|
||||
@@ -145,7 +168,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Get", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.gets++
|
||||
s.ec[ext].gets++
|
||||
|
||||
var req graphDriverRequest
|
||||
if err := decReq(r.Body, &req, w); err != nil {
|
||||
@@ -161,7 +184,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Put", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.puts++
|
||||
s.ec[ext].puts++
|
||||
|
||||
var req graphDriverRequest
|
||||
if err := decReq(r.Body, &req, w); err != nil {
|
||||
@@ -176,7 +199,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Exists", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.exists++
|
||||
s.ec[ext].exists++
|
||||
|
||||
var req graphDriverRequest
|
||||
if err := decReq(r.Body, &req, w); err != nil {
|
||||
@@ -186,12 +209,12 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Status", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.stats++
|
||||
s.ec[ext].stats++
|
||||
respond(w, &graphDriverResponse{Status: driver.Status()})
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Cleanup", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.cleanups++
|
||||
s.ec[ext].cleanups++
|
||||
err := driver.Cleanup()
|
||||
if err != nil {
|
||||
respond(w, err)
|
||||
@@ -201,7 +224,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.GetMetadata", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.metadata++
|
||||
s.ec[ext].metadata++
|
||||
|
||||
var req graphDriverRequest
|
||||
if err := decReq(r.Body, &req, w); err != nil {
|
||||
@@ -217,7 +240,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Diff", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.diff++
|
||||
s.ec[ext].diff++
|
||||
|
||||
var req graphDriverRequest
|
||||
if err := decReq(r.Body, &req, w); err != nil {
|
||||
@@ -233,7 +256,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.Changes", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.changes++
|
||||
s.ec[ext].changes++
|
||||
var req graphDriverRequest
|
||||
if err := decReq(r.Body, &req, w); err != nil {
|
||||
return
|
||||
@@ -248,7 +271,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.ApplyDiff", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.applydiff++
|
||||
s.ec[ext].applydiff++
|
||||
var diff archive.Reader = r.Body
|
||||
defer r.Body.Close()
|
||||
|
||||
@@ -268,7 +291,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
})
|
||||
|
||||
mux.HandleFunc("/GraphDriver.DiffSize", func(w http.ResponseWriter, r *http.Request) {
|
||||
s.ec.diffsize++
|
||||
s.ec[ext].diffsize++
|
||||
|
||||
var req graphDriverRequest
|
||||
if err := decReq(r.Body, &req, w); err != nil {
|
||||
@@ -286,19 +309,26 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
|
||||
err = os.MkdirAll("/etc/docker/plugins", 0755)
|
||||
c.Assert(err, check.IsNil, check.Commentf("error creating /etc/docker/plugins"))
|
||||
|
||||
err = ioutil.WriteFile("/etc/docker/plugins/test-external-graph-driver.spec", []byte(s.server.URL), 0644)
|
||||
c.Assert(err, check.IsNil, check.Commentf("error writing to /etc/docker/plugins/test-external-graph-driver.spec"))
|
||||
specFile := "/etc/docker/plugins/" + name + "." + ext
|
||||
err = ioutil.WriteFile(specFile, b, 0644)
|
||||
c.Assert(err, check.IsNil, check.Commentf("error writing to %s", specFile))
|
||||
}
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) TearDownSuite(c *check.C) {
|
||||
s.server.Close()
|
||||
s.jserver.Close()
|
||||
|
||||
err := os.RemoveAll("/etc/docker/plugins")
|
||||
c.Assert(err, check.IsNil, check.Commentf("error removing /etc/docker/plugins"))
|
||||
}
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriver(c *check.C) {
|
||||
if err := s.d.StartWithBusybox("-s", "test-external-graph-driver"); err != nil {
|
||||
s.testExternalGraphDriver("test-external-graph-driver", "spec", c)
|
||||
s.testExternalGraphDriver("json-external-graph-driver", "json", c)
|
||||
}
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) testExternalGraphDriver(name string, ext string, c *check.C) {
|
||||
if err := s.d.StartWithBusybox("-s", name); err != nil {
|
||||
b, _ := ioutil.ReadFile(s.d.LogFileName())
|
||||
c.Assert(err, check.IsNil, check.Commentf("\n%s", string(b)))
|
||||
}
|
||||
@@ -306,11 +336,11 @@ func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriver(c *check.C) {
|
||||
out, err := s.d.Cmd("run", "-d", "--name=graphtest", "busybox", "sh", "-c", "echo hello > /hello")
|
||||
c.Assert(err, check.IsNil, check.Commentf(out))
|
||||
|
||||
err = s.d.Restart("-s", "test-external-graph-driver")
|
||||
err = s.d.Restart("-s", name)
|
||||
|
||||
out, err = s.d.Cmd("inspect", "--format='{{.GraphDriver.Name}}'", "graphtest")
|
||||
c.Assert(err, check.IsNil, check.Commentf(out))
|
||||
c.Assert(strings.TrimSpace(out), check.Equals, "test-external-graph-driver")
|
||||
c.Assert(strings.TrimSpace(out), check.Equals, name)
|
||||
|
||||
out, err = s.d.Cmd("diff", "graphtest")
|
||||
c.Assert(err, check.IsNil, check.Commentf(out))
|
||||
@@ -327,19 +357,19 @@ func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriver(c *check.C) {
|
||||
|
||||
// Don't check s.ec.exists, because the daemon no longer calls the
|
||||
// Exists function.
|
||||
c.Assert(s.ec.activations, check.Equals, 2)
|
||||
c.Assert(s.ec.init, check.Equals, 2)
|
||||
c.Assert(s.ec.creations >= 1, check.Equals, true)
|
||||
c.Assert(s.ec.removals >= 1, check.Equals, true)
|
||||
c.Assert(s.ec.gets >= 1, check.Equals, true)
|
||||
c.Assert(s.ec.puts >= 1, check.Equals, true)
|
||||
c.Assert(s.ec.stats, check.Equals, 3)
|
||||
c.Assert(s.ec.cleanups, check.Equals, 2)
|
||||
c.Assert(s.ec.applydiff >= 1, check.Equals, true)
|
||||
c.Assert(s.ec.changes, check.Equals, 1)
|
||||
c.Assert(s.ec.diffsize, check.Equals, 0)
|
||||
c.Assert(s.ec.diff, check.Equals, 0)
|
||||
c.Assert(s.ec.metadata, check.Equals, 1)
|
||||
c.Assert(s.ec[ext].activations, check.Equals, 2)
|
||||
c.Assert(s.ec[ext].init, check.Equals, 2)
|
||||
c.Assert(s.ec[ext].creations >= 1, check.Equals, true)
|
||||
c.Assert(s.ec[ext].removals >= 1, check.Equals, true)
|
||||
c.Assert(s.ec[ext].gets >= 1, check.Equals, true)
|
||||
c.Assert(s.ec[ext].puts >= 1, check.Equals, true)
|
||||
c.Assert(s.ec[ext].stats, check.Equals, 3)
|
||||
c.Assert(s.ec[ext].cleanups, check.Equals, 2)
|
||||
c.Assert(s.ec[ext].applydiff >= 1, check.Equals, true)
|
||||
c.Assert(s.ec[ext].changes, check.Equals, 1)
|
||||
c.Assert(s.ec[ext].diffsize, check.Equals, 0)
|
||||
c.Assert(s.ec[ext].diff, check.Equals, 0)
|
||||
c.Assert(s.ec[ext].metadata, check.Equals, 1)
|
||||
}
|
||||
|
||||
func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriverPull(c *check.C) {
|
||||
|
||||
@@ -163,15 +163,9 @@ func (clnt *client) Create(containerID string, spec Spec, options ...CreateOptio
|
||||
}
|
||||
}()
|
||||
|
||||
// uid/gid
|
||||
rootfsDir := filepath.Join(container.dir, "rootfs")
|
||||
if err := idtools.MkdirAllAs(rootfsDir, 0700, uid, gid); err != nil && !os.IsExist(err) {
|
||||
if err := idtools.MkdirAllAs(container.dir, 0700, uid, gid); err != nil && !os.IsExist(err) {
|
||||
return err
|
||||
}
|
||||
if err := syscall.Mount(spec.Root.Path, rootfsDir, "bind", syscall.MS_REC|syscall.MS_BIND, ""); err != nil {
|
||||
return err
|
||||
}
|
||||
spec.Root.Path = "rootfs"
|
||||
|
||||
f, err := os.Create(filepath.Join(container.dir, configFilename))
|
||||
if err != nil {
|
||||
@@ -258,6 +252,22 @@ func (clnt *client) Stats(containerID string) (*Stats, error) {
|
||||
return (*Stats)(resp), nil
|
||||
}
|
||||
|
||||
// Take care of the old 1.11.0 behavior in case the version upgrade
|
||||
// happenned without a clean daemon shutdown
|
||||
func (clnt *client) cleanupOldRootfs(containerID string) {
|
||||
// Unmount and delete the bundle folder
|
||||
if mts, err := mount.GetMounts(); err == nil {
|
||||
for _, mts := range mts {
|
||||
if strings.HasSuffix(mts.Mountpoint, containerID+"/rootfs") {
|
||||
if err := syscall.Unmount(mts.Mountpoint, syscall.MNT_DETACH); err == nil {
|
||||
os.RemoveAll(strings.TrimSuffix(mts.Mountpoint, "/rootfs"))
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (clnt *client) setExited(containerID string) error {
|
||||
clnt.lock(containerID)
|
||||
defer clnt.unlock(containerID)
|
||||
@@ -273,17 +283,7 @@ func (clnt *client) setExited(containerID string) error {
|
||||
ExitCode: exitCode,
|
||||
})
|
||||
|
||||
// Unmount and delete the bundle folder
|
||||
if mts, err := mount.GetMounts(); err == nil {
|
||||
for _, mts := range mts {
|
||||
if strings.HasSuffix(mts.Mountpoint, containerID+"/rootfs") {
|
||||
if err := syscall.Unmount(mts.Mountpoint, syscall.MNT_DETACH); err == nil {
|
||||
os.RemoveAll(strings.TrimSuffix(mts.Mountpoint, "/rootfs"))
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
clnt.cleanupOldRootfs(containerID)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package libcontainerd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/docker/docker/restartmanager"
|
||||
)
|
||||
@@ -18,6 +19,7 @@ type containerCommon struct {
|
||||
restartManager restartmanager.RestartManager
|
||||
restarting bool
|
||||
processes map[string]*process
|
||||
startedAt time.Time
|
||||
}
|
||||
|
||||
// WithRestartManager sets the restartmanager to be used with the container.
|
||||
|
||||
@@ -6,9 +6,11 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
containerd "github.com/docker/containerd/api/grpc/types"
|
||||
"github.com/docker/docker/restartmanager"
|
||||
"github.com/opencontainers/specs/specs-go"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
@@ -22,6 +24,9 @@ type container struct {
|
||||
}
|
||||
|
||||
func (ctr *container) clean() error {
|
||||
if os.Getenv("LIBCONTAINERD_NOCLEAN") == "1" {
|
||||
return nil
|
||||
}
|
||||
if _, err := os.Lstat(ctr.dir); err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return nil
|
||||
@@ -29,13 +34,25 @@ func (ctr *container) clean() error {
|
||||
return err
|
||||
}
|
||||
|
||||
syscall.Unmount(filepath.Join(ctr.dir, "rootfs"), syscall.MNT_DETACH) // ignore error
|
||||
if err := os.RemoveAll(ctr.dir); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// cleanProcess removes the fifos used by an additional process.
|
||||
// Caller needs to lock container ID before calling this method.
|
||||
func (ctr *container) cleanProcess(id string) {
|
||||
if p, ok := ctr.processes[id]; ok {
|
||||
for _, i := range []int{syscall.Stdin, syscall.Stdout, syscall.Stderr} {
|
||||
if err := os.Remove(p.fifo(i)); err != nil {
|
||||
logrus.Warnf("failed to remove %v for process %v: %v", p.fifo(i), id, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
delete(ctr.processes, id)
|
||||
}
|
||||
|
||||
func (ctr *container) spec() (*specs.Spec, error) {
|
||||
var spec specs.Spec
|
||||
dt, err := ioutil.ReadFile(filepath.Join(ctr.dir, configFilename))
|
||||
@@ -74,6 +91,7 @@ func (ctr *container) start() error {
|
||||
ctr.closeFifos(iopipe)
|
||||
return err
|
||||
}
|
||||
ctr.startedAt = time.Now()
|
||||
|
||||
if err := ctr.client.backend.AttachStreams(ctr.containerID, *iopipe); err != nil {
|
||||
return err
|
||||
@@ -115,24 +133,29 @@ func (ctr *container) handleEvent(e *containerd.Event) error {
|
||||
st.State = StateExitProcess
|
||||
}
|
||||
if st.State == StateExit && ctr.restartManager != nil {
|
||||
restart, wait, err := ctr.restartManager.ShouldRestart(e.Status)
|
||||
restart, wait, err := ctr.restartManager.ShouldRestart(e.Status, false, time.Since(ctr.startedAt))
|
||||
if err != nil {
|
||||
logrus.Error(err)
|
||||
logrus.Warnf("container %s %v", ctr.containerID, err)
|
||||
} else if restart {
|
||||
st.State = StateRestart
|
||||
ctr.restarting = true
|
||||
ctr.client.deleteContainer(e.Id)
|
||||
go func() {
|
||||
err := <-wait
|
||||
ctr.client.lock(ctr.containerID)
|
||||
defer ctr.client.unlock(ctr.containerID)
|
||||
ctr.restarting = false
|
||||
if err != nil {
|
||||
st.State = StateExit
|
||||
ctr.clean()
|
||||
ctr.client.q.append(e.Id, func() {
|
||||
if err := ctr.client.backend.StateChanged(e.Id, st); err != nil {
|
||||
logrus.Error(err)
|
||||
}
|
||||
})
|
||||
logrus.Error(err)
|
||||
if err != restartmanager.ErrRestartCanceled {
|
||||
logrus.Error(err)
|
||||
}
|
||||
} else {
|
||||
ctr.start()
|
||||
}
|
||||
@@ -142,11 +165,12 @@ func (ctr *container) handleEvent(e *containerd.Event) error {
|
||||
|
||||
// Remove process from list if we have exited
|
||||
// We need to do so here in case the Message Handler decides to restart it.
|
||||
if st.State == StateExit {
|
||||
if os.Getenv("LIBCONTAINERD_NOCLEAN") != "1" {
|
||||
ctr.clean()
|
||||
}
|
||||
switch st.State {
|
||||
case StateExit:
|
||||
ctr.clean()
|
||||
ctr.client.deleteContainer(e.Id)
|
||||
case StateExitProcess:
|
||||
ctr.cleanProcess(st.ProcessID)
|
||||
}
|
||||
ctr.client.q.append(e.Id, func() {
|
||||
if err := ctr.client.backend.StateChanged(e.Id, st); err != nil {
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"io"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/Microsoft/hcsshim"
|
||||
"github.com/Sirupsen/logrus"
|
||||
@@ -78,6 +79,7 @@ func (ctr *container) start() error {
|
||||
}
|
||||
return err
|
||||
}
|
||||
ctr.startedAt = time.Now()
|
||||
|
||||
// Convert io.ReadClosers to io.Readers
|
||||
if stdout != nil {
|
||||
@@ -164,7 +166,7 @@ func (ctr *container) waitExit(pid uint32, processFriendlyName string, isFirstPr
|
||||
defer ctr.client.unlock(ctr.containerID)
|
||||
|
||||
if si.State == StateExit && ctr.restartManager != nil {
|
||||
restart, wait, err := ctr.restartManager.ShouldRestart(uint32(exitCode))
|
||||
restart, wait, err := ctr.restartManager.ShouldRestart(uint32(exitCode), false, time.Since(ctr.startedAt))
|
||||
if err != nil {
|
||||
logrus.Error(err)
|
||||
} else if restart {
|
||||
|
||||
@@ -79,7 +79,9 @@ func (r emptyReader) Read(b []byte) (int, error) {
|
||||
|
||||
func openReaderFromFifo(fn string) io.Reader {
|
||||
r, w := io.Pipe()
|
||||
c := make(chan struct{})
|
||||
go func() {
|
||||
close(c)
|
||||
stdoutf, err := os.OpenFile(fn, syscall.O_RDONLY, 0)
|
||||
if err != nil {
|
||||
r.CloseWithError(err)
|
||||
@@ -90,6 +92,7 @@ func openReaderFromFifo(fn string) io.Reader {
|
||||
w.Close()
|
||||
stdoutf.Close()
|
||||
}()
|
||||
<-c // wait for the goroutine to get scheduled and syscall to block
|
||||
return r
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import (
|
||||
"golang.org/x/net/context"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/grpclog"
|
||||
"google.golang.org/grpc/transport"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -37,17 +38,18 @@ const (
|
||||
|
||||
type remote struct {
|
||||
sync.RWMutex
|
||||
apiClient containerd.APIClient
|
||||
daemonPid int
|
||||
stateDir string
|
||||
rpcAddr string
|
||||
startDaemon bool
|
||||
debugLog bool
|
||||
rpcConn *grpc.ClientConn
|
||||
clients []*client
|
||||
eventTsPath string
|
||||
pastEvents map[string]*containerd.Event
|
||||
runtimeArgs []string
|
||||
apiClient containerd.APIClient
|
||||
daemonPid int
|
||||
stateDir string
|
||||
rpcAddr string
|
||||
startDaemon bool
|
||||
closeManually bool
|
||||
debugLog bool
|
||||
rpcConn *grpc.ClientConn
|
||||
clients []*client
|
||||
eventTsPath string
|
||||
pastEvents map[string]*containerd.Event
|
||||
runtimeArgs []string
|
||||
}
|
||||
|
||||
// New creates a fresh instance of libcontainerd remote.
|
||||
@@ -147,6 +149,7 @@ func (r *remote) Cleanup() {
|
||||
if r.daemonPid == -1 {
|
||||
return
|
||||
}
|
||||
r.closeManually = true
|
||||
r.rpcConn.Close()
|
||||
// Ask the daemon to quit
|
||||
syscall.Kill(r.daemonPid, syscall.SIGTERM)
|
||||
@@ -254,6 +257,11 @@ func (r *remote) handleEventStream(events containerd.API_EventsClient) {
|
||||
for {
|
||||
e, err := events.Recv()
|
||||
if err != nil {
|
||||
if grpc.ErrorDesc(err) == transport.ErrConnClosing.Desc &&
|
||||
r.closeManually {
|
||||
// ignore error if grpc remote connection is closed manually
|
||||
return
|
||||
}
|
||||
logrus.Errorf("failed to receive event from containerd: %v", err)
|
||||
go r.startEventsMonitor()
|
||||
return
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -118,6 +119,7 @@ func readPluginJSONInfo(name, path string) (*Plugin, error) {
|
||||
if len(p.TLSConfig.CAFile) == 0 {
|
||||
p.TLSConfig.InsecureSkipVerify = true
|
||||
}
|
||||
p.activateWait = sync.NewCond(&sync.Mutex{})
|
||||
|
||||
return &p, nil
|
||||
}
|
||||
|
||||
@@ -37,6 +37,9 @@ func (s *Service) ServiceConfig() *registrytypes.ServiceConfig {
|
||||
// It can be used to verify the validity of a client's credentials.
|
||||
func (s *Service) Auth(authConfig *types.AuthConfig, userAgent string) (status, token string, err error) {
|
||||
serverAddress := authConfig.ServerAddress
|
||||
if serverAddress == "" {
|
||||
serverAddress = IndexServer
|
||||
}
|
||||
if !strings.HasPrefix(serverAddress, "https://") && !strings.HasPrefix(serverAddress, "http://") {
|
||||
serverAddress = "https://" + serverAddress
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package restartmanager
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -13,10 +14,14 @@ const (
|
||||
defaultTimeout = 100 * time.Millisecond
|
||||
)
|
||||
|
||||
// ErrRestartCanceled is returned when the restart manager has been
|
||||
// canceled and will no longer restart the container.
|
||||
var ErrRestartCanceled = errors.New("restart canceled")
|
||||
|
||||
// RestartManager defines object that controls container restarting rules.
|
||||
type RestartManager interface {
|
||||
Cancel() error
|
||||
ShouldRestart(exitCode uint32) (bool, chan error, error)
|
||||
ShouldRestart(exitCode uint32, hasBeenManuallyStopped bool, executionDuration time.Duration) (bool, chan error, error)
|
||||
}
|
||||
|
||||
type restartManager struct {
|
||||
@@ -41,7 +46,10 @@ func (rm *restartManager) SetPolicy(policy container.RestartPolicy) {
|
||||
rm.Unlock()
|
||||
}
|
||||
|
||||
func (rm *restartManager) ShouldRestart(exitCode uint32) (bool, chan error, error) {
|
||||
func (rm *restartManager) ShouldRestart(exitCode uint32, hasBeenManuallyStopped bool, executionDuration time.Duration) (bool, chan error, error) {
|
||||
if rm.policy.IsNone() {
|
||||
return false, nil, nil
|
||||
}
|
||||
rm.Lock()
|
||||
unlockOnExit := true
|
||||
defer func() {
|
||||
@@ -51,7 +59,7 @@ func (rm *restartManager) ShouldRestart(exitCode uint32) (bool, chan error, erro
|
||||
}()
|
||||
|
||||
if rm.canceled {
|
||||
return false, nil, fmt.Errorf("restartmanager canceled")
|
||||
return false, nil, ErrRestartCanceled
|
||||
}
|
||||
|
||||
if rm.active {
|
||||
@@ -64,6 +72,11 @@ func (rm *restartManager) ShouldRestart(exitCode uint32) (bool, chan error, erro
|
||||
rm.failureCount = 0
|
||||
}
|
||||
|
||||
// if the container ran for more than 10s, reguardless of status and policy reset the
|
||||
// the timeout back to the default.
|
||||
if executionDuration.Seconds() >= 10 {
|
||||
rm.timeout = 0
|
||||
}
|
||||
if rm.timeout == 0 {
|
||||
rm.timeout = defaultTimeout
|
||||
} else {
|
||||
@@ -94,7 +107,7 @@ func (rm *restartManager) ShouldRestart(exitCode uint32) (bool, chan error, erro
|
||||
go func() {
|
||||
select {
|
||||
case <-rm.cancel:
|
||||
ch <- fmt.Errorf("restartmanager canceled")
|
||||
ch <- ErrRestartCanceled
|
||||
close(ch)
|
||||
case <-time.After(rm.timeout):
|
||||
rm.Lock()
|
||||
|
||||
@@ -1,3 +1,34 @@
|
||||
package restartmanager
|
||||
|
||||
// FIXME
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/docker/engine-api/types/container"
|
||||
)
|
||||
|
||||
func TestRestartManagerTimeout(t *testing.T) {
|
||||
rm := New(container.RestartPolicy{Name: "always", MaximumRetryCount: 0}).(*restartManager)
|
||||
should, _, err := rm.ShouldRestart(0, false, 1*time.Second)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !should {
|
||||
t.Fatal("container should be restarted")
|
||||
}
|
||||
if rm.timeout != 100*time.Millisecond {
|
||||
t.Fatalf("restart manager should have a timeout of 100ms but has %s", rm.timeout)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRestartManagerTimeoutReset(t *testing.T) {
|
||||
rm := New(container.RestartPolicy{Name: "always", MaximumRetryCount: 0}).(*restartManager)
|
||||
rm.timeout = 5 * time.Second
|
||||
_, _, err := rm.ShouldRestart(0, false, 10*time.Second)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if rm.timeout != 100*time.Millisecond {
|
||||
t.Fatalf("restart manager should have a timeout of 100ms but has %s", rm.timeout)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -469,14 +469,14 @@ func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
|
||||
|
||||
type NetworkStats struct {
|
||||
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
|
||||
RxBytes uint64 `protobuf:"varint,2,opt,name=rx_bytes" json:"rx_bytes,omitempty"`
|
||||
Rx_Packets uint64 `protobuf:"varint,3,opt,name=rx_Packets" json:"rx_Packets,omitempty"`
|
||||
RxErrors uint64 `protobuf:"varint,4,opt,name=Rx_errors" json:"Rx_errors,omitempty"`
|
||||
RxDropped uint64 `protobuf:"varint,5,opt,name=Rx_dropped" json:"Rx_dropped,omitempty"`
|
||||
TxBytes uint64 `protobuf:"varint,6,opt,name=Tx_bytes" json:"Tx_bytes,omitempty"`
|
||||
TxPackets uint64 `protobuf:"varint,7,opt,name=Tx_packets" json:"Tx_packets,omitempty"`
|
||||
TxErrors uint64 `protobuf:"varint,8,opt,name=Tx_errors" json:"Tx_errors,omitempty"`
|
||||
TxDropped uint64 `protobuf:"varint,9,opt,name=Tx_dropped" json:"Tx_dropped,omitempty"`
|
||||
RxBytes uint64 `protobuf:"varint,2,opt,name=rx_bytes,json=rxBytes" json:"rx_bytes,omitempty"`
|
||||
Rx_Packets uint64 `protobuf:"varint,3,opt,name=rx_Packets,json=rxPackets" json:"rx_Packets,omitempty"`
|
||||
RxErrors uint64 `protobuf:"varint,4,opt,name=Rx_errors,json=rxErrors" json:"Rx_errors,omitempty"`
|
||||
RxDropped uint64 `protobuf:"varint,5,opt,name=Rx_dropped,json=rxDropped" json:"Rx_dropped,omitempty"`
|
||||
TxBytes uint64 `protobuf:"varint,6,opt,name=Tx_bytes,json=txBytes" json:"Tx_bytes,omitempty"`
|
||||
TxPackets uint64 `protobuf:"varint,7,opt,name=Tx_packets,json=txPackets" json:"Tx_packets,omitempty"`
|
||||
TxErrors uint64 `protobuf:"varint,8,opt,name=Tx_errors,json=txErrors" json:"Tx_errors,omitempty"`
|
||||
TxDropped uint64 `protobuf:"varint,9,opt,name=Tx_dropped,json=txDropped" json:"Tx_dropped,omitempty"`
|
||||
}
|
||||
|
||||
func (m *NetworkStats) Reset() { *m = NetworkStats{} }
|
||||
@@ -485,10 +485,10 @@ func (*NetworkStats) ProtoMessage() {}
|
||||
func (*NetworkStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
|
||||
|
||||
type CpuUsage struct {
|
||||
TotalUsage uint64 `protobuf:"varint,1,opt,name=total_usage" json:"total_usage,omitempty"`
|
||||
PercpuUsage []uint64 `protobuf:"varint,2,rep,name=percpu_usage" json:"percpu_usage,omitempty"`
|
||||
UsageInKernelmode uint64 `protobuf:"varint,3,opt,name=usage_in_kernelmode" json:"usage_in_kernelmode,omitempty"`
|
||||
UsageInUsermode uint64 `protobuf:"varint,4,opt,name=usage_in_usermode" json:"usage_in_usermode,omitempty"`
|
||||
TotalUsage uint64 `protobuf:"varint,1,opt,name=total_usage,json=totalUsage" json:"total_usage,omitempty"`
|
||||
PercpuUsage []uint64 `protobuf:"varint,2,rep,name=percpu_usage,json=percpuUsage" json:"percpu_usage,omitempty"`
|
||||
UsageInKernelmode uint64 `protobuf:"varint,3,opt,name=usage_in_kernelmode,json=usageInKernelmode" json:"usage_in_kernelmode,omitempty"`
|
||||
UsageInUsermode uint64 `protobuf:"varint,4,opt,name=usage_in_usermode,json=usageInUsermode" json:"usage_in_usermode,omitempty"`
|
||||
}
|
||||
|
||||
func (m *CpuUsage) Reset() { *m = CpuUsage{} }
|
||||
@@ -498,8 +498,8 @@ func (*CpuUsage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29
|
||||
|
||||
type ThrottlingData struct {
|
||||
Periods uint64 `protobuf:"varint,1,opt,name=periods" json:"periods,omitempty"`
|
||||
ThrottledPeriods uint64 `protobuf:"varint,2,opt,name=throttled_periods" json:"throttled_periods,omitempty"`
|
||||
ThrottledTime uint64 `protobuf:"varint,3,opt,name=throttled_time" json:"throttled_time,omitempty"`
|
||||
ThrottledPeriods uint64 `protobuf:"varint,2,opt,name=throttled_periods,json=throttledPeriods" json:"throttled_periods,omitempty"`
|
||||
ThrottledTime uint64 `protobuf:"varint,3,opt,name=throttled_time,json=throttledTime" json:"throttled_time,omitempty"`
|
||||
}
|
||||
|
||||
func (m *ThrottlingData) Reset() { *m = ThrottlingData{} }
|
||||
@@ -508,9 +508,9 @@ func (*ThrottlingData) ProtoMessage() {}
|
||||
func (*ThrottlingData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
|
||||
|
||||
type CpuStats struct {
|
||||
CpuUsage *CpuUsage `protobuf:"bytes,1,opt,name=cpu_usage" json:"cpu_usage,omitempty"`
|
||||
ThrottlingData *ThrottlingData `protobuf:"bytes,2,opt,name=throttling_data" json:"throttling_data,omitempty"`
|
||||
SystemUsage uint64 `protobuf:"varint,3,opt,name=system_usage" json:"system_usage,omitempty"`
|
||||
CpuUsage *CpuUsage `protobuf:"bytes,1,opt,name=cpu_usage,json=cpuUsage" json:"cpu_usage,omitempty"`
|
||||
ThrottlingData *ThrottlingData `protobuf:"bytes,2,opt,name=throttling_data,json=throttlingData" json:"throttling_data,omitempty"`
|
||||
SystemUsage uint64 `protobuf:"varint,3,opt,name=system_usage,json=systemUsage" json:"system_usage,omitempty"`
|
||||
}
|
||||
|
||||
func (m *CpuStats) Reset() { *m = CpuStats{} }
|
||||
@@ -534,6 +534,7 @@ func (m *CpuStats) GetThrottlingData() *ThrottlingData {
|
||||
|
||||
type PidsStats struct {
|
||||
Current uint64 `protobuf:"varint,1,opt,name=current" json:"current,omitempty"`
|
||||
Limit uint64 `protobuf:"varint,2,opt,name=limit" json:"limit,omitempty"`
|
||||
}
|
||||
|
||||
func (m *PidsStats) Reset() { *m = PidsStats{} }
|
||||
@@ -543,7 +544,7 @@ func (*PidsStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3
|
||||
|
||||
type MemoryData struct {
|
||||
Usage uint64 `protobuf:"varint,1,opt,name=usage" json:"usage,omitempty"`
|
||||
MaxUsage uint64 `protobuf:"varint,2,opt,name=max_usage" json:"max_usage,omitempty"`
|
||||
MaxUsage uint64 `protobuf:"varint,2,opt,name=max_usage,json=maxUsage" json:"max_usage,omitempty"`
|
||||
Failcnt uint64 `protobuf:"varint,3,opt,name=failcnt" json:"failcnt,omitempty"`
|
||||
Limit uint64 `protobuf:"varint,4,opt,name=limit" json:"limit,omitempty"`
|
||||
}
|
||||
@@ -556,8 +557,8 @@ func (*MemoryData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{
|
||||
type MemoryStats struct {
|
||||
Cache uint64 `protobuf:"varint,1,opt,name=cache" json:"cache,omitempty"`
|
||||
Usage *MemoryData `protobuf:"bytes,2,opt,name=usage" json:"usage,omitempty"`
|
||||
SwapUsage *MemoryData `protobuf:"bytes,3,opt,name=swap_usage" json:"swap_usage,omitempty"`
|
||||
KernelUsage *MemoryData `protobuf:"bytes,4,opt,name=kernel_usage" json:"kernel_usage,omitempty"`
|
||||
SwapUsage *MemoryData `protobuf:"bytes,3,opt,name=swap_usage,json=swapUsage" json:"swap_usage,omitempty"`
|
||||
KernelUsage *MemoryData `protobuf:"bytes,4,opt,name=kernel_usage,json=kernelUsage" json:"kernel_usage,omitempty"`
|
||||
Stats map[string]uint64 `protobuf:"bytes,5,rep,name=stats" json:"stats,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
|
||||
}
|
||||
|
||||
@@ -607,14 +608,14 @@ func (*BlkioStatsEntry) ProtoMessage() {}
|
||||
func (*BlkioStatsEntry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
|
||||
|
||||
type BlkioStats struct {
|
||||
IoServiceBytesRecursive []*BlkioStatsEntry `protobuf:"bytes,1,rep,name=io_service_bytes_recursive" json:"io_service_bytes_recursive,omitempty"`
|
||||
IoServicedRecursive []*BlkioStatsEntry `protobuf:"bytes,2,rep,name=io_serviced_recursive" json:"io_serviced_recursive,omitempty"`
|
||||
IoQueuedRecursive []*BlkioStatsEntry `protobuf:"bytes,3,rep,name=io_queued_recursive" json:"io_queued_recursive,omitempty"`
|
||||
IoServiceTimeRecursive []*BlkioStatsEntry `protobuf:"bytes,4,rep,name=io_service_time_recursive" json:"io_service_time_recursive,omitempty"`
|
||||
IoWaitTimeRecursive []*BlkioStatsEntry `protobuf:"bytes,5,rep,name=io_wait_time_recursive" json:"io_wait_time_recursive,omitempty"`
|
||||
IoMergedRecursive []*BlkioStatsEntry `protobuf:"bytes,6,rep,name=io_merged_recursive" json:"io_merged_recursive,omitempty"`
|
||||
IoTimeRecursive []*BlkioStatsEntry `protobuf:"bytes,7,rep,name=io_time_recursive" json:"io_time_recursive,omitempty"`
|
||||
SectorsRecursive []*BlkioStatsEntry `protobuf:"bytes,8,rep,name=sectors_recursive" json:"sectors_recursive,omitempty"`
|
||||
IoServiceBytesRecursive []*BlkioStatsEntry `protobuf:"bytes,1,rep,name=io_service_bytes_recursive,json=ioServiceBytesRecursive" json:"io_service_bytes_recursive,omitempty"`
|
||||
IoServicedRecursive []*BlkioStatsEntry `protobuf:"bytes,2,rep,name=io_serviced_recursive,json=ioServicedRecursive" json:"io_serviced_recursive,omitempty"`
|
||||
IoQueuedRecursive []*BlkioStatsEntry `protobuf:"bytes,3,rep,name=io_queued_recursive,json=ioQueuedRecursive" json:"io_queued_recursive,omitempty"`
|
||||
IoServiceTimeRecursive []*BlkioStatsEntry `protobuf:"bytes,4,rep,name=io_service_time_recursive,json=ioServiceTimeRecursive" json:"io_service_time_recursive,omitempty"`
|
||||
IoWaitTimeRecursive []*BlkioStatsEntry `protobuf:"bytes,5,rep,name=io_wait_time_recursive,json=ioWaitTimeRecursive" json:"io_wait_time_recursive,omitempty"`
|
||||
IoMergedRecursive []*BlkioStatsEntry `protobuf:"bytes,6,rep,name=io_merged_recursive,json=ioMergedRecursive" json:"io_merged_recursive,omitempty"`
|
||||
IoTimeRecursive []*BlkioStatsEntry `protobuf:"bytes,7,rep,name=io_time_recursive,json=ioTimeRecursive" json:"io_time_recursive,omitempty"`
|
||||
SectorsRecursive []*BlkioStatsEntry `protobuf:"bytes,8,rep,name=sectors_recursive,json=sectorsRecursive" json:"sectors_recursive,omitempty"`
|
||||
}
|
||||
|
||||
func (m *BlkioStats) Reset() { *m = BlkioStats{} }
|
||||
@@ -680,7 +681,7 @@ func (m *BlkioStats) GetSectorsRecursive() []*BlkioStatsEntry {
|
||||
|
||||
type HugetlbStats struct {
|
||||
Usage uint64 `protobuf:"varint,1,opt,name=usage" json:"usage,omitempty"`
|
||||
MaxUsage uint64 `protobuf:"varint,2,opt,name=max_usage" json:"max_usage,omitempty"`
|
||||
MaxUsage uint64 `protobuf:"varint,2,opt,name=max_usage,json=maxUsage" json:"max_usage,omitempty"`
|
||||
Failcnt uint64 `protobuf:"varint,3,opt,name=failcnt" json:"failcnt,omitempty"`
|
||||
Limit uint64 `protobuf:"varint,4,opt,name=limit" json:"limit,omitempty"`
|
||||
}
|
||||
@@ -691,11 +692,11 @@ func (*HugetlbStats) ProtoMessage() {}
|
||||
func (*HugetlbStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
|
||||
|
||||
type CgroupStats struct {
|
||||
CpuStats *CpuStats `protobuf:"bytes,1,opt,name=cpu_stats" json:"cpu_stats,omitempty"`
|
||||
MemoryStats *MemoryStats `protobuf:"bytes,2,opt,name=memory_stats" json:"memory_stats,omitempty"`
|
||||
BlkioStats *BlkioStats `protobuf:"bytes,3,opt,name=blkio_stats" json:"blkio_stats,omitempty"`
|
||||
HugetlbStats map[string]*HugetlbStats `protobuf:"bytes,4,rep,name=hugetlb_stats" json:"hugetlb_stats,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
|
||||
PidsStats *PidsStats `protobuf:"bytes,5,opt,name=pids_stats" json:"pids_stats,omitempty"`
|
||||
CpuStats *CpuStats `protobuf:"bytes,1,opt,name=cpu_stats,json=cpuStats" json:"cpu_stats,omitempty"`
|
||||
MemoryStats *MemoryStats `protobuf:"bytes,2,opt,name=memory_stats,json=memoryStats" json:"memory_stats,omitempty"`
|
||||
BlkioStats *BlkioStats `protobuf:"bytes,3,opt,name=blkio_stats,json=blkioStats" json:"blkio_stats,omitempty"`
|
||||
HugetlbStats map[string]*HugetlbStats `protobuf:"bytes,4,rep,name=hugetlb_stats,json=hugetlbStats" json:"hugetlb_stats,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
|
||||
PidsStats *PidsStats `protobuf:"bytes,5,opt,name=pids_stats,json=pidsStats" json:"pids_stats,omitempty"`
|
||||
}
|
||||
|
||||
func (m *CgroupStats) Reset() { *m = CgroupStats{} }
|
||||
@@ -739,8 +740,8 @@ func (m *CgroupStats) GetPidsStats() *PidsStats {
|
||||
}
|
||||
|
||||
type StatsResponse struct {
|
||||
NetworkStats []*NetworkStats `protobuf:"bytes,1,rep,name=network_stats" json:"network_stats,omitempty"`
|
||||
CgroupStats *CgroupStats `protobuf:"bytes,2,opt,name=cgroup_stats" json:"cgroup_stats,omitempty"`
|
||||
NetworkStats []*NetworkStats `protobuf:"bytes,1,rep,name=network_stats,json=networkStats" json:"network_stats,omitempty"`
|
||||
CgroupStats *CgroupStats `protobuf:"bytes,2,opt,name=cgroup_stats,json=cgroupStats" json:"cgroup_stats,omitempty"`
|
||||
Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp" json:"timestamp,omitempty"`
|
||||
}
|
||||
|
||||
@@ -1182,118 +1183,144 @@ var _API_serviceDesc = grpc.ServiceDesc{
|
||||
}
|
||||
|
||||
var fileDescriptor0 = []byte{
|
||||
// 1806 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x58, 0xd9, 0x8e, 0xdb, 0x5e,
|
||||
0x19, 0x9f, 0xec, 0xc9, 0x97, 0x38, 0x33, 0xe3, 0xd9, 0x32, 0xe9, 0x36, 0xb8, 0x85, 0x56, 0xa8,
|
||||
0x1a, 0x95, 0x94, 0xa5, 0x14, 0x09, 0x51, 0xa6, 0x15, 0x05, 0x4d, 0x4b, 0x3a, 0x0b, 0x88, 0xab,
|
||||
0xc8, 0xb1, 0x4f, 0x93, 0xc3, 0x38, 0xb6, 0xf1, 0x39, 0x9e, 0xe5, 0x21, 0xb8, 0xe5, 0x9a, 0x7b,
|
||||
0x24, 0xc4, 0x15, 0x0f, 0xc0, 0xb3, 0x70, 0xc5, 0x53, 0xf0, 0x9d, 0xc5, 0x8e, 0xed, 0x2c, 0x83,
|
||||
0x84, 0xfe, 0x17, 0xff, 0x9b, 0x28, 0xe7, 0x9c, 0x6f, 0xfd, 0x7d, 0xdb, 0x39, 0x86, 0x96, 0x1d,
|
||||
0xd2, 0xe3, 0x30, 0x0a, 0x78, 0x60, 0xd6, 0xf8, 0x5d, 0x48, 0x98, 0x35, 0x86, 0xdd, 0xcb, 0xd0,
|
||||
0xb5, 0x39, 0x19, 0x46, 0x81, 0x43, 0x18, 0x3b, 0x23, 0x7f, 0x8a, 0x09, 0xe3, 0x26, 0x40, 0x99,
|
||||
0xba, 0xbd, 0xd2, 0x51, 0xe9, 0x45, 0xcb, 0x6c, 0x43, 0x25, 0xc4, 0x45, 0x59, 0x2e, 0xf0, 0xc4,
|
||||
0xf1, 0x02, 0x46, 0xce, 0xb9, 0x4b, 0xfd, 0x5e, 0x05, 0xf7, 0x9a, 0xa6, 0x01, 0xb5, 0x1b, 0xea,
|
||||
0xf2, 0x69, 0xaf, 0x8a, 0x4b, 0xc3, 0xec, 0x42, 0x7d, 0x4a, 0xe8, 0x64, 0xca, 0x7b, 0x35, 0xb1,
|
||||
0xb6, 0x0e, 0x60, 0xaf, 0xa0, 0x83, 0x85, 0x81, 0xcf, 0x88, 0xf5, 0xd7, 0x12, 0xec, 0x9f, 0x44,
|
||||
0x04, 0x4f, 0x4e, 0x02, 0x9f, 0xdb, 0xd4, 0x27, 0xd1, 0x32, 0xfd, 0xb8, 0x18, 0xc7, 0xbe, 0xeb,
|
||||
0x91, 0xa1, 0x8d, 0x3a, 0xe6, 0x66, 0x4c, 0x89, 0x73, 0x15, 0x06, 0xd4, 0xe7, 0xd2, 0x8c, 0x96,
|
||||
0x30, 0x83, 0x49, 0xab, 0xaa, 0x72, 0x89, 0x66, 0xe0, 0x32, 0x88, 0x95, 0x19, 0xc9, 0x9a, 0x44,
|
||||
0x51, 0xaf, 0x9e, 0xac, 0x3d, 0x7b, 0x4c, 0x3c, 0xd6, 0x6b, 0x1c, 0x55, 0x70, 0xbd, 0x03, 0x6d,
|
||||
0x3f, 0x18, 0xd2, 0xeb, 0x80, 0x9f, 0x05, 0x01, 0xef, 0x35, 0x85, 0x6b, 0xd6, 0xcf, 0xe1, 0x60,
|
||||
0xc1, 0x42, 0x65, 0xbd, 0xf9, 0x14, 0x5a, 0x4e, 0xb2, 0x29, 0x2d, 0x6d, 0x0f, 0xb6, 0x8e, 0x25,
|
||||
0xaa, 0xc7, 0x29, 0xb1, 0xf5, 0x06, 0x8c, 0x73, 0x3a, 0xf1, 0x6d, 0xef, 0x5e, 0x60, 0x85, 0x79,
|
||||
0x92, 0x52, 0x7a, 0x63, 0x58, 0x5b, 0xd0, 0x4d, 0x38, 0x35, 0x5c, 0x7f, 0x2f, 0xc3, 0xf6, 0x3b,
|
||||
0xd7, 0x5d, 0x13, 0xa9, 0x2d, 0x68, 0x72, 0x12, 0xcd, 0xa8, 0x90, 0x52, 0x96, 0xa1, 0x39, 0x84,
|
||||
0x6a, 0xcc, 0xd0, 0xbe, 0x8a, 0xb4, 0xaf, 0xad, 0xed, 0xbb, 0xc4, 0x2d, 0xb3, 0x03, 0x55, 0x3b,
|
||||
0x9a, 0x30, 0x44, 0xab, 0xa2, 0x6c, 0x21, 0xfe, 0x35, 0x42, 0xa5, 0x17, 0xce, 0x8d, 0xab, 0x71,
|
||||
0xd2, 0x56, 0x36, 0xf2, 0x18, 0x37, 0x0b, 0x18, 0xb7, 0x0a, 0x18, 0x83, 0x5c, 0xef, 0x42, 0xc7,
|
||||
0xb1, 0x43, 0x7b, 0x4c, 0x3d, 0xca, 0x29, 0x61, 0xbd, 0xb6, 0x14, 0x7f, 0x00, 0x9b, 0x76, 0x18,
|
||||
0xda, 0xd1, 0x2c, 0x88, 0xd0, 0x99, 0xaf, 0xd4, 0x23, 0xbd, 0x4e, 0x42, 0xce, 0x88, 0x47, 0xfd,
|
||||
0xf8, 0xf6, 0x54, 0x44, 0xa6, 0x67, 0xc8, 0x5d, 0x24, 0xf7, 0x83, 0xcf, 0xe4, 0x66, 0x18, 0xd1,
|
||||
0x6b, 0xa4, 0x9d, 0xa0, 0x9c, 0xae, 0x74, 0xee, 0x31, 0x34, 0x22, 0x8f, 0xce, 0x28, 0x67, 0xbd,
|
||||
0x4d, 0x14, 0xdc, 0x1e, 0x18, 0xda, 0xbf, 0x33, 0xb9, 0x6b, 0x0d, 0xa0, 0xae, 0xfe, 0x09, 0x5f,
|
||||
0xc5, 0x89, 0x86, 0x09, 0x57, 0x2c, 0xf8, 0xca, 0x25, 0x44, 0x55, 0xb1, 0x9a, 0xda, 0x91, 0x2b,
|
||||
0x21, 0xaa, 0x62, 0xc0, 0xaa, 0x12, 0x1d, 0xf4, 0x3a, 0xd6, 0xb8, 0x1a, 0x62, 0x31, 0xd1, 0x81,
|
||||
0x32, 0xcc, 0x7d, 0xe8, 0xda, 0xae, 0x8b, 0xfe, 0x04, 0x08, 0xf3, 0xaf, 0xa8, 0xcb, 0x90, 0xb3,
|
||||
0x82, 0x01, 0xdb, 0x05, 0x33, 0x1b, 0x1d, 0x1d, 0xb4, 0xd3, 0x34, 0x81, 0xd2, 0x74, 0x5d, 0x16,
|
||||
0xb9, 0xef, 0xe6, 0xf2, 0xb9, 0x2c, 0xa3, 0xb5, 0x9d, 0x64, 0x53, 0x7a, 0x60, 0xf5, 0xa1, 0xb7,
|
||||
0x28, 0x4d, 0x6b, 0x7a, 0x0d, 0x07, 0xef, 0x89, 0x47, 0xee, 0xd3, 0x84, 0xee, 0xfa, 0xf6, 0x8c,
|
||||
0xa8, 0xac, 0x13, 0x02, 0x17, 0x99, 0xb4, 0xc0, 0xa7, 0xb0, 0x77, 0x4a, 0x19, 0x5f, 0x2b, 0xce,
|
||||
0xfa, 0x03, 0xc0, 0x9c, 0x20, 0x15, 0x9e, 0xaa, 0x22, 0xb7, 0x94, 0xeb, 0x54, 0x44, 0x10, 0xb9,
|
||||
0x13, 0xea, 0x96, 0x81, 0xc5, 0x16, 0xfb, 0xf4, 0xf6, 0x3c, 0x70, 0xae, 0x08, 0x67, 0xb2, 0x62,
|
||||
0x65, 0x1f, 0x61, 0x53, 0xe2, 0x79, 0xb2, 0x60, 0x9b, 0xd6, 0x2f, 0x60, 0xbf, 0xa8, 0x5f, 0x97,
|
||||
0xde, 0xf7, 0xa0, 0x3d, 0x47, 0x8b, 0xa1, 0xb6, 0xca, 0x2a, 0xb8, 0x3a, 0xe7, 0x1c, 0xd1, 0x5a,
|
||||
0x66, 0xf8, 0x11, 0x74, 0xd3, 0x32, 0x95, 0x44, 0x2a, 0x79, 0x6d, 0x1e, 0x33, 0x4d, 0xf1, 0xb7,
|
||||
0x32, 0x34, 0x74, 0x38, 0x93, 0x22, 0xf8, 0x06, 0xcb, 0x6c, 0x1b, 0x5a, 0xec, 0x8e, 0x71, 0x32,
|
||||
0x1b, 0xea, 0x62, 0x33, 0xbe, 0x5d, 0xc5, 0xf6, 0xe7, 0x12, 0xb4, 0x52, 0x40, 0xef, 0xed, 0xdf,
|
||||
0xdf, 0x81, 0x56, 0xa8, 0xa0, 0x25, 0xaa, 0x7e, 0xda, 0x83, 0xae, 0x96, 0x97, 0x40, 0x3e, 0x0f,
|
||||
0x47, 0xb5, 0xd0, 0xaf, 0x15, 0x7a, 0x08, 0x6c, 0x28, 0xaa, 0xaf, 0x2e, 0xaa, 0xcf, 0xdc, 0x44,
|
||||
0xf3, 0x62, 0x9f, 0x53, 0x4c, 0x3e, 0xd9, 0xa9, 0xac, 0xe7, 0xd0, 0xf8, 0x64, 0x3b, 0x53, 0xb4,
|
||||
0x46, 0x50, 0x3a, 0xa1, 0x0e, 0xab, 0x1c, 0x4f, 0x33, 0x82, 0x68, 0xdc, 0xa9, 0xfa, 0xb7, 0x7e,
|
||||
0x87, 0x2d, 0x5a, 0x25, 0x89, 0xce, 0xae, 0x67, 0x58, 0x8b, 0x89, 0x23, 0x49, 0x72, 0x2d, 0x74,
|
||||
0x76, 0xf3, 0x09, 0x34, 0x66, 0x4a, 0xbe, 0x2e, 0xd7, 0xc4, 0x7e, 0xad, 0xd5, 0xba, 0x82, 0x7d,
|
||||
0x35, 0xf6, 0xd6, 0x0e, 0xb7, 0x85, 0x19, 0xa0, 0x5c, 0x56, 0x13, 0xed, 0x05, 0xb4, 0x22, 0xc2,
|
||||
0x82, 0x38, 0x42, 0x40, 0x24, 0x0a, 0xed, 0xc1, 0x5e, 0x92, 0x5b, 0x52, 0xf4, 0x99, 0x3e, 0xb5,
|
||||
0xfe, 0x5d, 0x82, 0x6e, 0x7e, 0x4b, 0x94, 0xd8, 0xd8, 0xbb, 0xa2, 0xc1, 0xef, 0xd5, 0x2c, 0x56,
|
||||
0xce, 0x63, 0x96, 0x21, 0x14, 0xe7, 0xd8, 0xf0, 0x50, 0x62, 0x39, 0xb3, 0x35, 0x24, 0x11, 0x0d,
|
||||
0x54, 0x13, 0x34, 0x44, 0x82, 0xe3, 0xd6, 0x97, 0x38, 0xe0, 0xb6, 0x9e, 0xe9, 0x62, 0xde, 0x22,
|
||||
0x84, 0x84, 0x9f, 0x08, 0x20, 0x6b, 0xe9, 0x0c, 0x96, 0x7b, 0x9f, 0xc8, 0x8c, 0xe9, 0x2c, 0x46,
|
||||
0xa5, 0x0a, 0xdc, 0x53, 0x91, 0x14, 0x3a, 0x8f, 0x91, 0x50, 0x6d, 0x9e, 0xdf, 0xd8, 0xa1, 0x4c,
|
||||
0x66, 0x03, 0x2b, 0x66, 0x5b, 0xed, 0xa1, 0xbd, 0x24, 0xba, 0xb6, 0x45, 0x3b, 0x95, 0x79, 0x2d,
|
||||
0x8f, 0xae, 0x48, 0xe4, 0x13, 0xef, 0x53, 0x46, 0x12, 0xc8, 0xa1, 0x78, 0x08, 0x07, 0x0b, 0x98,
|
||||
0xea, 0x6e, 0x65, 0x81, 0xf1, 0xe1, 0x9a, 0x60, 0x3b, 0x48, 0x50, 0x46, 0xbf, 0x44, 0x3a, 0x20,
|
||||
0xa0, 0xb3, 0x50, 0x7a, 0x5f, 0xb5, 0xbe, 0x40, 0x4d, 0xd2, 0x14, 0xe6, 0x81, 0x8a, 0xc7, 0xb2,
|
||||
0x10, 0x18, 0x49, 0x7c, 0xaa, 0x49, 0x8d, 0xce, 0x45, 0xd6, 0xa4, 0xc8, 0x7f, 0x96, 0xa0, 0xf3,
|
||||
0x99, 0xf0, 0x9b, 0x20, 0xba, 0x12, 0x59, 0xc4, 0x0a, 0x2d, 0x10, 0x91, 0x8c, 0x6e, 0x47, 0xe3,
|
||||
0x3b, 0xae, 0xe1, 0xae, 0x0a, 0x30, 0x70, 0x67, 0x68, 0xab, 0xc6, 0x27, 0x87, 0x8e, 0x90, 0x7b,
|
||||
0x76, 0x3b, 0xc2, 0x4a, 0x0e, 0x22, 0x15, 0x67, 0x49, 0x86, 0x5b, 0x6e, 0x14, 0x84, 0x21, 0x71,
|
||||
0x95, 0x2e, 0x21, 0xec, 0x22, 0x11, 0x56, 0x4f, 0xa8, 0x70, 0x27, 0xd4, 0xc2, 0x1a, 0x89, 0xb0,
|
||||
0x8b, 0x54, 0x58, 0x33, 0x43, 0x96, 0x08, 0x6b, 0x49, 0xc3, 0x67, 0xd0, 0xc4, 0x58, 0x5e, 0x32,
|
||||
0x7b, 0x22, 0x53, 0x85, 0x63, 0xac, 0xbd, 0x51, 0x2c, 0x96, 0x0a, 0x2c, 0xd1, 0x1f, 0x42, 0x12,
|
||||
0x61, 0x84, 0xf5, 0x6e, 0x19, 0x0b, 0xa1, 0x6a, 0x3e, 0x80, 0x1d, 0xb9, 0x1c, 0x51, 0x7f, 0xa4,
|
||||
0xa2, 0x34, 0x0b, 0x5c, 0xa2, 0xfd, 0xc0, 0xc8, 0xa5, 0x87, 0xa2, 0x1f, 0xca, 0x23, 0xe9, 0x8f,
|
||||
0x75, 0x01, 0xdd, 0x8b, 0x29, 0xde, 0x3c, 0x39, 0x76, 0x9c, 0xc9, 0x7b, 0x9b, 0xdb, 0xa2, 0x62,
|
||||
0x43, 0x99, 0x74, 0x4c, 0x2b, 0x44, 0x6e, 0xae, 0x48, 0x88, 0x3b, 0x4a, 0x8e, 0x14, 0x68, 0x38,
|
||||
0x73, 0xe7, 0x47, 0xb2, 0xc8, 0xd5, 0xb4, 0xe6, 0xd2, 0x09, 0x05, 0xbc, 0x25, 0xf3, 0x38, 0xe3,
|
||||
0x42, 0x7b, 0xb0, 0x99, 0x54, 0x6d, 0xe2, 0xe8, 0x31, 0x6c, 0xf2, 0xd4, 0x8a, 0x11, 0x26, 0x92,
|
||||
0xad, 0x8b, 0x37, 0x29, 0xab, 0x82, 0x8d, 0xa2, 0x47, 0xca, 0xa6, 0xac, 0xc5, 0x2a, 0xad, 0x0f,
|
||||
0xa1, 0x85, 0x4d, 0x9a, 0x29, 0xb5, 0xe8, 0x86, 0x13, 0x47, 0x11, 0x66, 0x95, 0x4e, 0xb2, 0xcf,
|
||||
0x00, 0x2a, 0x71, 0xa5, 0x04, 0xec, 0xe1, 0x59, 0x50, 0x31, 0x38, 0x33, 0xfb, 0x36, 0x45, 0x54,
|
||||
0x6c, 0xa1, 0x80, 0xaf, 0x36, 0xf5, 0x1c, 0x7d, 0x8f, 0xad, 0x0a, 0x16, 0xd9, 0x52, 0x35, 0x72,
|
||||
0xff, 0x29, 0x41, 0x5b, 0x09, 0x54, 0x0a, 0xf1, 0xd8, 0xc1, 0x16, 0x93, 0x48, 0x3c, 0x4a, 0x14,
|
||||
0xe4, 0x2f, 0x0d, 0x19, 0x13, 0xf0, 0x6e, 0xc1, 0xb0, 0xf0, 0x32, 0x2e, 0x2c, 0x25, 0x7b, 0x0e,
|
||||
0x1d, 0x15, 0x50, 0x4d, 0x58, 0x5d, 0x45, 0xf8, 0x52, 0x8c, 0x25, 0xb4, 0x44, 0xf6, 0xe1, 0xf6,
|
||||
0xe0, 0x51, 0x8e, 0x42, 0xda, 0x78, 0x2c, 0x7f, 0x3f, 0xf8, 0x3c, 0xba, 0xeb, 0xbf, 0x04, 0x98,
|
||||
0xaf, 0x44, 0x39, 0x5d, 0x91, 0x3b, 0x5d, 0x1c, 0xe8, 0xc9, 0xb5, 0xed, 0xc5, 0x1a, 0x88, 0xb7,
|
||||
0xe5, 0x37, 0x25, 0xeb, 0x37, 0xb0, 0xf9, 0x4b, 0xd1, 0xb4, 0x32, 0x2c, 0x48, 0x35, 0xb3, 0xff,
|
||||
0x18, 0x44, 0xda, 0x5f, 0xb1, 0xa4, 0x3e, 0x2e, 0x15, 0x7a, 0x58, 0xbb, 0x41, 0x38, 0x7f, 0x00,
|
||||
0x28, 0x79, 0x0a, 0xb8, 0x7f, 0x55, 0x00, 0xe6, 0xc2, 0xcc, 0xb7, 0xd0, 0xa7, 0xc1, 0x48, 0x34,
|
||||
0x1b, 0xea, 0x10, 0x55, 0x45, 0xa3, 0x88, 0x60, 0xec, 0x18, 0xbd, 0x26, 0xba, 0xcd, 0xef, 0x6b,
|
||||
0x5f, 0x8a, 0x36, 0xfc, 0x08, 0xf6, 0xe6, 0xbc, 0x6e, 0x86, 0xad, 0xbc, 0x96, 0xed, 0x35, 0xec,
|
||||
0x20, 0x1b, 0xb6, 0xa3, 0x38, 0xc7, 0x54, 0x59, 0xcb, 0xf4, 0x53, 0x38, 0xcc, 0xd8, 0x29, 0x92,
|
||||
0x3d, 0xc3, 0x5a, 0x5d, 0xcb, 0xfa, 0x63, 0xd8, 0x47, 0xd6, 0x1b, 0x9b, 0xf2, 0x22, 0x5f, 0xed,
|
||||
0x7f, 0xb0, 0x73, 0x46, 0xa2, 0x49, 0xce, 0xce, 0xfa, 0x5a, 0xa6, 0x1f, 0xc0, 0x36, 0x32, 0x15,
|
||||
0xf4, 0x34, 0xee, 0x63, 0x61, 0xc4, 0xe1, 0xd8, 0x98, 0x32, 0x2c, 0xcd, 0x75, 0x2c, 0xd6, 0x10,
|
||||
0x3a, 0x1f, 0xe3, 0x09, 0xe1, 0xde, 0x38, 0xcd, 0xfe, 0xff, 0xb3, 0x9e, 0xfe, 0x51, 0x86, 0xf6,
|
||||
0xc9, 0x24, 0x0a, 0xe2, 0x30, 0xd7, 0x37, 0x54, 0x4a, 0x2f, 0xf4, 0x0d, 0x45, 0xf3, 0x02, 0x3a,
|
||||
0x6a, 0x5a, 0x69, 0x32, 0x55, 0x6b, 0xe6, 0x62, 0xe6, 0x8b, 0xab, 0xa9, 0x9c, 0xba, 0x9a, 0x30,
|
||||
0x5f, 0x6d, 0x99, 0x6c, 0xfc, 0x19, 0x18, 0x53, 0xe5, 0x97, 0xa6, 0x54, 0x91, 0x7d, 0x96, 0x68,
|
||||
0x9e, 0x1b, 0x78, 0x9c, 0xf5, 0x5f, 0xe1, 0x88, 0x37, 0x14, 0x71, 0xf5, 0x19, 0x25, 0x65, 0x98,
|
||||
0x7d, 0x7b, 0xa6, 0x9d, 0xa9, 0xff, 0x11, 0xb6, 0x17, 0x59, 0x73, 0x05, 0x68, 0x65, 0x0b, 0xb0,
|
||||
0x3d, 0xd8, 0xd1, 0x22, 0xb2, 0x5c, 0xb2, 0x2a, 0x6f, 0xd5, 0x15, 0x29, 0x7d, 0xd5, 0x98, 0xdf,
|
||||
0x07, 0xc3, 0x57, 0x43, 0x2f, 0xc5, 0xad, 0x92, 0x11, 0x90, 0x1b, 0x88, 0x88, 0x9d, 0x23, 0xbd,
|
||||
0x59, 0x8a, 0x5d, 0x36, 0x12, 0xb9, 0xf1, 0xaa, 0x5a, 0xad, 0xbe, 0xc1, 0x2f, 0x7b, 0xed, 0x0e,
|
||||
0xfe, 0x52, 0x87, 0xca, 0xbb, 0xe1, 0xaf, 0xcd, 0x33, 0xd8, 0x2c, 0xbc, 0xd1, 0xcd, 0xa4, 0x27,
|
||||
0x2d, 0xff, 0xba, 0xd0, 0x7f, 0xbc, 0xea, 0x58, 0xdf, 0x25, 0x36, 0x84, 0xcc, 0xc2, 0x45, 0x23,
|
||||
0x95, 0xb9, 0xfc, 0x52, 0x97, 0xca, 0x5c, 0x75, 0x3f, 0xd9, 0x30, 0x7f, 0x02, 0x75, 0xf5, 0xa2,
|
||||
0x37, 0x77, 0x35, 0x6d, 0xee, 0xd3, 0x40, 0x7f, 0xaf, 0xb0, 0x9b, 0x32, 0x9e, 0x82, 0x91, 0xfb,
|
||||
0x80, 0x62, 0x3e, 0xc8, 0xe9, 0xca, 0x7f, 0x10, 0xe8, 0x3f, 0x5c, 0x7e, 0x98, 0x4a, 0x3b, 0x01,
|
||||
0x98, 0xbf, 0x53, 0xcd, 0x9e, 0xa6, 0x5e, 0xf8, 0xb0, 0xd0, 0x3f, 0x5c, 0x72, 0x92, 0x0a, 0xb9,
|
||||
0x84, 0xad, 0xe2, 0x43, 0xd4, 0x2c, 0xa0, 0x5a, 0x7c, 0x36, 0xf6, 0x9f, 0xac, 0x3c, 0xcf, 0x8a,
|
||||
0x2d, 0x3e, 0x47, 0x53, 0xb1, 0x2b, 0x1e, 0xb7, 0xa9, 0xd8, 0x95, 0xef, 0xd8, 0x0d, 0xf3, 0xb7,
|
||||
0xd0, 0xcd, 0xbf, 0x24, 0xcd, 0x04, 0xa4, 0xa5, 0x0f, 0xdc, 0xfe, 0xa3, 0x15, 0xa7, 0xa9, 0xc0,
|
||||
0x1f, 0x42, 0x4d, 0xbd, 0x19, 0x93, 0x8c, 0xcf, 0x3e, 0x33, 0xfb, 0xbb, 0xf9, 0xcd, 0x94, 0xeb,
|
||||
0x15, 0xd4, 0xd5, 0x15, 0x35, 0x4d, 0x80, 0xdc, 0x8d, 0xb5, 0xdf, 0xc9, 0xee, 0x5a, 0x1b, 0xaf,
|
||||
0x4a, 0x89, 0x1e, 0x96, 0xd3, 0xc3, 0x96, 0xe9, 0xc9, 0x04, 0x67, 0x5c, 0x97, 0x9f, 0xf8, 0x5e,
|
||||
0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xee, 0xbf, 0x26, 0x33, 0xef, 0x13, 0x00, 0x00,
|
||||
// 2212 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x39, 0x4b, 0x73, 0x1c, 0x49,
|
||||
0xd1, 0x9e, 0xa7, 0x34, 0x39, 0x0f, 0x49, 0x6d, 0x3d, 0xc6, 0xb3, 0x6b, 0xaf, 0xbf, 0x8e, 0x0f,
|
||||
0xd6, 0xc0, 0x22, 0x8c, 0xbc, 0x1b, 0x38, 0x20, 0x20, 0x62, 0x2d, 0x1b, 0x30, 0x6b, 0x2d, 0x72,
|
||||
0x4b, 0x8a, 0xbd, 0x10, 0x31, 0xd1, 0x9a, 0x2e, 0xcf, 0x34, 0xea, 0xe9, 0xee, 0xed, 0xae, 0xd1,
|
||||
0xe3, 0xc2, 0x11, 0x6e, 0x1c, 0xb9, 0x10, 0xc1, 0x85, 0x1b, 0x77, 0x0e, 0xfc, 0x02, 0xfe, 0x09,
|
||||
0xb1, 0x3f, 0x81, 0x23, 0x59, 0x95, 0xd5, 0x55, 0xd5, 0xf3, 0x90, 0x96, 0x03, 0xc1, 0x85, 0xcb,
|
||||
0x44, 0xe5, 0xa3, 0x32, 0xb3, 0xf2, 0x55, 0xd9, 0x35, 0xd0, 0xf2, 0xd3, 0x70, 0x3f, 0xcd, 0x12,
|
||||
0x9e, 0x38, 0x0d, 0x7e, 0x93, 0xb2, 0xdc, 0xfd, 0x6d, 0x05, 0xb6, 0xcf, 0xd2, 0xc0, 0xe7, 0xec,
|
||||
0x38, 0x4b, 0x46, 0x2c, 0xcf, 0x3d, 0xf6, 0xe5, 0x8c, 0xe5, 0xdc, 0xe9, 0x41, 0x35, 0x0c, 0xfa,
|
||||
0x95, 0xc7, 0x95, 0x27, 0x2d, 0x0f, 0x57, 0xce, 0x26, 0xd4, 0x52, 0x44, 0x54, 0x25, 0x42, 0x2c,
|
||||
0x9d, 0x47, 0x00, 0xa3, 0x28, 0xc9, 0xd9, 0x09, 0x0f, 0xc2, 0xb8, 0x5f, 0x43, 0xc2, 0xba, 0x67,
|
||||
0x61, 0x9c, 0x6d, 0x68, 0x5c, 0x85, 0x01, 0x9f, 0xf4, 0xeb, 0x48, 0xea, 0x7a, 0x04, 0x38, 0xbb,
|
||||
0xd0, 0x9c, 0xb0, 0x70, 0x3c, 0xe1, 0xfd, 0x86, 0x44, 0x2b, 0xc8, 0xdd, 0x83, 0x9d, 0x39, 0x3b,
|
||||
0xf2, 0x34, 0x89, 0x73, 0xe6, 0x7e, 0x55, 0x81, 0xdd, 0xc3, 0x8c, 0x21, 0xe5, 0x30, 0x89, 0xb9,
|
||||
0x1f, 0xc6, 0x2c, 0x5b, 0x65, 0x23, 0x5a, 0x74, 0x3e, 0x8b, 0x83, 0x88, 0x1d, 0xfb, 0xa8, 0x96,
|
||||
0x4c, 0xb5, 0x30, 0xd2, 0xe2, 0x09, 0x1b, 0x5d, 0xa4, 0x49, 0x18, 0x73, 0x69, 0x31, 0xd2, 0x0d,
|
||||
0x46, 0x58, 0x9c, 0xcb, 0xc3, 0xd4, 0x25, 0x89, 0x00, 0x61, 0x31, 0x2e, 0x92, 0x19, 0x59, 0xdc,
|
||||
0xf2, 0x14, 0xa4, 0xf0, 0x2c, 0xcb, 0xfa, 0x4d, 0x8d, 0x47, 0x48, 0xe0, 0x23, 0xff, 0x9c, 0x45,
|
||||
0x79, 0x7f, 0xed, 0x71, 0x4d, 0xe0, 0x09, 0x72, 0x1e, 0x43, 0x3b, 0x4e, 0x8e, 0xc3, 0xcb, 0x84,
|
||||
0x7b, 0x49, 0xc2, 0xfb, 0xeb, 0xd2, 0x61, 0x36, 0xca, 0x7d, 0x0d, 0x7b, 0x0b, 0x27, 0x25, 0x2f,
|
||||
0x38, 0xfb, 0xd0, 0x1a, 0x15, 0x48, 0x79, 0xe2, 0xf6, 0xc1, 0xe6, 0xbe, 0x0c, 0xe1, 0xbe, 0x61,
|
||||
0x36, 0x2c, 0x28, 0xaa, 0x7b, 0x12, 0x8e, 0x63, 0x3f, 0xfa, 0xfa, 0xf1, 0x14, 0xe7, 0x91, 0x5b,
|
||||
0xa4, 0x67, 0x30, 0x32, 0x04, 0xb9, 0x9b, 0xd0, 0x2b, 0x44, 0xa9, 0x90, 0xfc, 0xb5, 0x06, 0x5b,
|
||||
0x9f, 0x06, 0xc1, 0x1d, 0x19, 0x33, 0x80, 0x75, 0xce, 0xb2, 0x69, 0x28, 0x24, 0x56, 0xe5, 0x61,
|
||||
0x35, 0xec, 0x7c, 0x00, 0xf5, 0x59, 0x8e, 0x27, 0xa9, 0xc9, 0x93, 0xb4, 0xd5, 0x49, 0xce, 0x10,
|
||||
0xe5, 0x49, 0x82, 0xe3, 0x40, 0xdd, 0xcf, 0xc6, 0x39, 0x46, 0x42, 0xb8, 0x50, 0xae, 0x85, 0xc9,
|
||||
0x2c, 0xbe, 0xc4, 0x28, 0x08, 0x94, 0x58, 0x0a, 0xcc, 0xe8, 0x2a, 0x50, 0xfe, 0x17, 0xcb, 0xe2,
|
||||
0x58, 0x6b, 0xe6, 0x58, 0x3a, 0xa8, 0xeb, 0xcb, 0x83, 0xda, 0x5a, 0x11, 0x54, 0x28, 0x05, 0xd5,
|
||||
0x85, 0xce, 0xc8, 0x4f, 0xfd, 0xf3, 0x30, 0x0a, 0x79, 0xc8, 0xf2, 0x7e, 0x5b, 0x1a, 0x51, 0xc2,
|
||||
0x39, 0x4f, 0x60, 0xc3, 0x4f, 0x53, 0x3f, 0x9b, 0x26, 0x19, 0xba, 0xe6, 0x5d, 0x18, 0xb1, 0x7e,
|
||||
0x47, 0x0a, 0x99, 0x47, 0x0b, 0x69, 0x39, 0x8b, 0xc2, 0x78, 0x76, 0xfd, 0x46, 0xe4, 0x46, 0xbf,
|
||||
0x2b, 0xd9, 0x4a, 0x38, 0x21, 0x2d, 0x4e, 0x3e, 0x67, 0x57, 0xc7, 0x59, 0x78, 0x89, 0x7b, 0xc6,
|
||||
0xa8, 0xb4, 0x27, 0xbd, 0x38, 0x8f, 0x76, 0x3e, 0x84, 0xb5, 0x2c, 0x0a, 0xa7, 0x21, 0xcf, 0xfb,
|
||||
0x1b, 0x68, 0x56, 0xfb, 0xa0, 0xab, 0xfc, 0xe9, 0x49, 0xac, 0x57, 0x50, 0xdd, 0x97, 0xd0, 0x24,
|
||||
0x94, 0x70, 0xaf, 0x60, 0x51, 0xd1, 0x92, 0x6b, 0x81, 0xcb, 0x93, 0x77, 0x5c, 0xc6, 0xaa, 0xee,
|
||||
0xc9, 0xb5, 0xc0, 0x4d, 0xfc, 0x2c, 0x90, 0x71, 0x42, 0x9c, 0x58, 0xbb, 0x1e, 0xd4, 0x45, 0xa0,
|
||||
0x84, 0xab, 0x67, 0x2a, 0xe0, 0x5d, 0x4f, 0x2c, 0x05, 0x66, 0xac, 0x72, 0x0a, 0x31, 0xb8, 0x74,
|
||||
0xbe, 0x09, 0x3d, 0x3f, 0x08, 0xd0, 0x3d, 0x09, 0x46, 0xfd, 0x67, 0x61, 0x90, 0xa3, 0xa4, 0x1a,
|
||||
0x12, 0xe7, 0xb0, 0xee, 0x36, 0x38, 0x76, 0x42, 0xa9, 0x3c, 0xfb, 0x95, 0xae, 0x07, 0x5d, 0xa3,
|
||||
0xab, 0x92, 0xed, 0xfb, 0xa5, 0xd2, 0xae, 0xca, 0xb4, 0xda, 0x2a, 0x0a, 0xc4, 0xec, 0xb6, 0x98,
|
||||
0xdc, 0x01, 0xf4, 0x17, 0xa5, 0x2b, 0xcd, 0x3f, 0x86, 0xbd, 0x97, 0x2c, 0x62, 0x5f, 0x47, 0x33,
|
||||
0xba, 0x28, 0xf6, 0xa7, 0x4c, 0x55, 0x92, 0x5c, 0x0b, 0xd1, 0x8b, 0xdb, 0x95, 0xe8, 0x0f, 0x61,
|
||||
0xe7, 0x4d, 0x98, 0xf3, 0x3b, 0x05, 0xbb, 0xbf, 0x01, 0x30, 0x4c, 0x5a, 0x4d, 0xc5, 0xa8, 0x11,
|
||||
0x38, 0x76, 0x1d, 0x72, 0x55, 0x5d, 0x72, 0x2d, 0x62, 0xc0, 0x47, 0xa9, 0x6a, 0xc7, 0x62, 0x29,
|
||||
0xfa, 0xce, 0x2c, 0x0e, 0xaf, 0x4f, 0x92, 0xd1, 0x05, 0xe3, 0xb9, 0xec, 0x6d, 0xd8, 0x77, 0x2c,
|
||||
0x94, 0x2c, 0x91, 0x09, 0x8b, 0x22, 0xd9, 0xe0, 0xd6, 0x3d, 0x02, 0xdc, 0x23, 0xd8, 0x9d, 0x37,
|
||||
0x54, 0x35, 0xa3, 0x67, 0xd0, 0x36, 0x7e, 0xcc, 0xd1, 0xa4, 0xda, 0x72, 0x6f, 0xdb, 0x5c, 0xee,
|
||||
0x23, 0xe8, 0x9c, 0x70, 0xf4, 0xf6, 0xaa, 0xe3, 0x3e, 0x81, 0x9e, 0xee, 0x64, 0x92, 0x91, 0x6a,
|
||||
0xd1, 0xe7, 0xb3, 0x5c, 0x71, 0x29, 0xc8, 0xfd, 0x5b, 0x0d, 0xd6, 0x54, 0xaa, 0x14, 0xf5, 0x5e,
|
||||
0x31, 0xf5, 0xfe, 0x5f, 0x69, 0x3b, 0xef, 0x43, 0x2b, 0xbf, 0xc9, 0x39, 0x9b, 0x1e, 0xab, 0xe6,
|
||||
0xd3, 0xf5, 0x0c, 0xe2, 0x7f, 0x2d, 0xc8, 0xb4, 0xa0, 0xbf, 0x57, 0xa0, 0xa5, 0xc3, 0xfc, 0x6f,
|
||||
0x5f, 0xe0, 0x1f, 0x41, 0x2b, 0xa5, 0xc0, 0x33, 0xea, 0x24, 0xed, 0x83, 0x9e, 0x52, 0x54, 0xf4,
|
||||
0x0e, 0xc3, 0x60, 0xe5, 0x4f, 0xdd, 0xce, 0x1f, 0xeb, 0x82, 0x6e, 0x94, 0x2e, 0x68, 0x0c, 0x7e,
|
||||
0x2a, 0x5a, 0x54, 0x53, 0xb6, 0x28, 0xb9, 0x76, 0xfa, 0x78, 0xb0, 0x59, 0xcc, 0x43, 0xac, 0x3c,
|
||||
0xba, 0x53, 0x0a, 0xd0, 0xfd, 0x04, 0xd6, 0x8e, 0xfc, 0xd1, 0x04, 0xcf, 0x21, 0x36, 0x8e, 0x52,
|
||||
0x95, 0xa6, 0xb8, 0x51, 0xac, 0x85, 0x92, 0x29, 0x43, 0x7f, 0xdf, 0xa8, 0x7e, 0xaa, 0x20, 0xf7,
|
||||
0x02, 0x2f, 0x66, 0x2a, 0x03, 0x55, 0x4c, 0x4f, 0xb1, 0x73, 0x15, 0x0e, 0x29, 0x6a, 0x69, 0xf1,
|
||||
0x6a, 0xb7, 0x78, 0x30, 0x2c, 0x6b, 0x53, 0xd2, 0xac, 0x1a, 0x5d, 0xe1, 0x03, 0x65, 0x8f, 0x57,
|
||||
0x90, 0xdd, 0xdf, 0xe1, 0xec, 0x44, 0x53, 0xd5, 0x9d, 0xb3, 0xd3, 0xf2, 0x79, 0x80, 0xdc, 0x57,
|
||||
0x2b, 0xb9, 0xef, 0x19, 0xb4, 0x32, 0x96, 0x27, 0xb3, 0x0c, 0xdd, 0x2c, 0x3d, 0xdb, 0x3e, 0xd8,
|
||||
0x29, 0x2a, 0x49, 0xea, 0xf2, 0x14, 0xd5, 0x33, 0x7c, 0xee, 0x57, 0x55, 0xe8, 0x95, 0xa9, 0xa2,
|
||||
0x2f, 0x9d, 0x47, 0x17, 0x61, 0xf2, 0x05, 0x8d, 0x83, 0xe4, 0x3c, 0x1b, 0x25, 0xaa, 0x0a, 0x7d,
|
||||
0x79, 0x82, 0xb7, 0x0e, 0x6a, 0xa2, 0x5b, 0xc5, 0x20, 0x14, 0xf5, 0x98, 0x65, 0x61, 0x12, 0xa8,
|
||||
0x91, 0xc5, 0x20, 0x44, 0x1b, 0x40, 0xe0, 0xed, 0x2c, 0xe1, 0xbe, 0x1a, 0x40, 0x35, 0x2c, 0xe7,
|
||||
0x40, 0x8c, 0x11, 0xe3, 0x87, 0x22, 0x6a, 0x0d, 0x35, 0x07, 0x6a, 0x8c, 0xa1, 0x1f, 0xb1, 0x69,
|
||||
0xae, 0xca, 0xdc, 0xc2, 0x08, 0xcb, 0x29, 0x9a, 0x6f, 0x44, 0x52, 0xab, 0x7a, 0xb7, 0x51, 0x42,
|
||||
0x02, 0x81, 0x27, 0x57, 0x7e, 0x2a, 0xcb, 0xbe, 0xeb, 0x59, 0x18, 0x4c, 0xe4, 0x2d, 0x82, 0xd0,
|
||||
0x1b, 0x2c, 0xbb, 0xf4, 0xc5, 0x55, 0x28, 0xdb, 0x40, 0xd7, 0x5b, 0x24, 0x08, 0xee, 0x0b, 0x96,
|
||||
0xc5, 0x2c, 0x3a, 0xb2, 0xb4, 0x02, 0x71, 0x2f, 0x10, 0xdc, 0x07, 0xb0, 0xb7, 0x10, 0x73, 0x75,
|
||||
0xf7, 0x7c, 0x17, 0xba, 0xaf, 0x2e, 0x19, 0x76, 0xe3, 0x22, 0x0b, 0xd0, 0x87, 0x22, 0x99, 0x31,
|
||||
0xb2, 0xd3, 0x54, 0x46, 0xa0, 0xee, 0x19, 0x84, 0x9b, 0x43, 0x43, 0xb2, 0x2f, 0x1d, 0x17, 0x28,
|
||||
0x81, 0xaa, 0x3a, 0x81, 0xca, 0xe9, 0xd2, 0xd5, 0xe9, 0xa2, 0x12, 0xab, 0x6e, 0x12, 0xab, 0xa4,
|
||||
0xb4, 0x31, 0xaf, 0xf4, 0xf7, 0x55, 0xe8, 0x7c, 0xce, 0xf8, 0x55, 0x92, 0x5d, 0x88, 0x42, 0xc9,
|
||||
0x97, 0xde, 0x7c, 0x0f, 0x60, 0x3d, 0xbb, 0x1e, 0x9e, 0xdf, 0x70, 0x95, 0x18, 0x75, 0xac, 0xcb,
|
||||
0xeb, 0x17, 0x02, 0x74, 0x1e, 0x02, 0x20, 0xe9, 0xd8, 0xa7, 0xdb, 0x8e, 0x06, 0x97, 0x56, 0x76,
|
||||
0xad, 0x10, 0xce, 0x7b, 0xd0, 0xf2, 0xae, 0x87, 0xd8, 0x4f, 0x93, 0x8c, 0xb2, 0xb7, 0xee, 0xa1,
|
||||
0xa8, 0x57, 0x12, 0x16, 0x7b, 0x91, 0x18, 0x64, 0x49, 0x9a, 0xb2, 0xa0, 0x30, 0x2d, 0xbb, 0x7e,
|
||||
0x49, 0x08, 0xa1, 0xf5, 0xb4, 0xd0, 0xda, 0x24, 0xad, 0xdc, 0x68, 0x45, 0x52, 0xaa, 0xb4, 0xae,
|
||||
0xa9, 0x43, 0xd9, 0x5a, 0x4f, 0xb5, 0xd6, 0x75, 0xd2, 0xca, 0x2d, 0xad, 0xa7, 0x46, 0x6b, 0xab,
|
||||
0xd8, 0xab, 0xb4, 0xba, 0x7f, 0xa9, 0xc0, 0x3a, 0xa6, 0xe5, 0x59, 0xee, 0x8f, 0x19, 0xde, 0x60,
|
||||
0x6d, 0x8e, 0x29, 0x1c, 0x0d, 0x67, 0x02, 0x54, 0x21, 0x03, 0x89, 0x22, 0x86, 0xff, 0x83, 0x4e,
|
||||
0xca, 0x32, 0x4c, 0x56, 0xc5, 0x51, 0xc5, 0x86, 0x52, 0xf7, 0xda, 0x84, 0x23, 0x96, 0x7d, 0xb8,
|
||||
0x2f, 0x69, 0xc3, 0x30, 0x1e, 0x52, 0xfa, 0x4c, 0x93, 0x80, 0x29, 0x57, 0x6d, 0x49, 0xd2, 0xeb,
|
||||
0xf8, 0x33, 0x4d, 0x70, 0xbe, 0x0d, 0x5b, 0x9a, 0x5f, 0xdc, 0x92, 0x92, 0x9b, 0x5c, 0xb7, 0xa1,
|
||||
0xb8, 0xcf, 0x14, 0x1a, 0x87, 0x96, 0xde, 0xe9, 0x04, 0x3f, 0x30, 0x39, 0x5e, 0x23, 0xe3, 0x97,
|
||||
0x3e, 0x16, 0x1b, 0x76, 0xd0, 0x54, 0x96, 0x64, 0xae, 0xac, 0x2d, 0x40, 0xe7, 0x3b, 0xb0, 0xc5,
|
||||
0x89, 0x97, 0x05, 0xc3, 0x82, 0x87, 0xa2, 0xb9, 0xa9, 0x09, 0xc7, 0x8a, 0xf9, 0x1b, 0xd0, 0x33,
|
||||
0xcc, 0xb2, 0x1f, 0x93, 0xbd, 0x5d, 0x8d, 0x3d, 0x15, 0x5d, 0xf9, 0x8f, 0xe4, 0x2c, 0xca, 0x9c,
|
||||
0x8f, 0x64, 0x87, 0xb0, 0x5c, 0xd5, 0x3e, 0xd8, 0x28, 0x3a, 0xab, 0x72, 0x86, 0xec, 0x0a, 0xe4,
|
||||
0x96, 0x9f, 0xc0, 0x06, 0xd7, 0xa6, 0x0f, 0xb1, 0x80, 0x7c, 0xd5, 0x5e, 0x8b, 0xee, 0x56, 0x3e,
|
||||
0x98, 0xd7, 0xe3, 0xe5, 0x83, 0xa2, 0xe7, 0xe9, 0xca, 0x57, 0x0a, 0xc9, 0xbe, 0x36, 0xe1, 0xa4,
|
||||
0x0a, 0xf7, 0x47, 0xd0, 0xc2, 0x79, 0x20, 0x27, 0xeb, 0xd0, 0x31, 0xa3, 0x59, 0x96, 0x61, 0x7d,
|
||||
0x15, 0x8e, 0x51, 0xa0, 0x98, 0x17, 0xe4, 0x75, 0xa9, 0x9c, 0x41, 0x80, 0x9b, 0x00, 0x50, 0x99,
|
||||
0x4b, 0x6d, 0xc8, 0x63, 0xa7, 0x00, 0x01, 0x22, 0xcf, 0xa6, 0xfe, 0xb5, 0x0e, 0xbd, 0xcc, 0x33,
|
||||
0x44, 0xd0, 0x01, 0x51, 0xe1, 0x3b, 0x3f, 0x8c, 0x46, 0xea, 0xdb, 0x17, 0x15, 0x2a, 0xd0, 0x28,
|
||||
0xac, 0xdb, 0x0a, 0xff, 0x5c, 0x85, 0x36, 0x69, 0x24, 0x83, 0x91, 0x6b, 0x84, 0x17, 0x8b, 0x56,
|
||||
0x29, 0x01, 0xbc, 0xfa, 0x1b, 0x46, 0x9d, 0x19, 0x03, 0x8d, 0xa9, 0x85, 0x6d, 0x78, 0xd1, 0xe5,
|
||||
0xd8, 0xfb, 0x2c, 0xef, 0x2c, 0xe5, 0x6e, 0x09, 0x26, 0x32, 0xf8, 0x63, 0xe8, 0x50, 0x7e, 0xaa,
|
||||
0x3d, 0xf5, 0x55, 0x7b, 0xda, 0xc4, 0x46, 0xbb, 0x9e, 0x89, 0x69, 0x0b, 0xed, 0x95, 0xb7, 0x7b,
|
||||
0xfb, 0xe0, 0x61, 0x89, 0x5d, 0x9e, 0x64, 0x5f, 0xfe, 0xbe, 0x8a, 0x39, 0xb6, 0x59, 0xe2, 0x1d,
|
||||
0x3c, 0x07, 0x30, 0x48, 0xd1, 0xb3, 0x2e, 0xd8, 0x4d, 0x31, 0x55, 0xe2, 0x52, 0x9c, 0xfd, 0xd2,
|
||||
0x8f, 0x66, 0x85, 0x53, 0x09, 0xf8, 0x61, 0xf5, 0x79, 0xc5, 0x1d, 0xc1, 0xc6, 0x0b, 0x71, 0x67,
|
||||
0x59, 0xdb, 0x91, 0x79, 0xea, 0xff, 0x3a, 0xc9, 0x0a, 0x47, 0x49, 0x40, 0x62, 0xc3, 0x18, 0xb1,
|
||||
0x4a, 0x84, 0x04, 0x44, 0x1b, 0x4d, 0x52, 0x75, 0xc3, 0xe2, 0xca, 0x28, 0xaa, 0x5b, 0x8a, 0xdc,
|
||||
0x7f, 0xd4, 0x01, 0x8c, 0x16, 0xe7, 0x04, 0x06, 0x61, 0x32, 0x14, 0x17, 0x44, 0x38, 0x62, 0xd4,
|
||||
0x90, 0x86, 0x19, 0xc3, 0xf4, 0xc9, 0xc3, 0x4b, 0xa6, 0x66, 0x88, 0x5d, 0x75, 0xee, 0x39, 0xe3,
|
||||
0xbc, 0x3d, 0x84, 0x68, 0xa3, 0xec, 0x5c, 0x5e, 0xb1, 0xcd, 0xf9, 0x05, 0xec, 0x18, 0xa1, 0x81,
|
||||
0x25, 0xaf, 0x7a, 0xab, 0xbc, 0xfb, 0x5a, 0x5e, 0x60, 0x64, 0xfd, 0x14, 0x10, 0x3d, 0xc4, 0x3b,
|
||||
0x66, 0x56, 0x92, 0x54, 0xbb, 0x55, 0xd2, 0x56, 0x98, 0xbc, 0x95, 0x3b, 0x8c, 0x9c, 0xb7, 0xf0,
|
||||
0xc0, 0x3a, 0xa8, 0x28, 0x7b, 0x4b, 0x5a, 0xfd, 0x56, 0x69, 0xbb, 0xda, 0x2e, 0xd1, 0x18, 0x8c,
|
||||
0xc8, 0xcf, 0x00, 0x29, 0xc3, 0x2b, 0x3f, 0xe4, 0xf3, 0xf2, 0x1a, 0x77, 0x9d, 0xf3, 0x0b, 0xdc,
|
||||
0x54, 0x16, 0x46, 0xe7, 0x9c, 0xb2, 0x6c, 0x5c, 0x3a, 0x67, 0xf3, 0xae, 0x73, 0x1e, 0xc9, 0x1d,
|
||||
0x46, 0xce, 0x0b, 0x40, 0xe4, 0xbc, 0x3d, 0x6b, 0xb7, 0x4a, 0xd9, 0x08, 0x93, 0xb2, 0x2d, 0x87,
|
||||
0xb0, 0x95, 0xb3, 0x11, 0xc7, 0x1b, 0xc5, 0x92, 0xb1, 0x7e, 0xab, 0x8c, 0x4d, 0xb5, 0x41, 0x0b,
|
||||
0x71, 0xbf, 0x84, 0xce, 0xcf, 0x67, 0x63, 0xc6, 0xa3, 0x73, 0x5d, 0xf3, 0xff, 0xe9, 0x36, 0xf3,
|
||||
0x4f, 0x6c, 0x33, 0x87, 0xe3, 0x2c, 0x99, 0xa5, 0xa5, 0xae, 0x4d, 0x35, 0xbc, 0xd0, 0xb5, 0x25,
|
||||
0x8f, 0xec, 0xda, 0xc4, 0xfd, 0x09, 0x74, 0x68, 0x60, 0x52, 0x1b, 0xa8, 0x0b, 0x39, 0x8b, 0x45,
|
||||
0x5f, 0x0c, 0x68, 0xb4, 0xed, 0x40, 0x0d, 0x9f, 0x6a, 0x57, 0xb9, 0x1b, 0x19, 0x37, 0xe1, 0xd7,
|
||||
0x87, 0xa9, 0xba, 0xd7, 0xd0, 0x9d, 0x90, 0x6f, 0xd4, 0x2e, 0x4a, 0xc0, 0xff, 0x2f, 0x8c, 0x33,
|
||||
0x67, 0xd8, 0xb7, 0x7d, 0x48, 0xae, 0xee, 0x4c, 0x6c, 0xb7, 0x7e, 0x0f, 0x40, 0x7c, 0x5e, 0x0c,
|
||||
0x8b, 0x46, 0x65, 0xbf, 0xe7, 0xe9, 0x1b, 0x02, 0xbf, 0x65, 0x8a, 0xe5, 0xe0, 0x14, 0xb6, 0x16,
|
||||
0x64, 0x2e, 0x69, 0x53, 0xdf, 0xb2, 0xdb, 0x54, 0xfb, 0xe0, 0xbe, 0x12, 0x69, 0x6f, 0xb5, 0x7b,
|
||||
0xd7, 0x9f, 0x2a, 0xf4, 0x35, 0xa2, 0x9f, 0x5c, 0x9c, 0xe7, 0xd0, 0x8d, 0x69, 0xf8, 0xd2, 0x01,
|
||||
0xa8, 0x59, 0x82, 0xec, 0xc1, 0xcc, 0xeb, 0xc4, 0xf6, 0x98, 0x86, 0x81, 0x18, 0x49, 0x0f, 0x2c,
|
||||
0x0d, 0x84, 0xe5, 0x1c, 0xaf, 0x3d, 0xb2, 0xa2, 0x5d, 0x1a, 0x06, 0x6b, 0xf3, 0xc3, 0xa0, 0x7a,
|
||||
0x34, 0x58, 0xf5, 0xc6, 0x78, 0xf0, 0x87, 0x26, 0xd4, 0x3e, 0x3d, 0x7e, 0xed, 0x78, 0xb0, 0x31,
|
||||
0xf7, 0x72, 0xea, 0x14, 0x7d, 0x7f, 0xf9, 0xdb, 0xf1, 0xe0, 0xd1, 0x2a, 0xb2, 0x1a, 0x95, 0xef,
|
||||
0x09, 0x99, 0x73, 0x73, 0xb4, 0x96, 0xb9, 0xfc, 0x9b, 0x4a, 0xcb, 0x5c, 0x35, 0x7e, 0xdf, 0x73,
|
||||
0x7e, 0x00, 0x4d, 0x7a, 0x4b, 0x75, 0xb6, 0x15, 0x6f, 0xe9, 0x95, 0x76, 0xb0, 0x33, 0x87, 0xd5,
|
||||
0x1b, 0xdf, 0x40, 0xb7, 0xf4, 0x3c, 0xee, 0xbc, 0x57, 0xd2, 0x55, 0x7e, 0x8a, 0x1d, 0xbc, 0xbf,
|
||||
0x9c, 0xa8, 0xa5, 0x1d, 0x02, 0x98, 0xe7, 0x36, 0xa7, 0xaf, 0xb8, 0x17, 0x9e, 0x74, 0x07, 0x0f,
|
||||
0x96, 0x50, 0xb4, 0x90, 0x33, 0xd8, 0x9c, 0x7f, 0x3f, 0x73, 0xe6, 0xbc, 0x3a, 0xff, 0xc6, 0x35,
|
||||
0xf8, 0x60, 0x25, 0xdd, 0x16, 0x3b, 0xff, 0x76, 0xa6, 0xc5, 0xae, 0x78, 0x93, 0xd3, 0x62, 0x57,
|
||||
0x3e, 0xba, 0xdd, 0x73, 0x7e, 0x09, 0xbd, 0xf2, 0x6b, 0x96, 0x53, 0x38, 0x69, 0xe9, 0x6b, 0xdc,
|
||||
0xe0, 0xe1, 0x0a, 0xaa, 0x16, 0xf8, 0x31, 0x34, 0xe8, 0x99, 0xaa, 0xa8, 0x0d, 0xfb, 0x75, 0x6b,
|
||||
0xb0, 0x5d, 0x46, 0xea, 0x5d, 0x4f, 0xa1, 0x49, 0x5f, 0x60, 0x3a, 0x01, 0x4a, 0x1f, 0x64, 0x83,
|
||||
0x8e, 0x8d, 0x75, 0xef, 0x3d, 0xad, 0x14, 0x7a, 0xf2, 0x92, 0x9e, 0x7c, 0x99, 0x1e, 0x2b, 0x38,
|
||||
0xe7, 0x4d, 0xf9, 0x2f, 0xcf, 0xb3, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x70, 0x70, 0x7d,
|
||||
0xf2, 0x19, 0x00, 0x00,
|
||||
}
|
||||
|
||||
@@ -232,6 +232,7 @@ message CpuStats {
|
||||
|
||||
message PidsStats {
|
||||
uint64 current = 1;
|
||||
uint64 limit = 2;
|
||||
}
|
||||
|
||||
message MemoryData {
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
image: dmp42/go:stable
|
||||
|
||||
script:
|
||||
# To be spoofed back into the test image
|
||||
- go get github.com/modocache/gover
|
||||
|
||||
- go get -t ./...
|
||||
|
||||
# Go fmt
|
||||
- test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
|
||||
# Go lint
|
||||
- test -z "$(golint ./... | tee /dev/stderr)"
|
||||
# Go vet
|
||||
- go vet ./...
|
||||
# Go test
|
||||
- go test -v -race -cover ./...
|
||||
# Helper to concatenate reports
|
||||
- gover
|
||||
# Send to coverall
|
||||
- goveralls -service drone.io -coverprofile=gover.coverprofile -repotoken {{COVERALLS_TOKEN}}
|
||||
|
||||
# Do we want these as well?
|
||||
# - go get code.google.com/p/go.tools/cmd/goimports
|
||||
# - test -z "$(goimports -l -w ./... | tee /dev/stderr)"
|
||||
# http://labix.org/gocheck
|
||||
|
||||
notify:
|
||||
email:
|
||||
recipients:
|
||||
- distribution@docker.com
|
||||
|
||||
slack:
|
||||
team: docker
|
||||
channel: "#dt"
|
||||
username: mom
|
||||
token: {{SLACK_TOKEN}}
|
||||
on_success: true
|
||||
on_failure: true
|
||||
@@ -13,3 +13,4 @@ Sharif Nassar <sharif@mrwacky.com> Sharif Nassar <mrwacky42@users.noreply.github
|
||||
Sven Dowideit <SvenDowideit@home.org.au> Sven Dowideit <SvenDowideit@users.noreply.github.com>
|
||||
Vincent Giersch <vincent.giersch@ovh.net> Vincent Giersch <vincent@giersch.fr>
|
||||
davidli <wenquan.li@hp.com> davidli <wenquan.li@hpe.com>
|
||||
Omer Cohen <git@omer.io> Omer Cohen <git@omerc.net>
|
||||
@@ -8,12 +8,15 @@ Alex Elman <aelman@indeed.com>
|
||||
amitshukla <ashukla73@hotmail.com>
|
||||
Amy Lindburg <amy.lindburg@docker.com>
|
||||
Andrew Meredith <andymeredith@gmail.com>
|
||||
Andrew T Nguyen <andrew.nguyen@docker.com>
|
||||
Andrey Kostov <kostov.andrey@gmail.com>
|
||||
Andy Goldstein <agoldste@redhat.com>
|
||||
Anton Tiurin <noxiouz@yandex.ru>
|
||||
Antonio Mercado <amercado@thinknode.com>
|
||||
Antonio Murdaca <runcom@redhat.com>
|
||||
Arnaud Porterie <arnaud.porterie@docker.com>
|
||||
Arthur Baars <arthur@semmle.com>
|
||||
Asuka Suzuki <hello@tanksuzuki.com>
|
||||
Avi Miller <avi.miller@oracle.com>
|
||||
Ayose Cazorla <ayosec@gmail.com>
|
||||
BadZen <dave.trombley@gmail.com>
|
||||
@@ -37,7 +40,9 @@ Diogo Mónica <diogo.monica@gmail.com>
|
||||
DJ Enriquez <dj.enriquez@infospace.com>
|
||||
Donald Huang <don.hcd@gmail.com>
|
||||
Doug Davis <dug@us.ibm.com>
|
||||
Eric Yang <windfarer@gmail.com>
|
||||
farmerworking <farmerworking@gmail.com>
|
||||
Felix Yan <felixonmars@archlinux.org>
|
||||
Florentin Raud <florentin.raud@gmail.com>
|
||||
Frederick F. Kautz IV <fkautz@alumni.cmu.edu>
|
||||
gabriell nascimento <gabriell@bluesoft.com.br>
|
||||
@@ -45,29 +50,36 @@ harche <p.harshal@gmail.com>
|
||||
Henri Gomez <henri.gomez@gmail.com>
|
||||
Hu Keping <hukeping@huawei.com>
|
||||
Hua Wang <wanghua.humble@gmail.com>
|
||||
HuKeping <hukeping@huawei.com>
|
||||
Ian Babrou <ibobrik@gmail.com>
|
||||
igayoso <igayoso@gmail.com>
|
||||
Jack Griffin <jackpg14@gmail.com>
|
||||
Jason Freidman <jason.freidman@gmail.com>
|
||||
Jeff Nickoloff <jeff@allingeek.com>
|
||||
Jessie Frazelle <jessie@docker.com>
|
||||
Jianqing Wang <tsing@jianqing.org>
|
||||
John Starks <jostarks@microsoft.com>
|
||||
Jon Poler <jonathan.poler@apcera.com>
|
||||
Jonathan Boulle <jonathanboulle@gmail.com>
|
||||
Jordan Liggitt <jliggitt@redhat.com>
|
||||
Josh Hawn <josh.hawn@docker.com>
|
||||
Julien Fernandez <julien.fernandez@gmail.com>
|
||||
Keerthan Mala <kmala@engineyard.com>
|
||||
Kelsey Hightower <kelsey.hightower@gmail.com>
|
||||
Kenneth Lim <kennethlimcp@gmail.com>
|
||||
Kenny Leung <kleung@google.com>
|
||||
Li Yi <denverdino@gmail.com>
|
||||
Liu Hua <sdu.liu@huawei.com>
|
||||
liuchang0812 <liuchang0812@gmail.com>
|
||||
Louis Kottmann <louis.kottmann@gmail.com>
|
||||
Luke Carpenter <x@rubynerd.net>
|
||||
Mary Anthony <mary@docker.com>
|
||||
Matt Bentley <mbentley@mbentley.net>
|
||||
Matt Duch <matt@learnmetrics.com>
|
||||
Matt Moore <mattmoor@google.com>
|
||||
Matt Robenolt <matt@ydekproductions.com>
|
||||
Michael Prokop <mika@grml.org>
|
||||
Michal Minar <miminar@redhat.com>
|
||||
Miquel Sabaté <msabate@suse.com>
|
||||
Morgan Bauer <mbauer@us.ibm.com>
|
||||
moxiegirl <mary@docker.com>
|
||||
@@ -78,6 +90,7 @@ Nuutti Kotivuori <nuutti.kotivuori@poplatek.fi>
|
||||
Oilbeater <liumengxinfly@gmail.com>
|
||||
Olivier Gambier <olivier@docker.com>
|
||||
Olivier Jacques <olivier.jacques@hp.com>
|
||||
Omer Cohen <git@omer.io>
|
||||
Patrick Devine <patrick.devine@docker.com>
|
||||
Philip Misiowiec <philip@atlashealth.com>
|
||||
Richard Scothern <richard.scothern@docker.com>
|
||||
@@ -90,6 +103,7 @@ Shawn Falkner-Horine <dreadpirateshawn@gmail.com>
|
||||
Shreyas Karnik <karnik.shreyas@gmail.com>
|
||||
Simon Thulbourn <simon+github@thulbourn.com>
|
||||
Spencer Rinehart <anubis@overthemonkey.com>
|
||||
Stefan Weil <sw@weilnetz.de>
|
||||
Stephen J Day <stephen.day@docker.com>
|
||||
Sungho Moon <sungho.moon@navercorp.com>
|
||||
Sven Dowideit <SvenDowideit@home.org.au>
|
||||
@@ -111,3 +125,4 @@ xg.song <xg.song@venusource.com>
|
||||
xiekeyang <xiekeyang@huawei.com>
|
||||
Yann ROBERT <yann.robert@anantaplex.fr>
|
||||
yuzou <zouyu7@huawei.com>
|
||||
姜继忠 <jizhong.jiangjz@alibaba-inc.com>
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
FROM golang:1.5.3
|
||||
FROM golang:1.6
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y apache2-utils && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV DISTRIBUTION_DIR /go/src/github.com/docker/distribution
|
||||
ENV GOPATH $DISTRIBUTION_DIR/Godeps/_workspace:$GOPATH
|
||||
ENV DOCKER_BUILDTAGS include_oss include_gcs
|
||||
|
||||
WORKDIR $DISTRIBUTION_DIR
|
||||
|
||||
@@ -15,7 +15,7 @@ GO_LDFLAGS=-ldflags "-X `go list ./version`.Version=$(VERSION)"
|
||||
|
||||
.PHONY: clean all fmt vet lint build test binaries
|
||||
.DEFAULT: all
|
||||
all: fmt vet fmt lint build test binaries
|
||||
all: fmt vet lint build test binaries
|
||||
|
||||
AUTHORS: .mailmap .git/HEAD
|
||||
git log --format='%aN <%aE>' | sort -fu > $@
|
||||
@@ -24,51 +24,83 @@ AUTHORS: .mailmap .git/HEAD
|
||||
version/version.go:
|
||||
./version/version.sh > $@
|
||||
|
||||
${PREFIX}/bin/registry: version/version.go $(shell find . -type f -name '*.go')
|
||||
# Required for go 1.5 to build
|
||||
GO15VENDOREXPERIMENT := 1
|
||||
|
||||
# Package list
|
||||
PKGS := $(shell go list -tags "${DOCKER_BUILDTAGS}" ./... | grep -v ^github.com/docker/distribution/vendor/)
|
||||
|
||||
# Resolving binary dependencies for specific targets
|
||||
GOLINT := $(shell which golint || echo '')
|
||||
GODEP := $(shell which godep || echo '')
|
||||
|
||||
${PREFIX}/bin/registry: $(wildcard **/*.go)
|
||||
@echo "+ $@"
|
||||
@go build -tags "${DOCKER_BUILDTAGS}" -o $@ ${GO_LDFLAGS} ${GO_GCFLAGS} ./cmd/registry
|
||||
|
||||
${PREFIX}/bin/digest: version/version.go $(shell find . -type f -name '*.go')
|
||||
${PREFIX}/bin/digest: $(wildcard **/*.go)
|
||||
@echo "+ $@"
|
||||
@go build -tags "${DOCKER_BUILDTAGS}" -o $@ ${GO_LDFLAGS} ${GO_GCFLAGS} ./cmd/digest
|
||||
|
||||
${PREFIX}/bin/registry-api-descriptor-template: version/version.go $(shell find . -type f -name '*.go')
|
||||
${PREFIX}/bin/registry-api-descriptor-template: $(wildcard **/*.go)
|
||||
@echo "+ $@"
|
||||
@go build -o $@ ${GO_LDFLAGS} ${GO_GCFLAGS} ./cmd/registry-api-descriptor-template
|
||||
|
||||
docs/spec/api.md: docs/spec/api.md.tmpl ${PREFIX}/bin/registry-api-descriptor-template
|
||||
./bin/registry-api-descriptor-template $< > $@
|
||||
|
||||
# Depends on binaries because vet will silently fail if it can't load compiled
|
||||
# imports
|
||||
vet: binaries
|
||||
vet:
|
||||
@echo "+ $@"
|
||||
@go vet ./...
|
||||
@go vet -tags "${DOCKER_BUILDTAGS}" $(PKGS)
|
||||
|
||||
fmt:
|
||||
@echo "+ $@"
|
||||
@test -z "$$(gofmt -s -l . | grep -v Godeps/_workspace/src/ | tee /dev/stderr)" || \
|
||||
echo "+ please format Go code with 'gofmt -s'"
|
||||
@test -z "$$(gofmt -s -l . 2>&1 | grep -v ^vendor/ | tee /dev/stderr)" || \
|
||||
(echo >&2 "+ please format Go code with 'gofmt -s'" && false)
|
||||
|
||||
lint:
|
||||
@echo "+ $@"
|
||||
@test -z "$$(golint ./... | grep -v Godeps/_workspace/src/ | tee /dev/stderr)"
|
||||
$(if $(GOLINT), , \
|
||||
$(error Please install golint: `go get -u github.com/golang/lint/golint`))
|
||||
@test -z "$$($(GOLINT) ./... 2>&1 | grep -v ^vendor/ | tee /dev/stderr)"
|
||||
|
||||
build:
|
||||
@echo "+ $@"
|
||||
@go build -tags "${DOCKER_BUILDTAGS}" -v ${GO_LDFLAGS} ./...
|
||||
@go build -tags "${DOCKER_BUILDTAGS}" -v ${GO_LDFLAGS} $(PKGS)
|
||||
|
||||
test:
|
||||
@echo "+ $@"
|
||||
@go test -test.short -tags "${DOCKER_BUILDTAGS}" ./...
|
||||
@go test -test.short -tags "${DOCKER_BUILDTAGS}" $(PKGS)
|
||||
|
||||
test-full:
|
||||
@echo "+ $@"
|
||||
@go test ./...
|
||||
@go test -tags "${DOCKER_BUILDTAGS}" $(PKGS)
|
||||
|
||||
binaries: ${PREFIX}/bin/registry ${PREFIX}/bin/digest ${PREFIX}/bin/registry-api-descriptor-template
|
||||
@echo "+ $@"
|
||||
|
||||
clean:
|
||||
@echo "+ $@"
|
||||
@rm -rf "${PREFIX}/bin/registry" "${PREFIX}/bin/registry-api-descriptor-template"
|
||||
@rm -rf "${PREFIX}/bin/registry" "${PREFIX}/bin/digest" "${PREFIX}/bin/registry-api-descriptor-template"
|
||||
|
||||
dep-save:
|
||||
@echo "+ $@"
|
||||
$(if $(GODEP), , \
|
||||
$(error Please install godep: go get github.com/tools/godep))
|
||||
@$(GODEP) save $(PKGS)
|
||||
|
||||
dep-restore:
|
||||
@echo "+ $@"
|
||||
$(if $(GODEP), , \
|
||||
$(error Please install godep: go get github.com/tools/godep))
|
||||
@$(GODEP) restore -v
|
||||
|
||||
dep-validate: dep-restore
|
||||
@echo "+ $@"
|
||||
@rm -Rf .vendor.bak
|
||||
@mv vendor .vendor.bak
|
||||
@rm -Rf Godeps
|
||||
@$(GODEP) save ./...
|
||||
@test -z "$$(diff -r vendor .vendor.bak 2>&1 | tee /dev/stderr)" || \
|
||||
(echo >&2 "+ borked dependencies! what you have in Godeps/Godeps.json does not match with what you have in vendor" && false)
|
||||
@rm -Rf .vendor.bak
|
||||
|
||||
@@ -17,7 +17,7 @@ This repository contains the following components:
|
||||
|**Component** |Description |
|
||||
|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| **registry** | An implementation of the [Docker Registry HTTP API V2](docs/spec/api.md) for use with docker 1.6+. |
|
||||
| **libraries** | A rich set of libraries for interacting with,distribution components. Please see [godoc](https://godoc.org/github.com/docker/distribution) for details. **Note**: These libraries are **unstable**. |
|
||||
| **libraries** | A rich set of libraries for interacting with distribution components. Please see [godoc](https://godoc.org/github.com/docker/distribution) for details. **Note**: These libraries are **unstable**. |
|
||||
| **specifications** | _Distribution_ related specifications are available in [docs/spec](docs/spec) |
|
||||
| **documentation** | Docker's full documentation set is available at [docs.docker.com](https://docs.docker.com). This repository [contains the subset](docs/index.md) related just to the registry. |
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ machine:
|
||||
|
||||
post:
|
||||
# go
|
||||
- gvm install go1.5.3 --prefer-binary --name=stable
|
||||
- gvm install go1.6 --prefer-binary --name=stable
|
||||
|
||||
environment:
|
||||
# Convenient shortcuts to "common" locations
|
||||
@@ -49,26 +49,30 @@ test:
|
||||
# - gvm use old && go version
|
||||
- gvm use stable && go version
|
||||
|
||||
# Ensure validation of dependencies
|
||||
- gvm use stable && if test -n "`git diff --stat=1000 master | grep -Ei \"vendor|godeps\"`"; then make dep-validate; fi:
|
||||
pwd: $BASE_STABLE
|
||||
|
||||
# First thing: build everything. This will catch compile errors, and it's
|
||||
# also necessary for go vet to work properly (see #807).
|
||||
- gvm use stable && godep go install ./...:
|
||||
- gvm use stable && godep go install $(go list ./... | grep -v "/vendor/"):
|
||||
pwd: $BASE_STABLE
|
||||
|
||||
# FMT
|
||||
- gvm use stable && test -z "$(gofmt -s -l . | grep -v Godeps/_workspace/src/ | tee /dev/stderr)":
|
||||
- gvm use stable && make fmt:
|
||||
pwd: $BASE_STABLE
|
||||
|
||||
# VET
|
||||
- gvm use stable && go vet ./...:
|
||||
- gvm use stable && make vet:
|
||||
pwd: $BASE_STABLE
|
||||
|
||||
# LINT
|
||||
- gvm use stable && test -z "$(golint ./... | grep -v Godeps/_workspace/src/ | tee /dev/stderr)":
|
||||
- gvm use stable && make lint:
|
||||
pwd: $BASE_STABLE
|
||||
|
||||
override:
|
||||
# Test stable, and report
|
||||
- gvm use stable; export ROOT_PACKAGE=$(go list .); go list -tags "$DOCKER_BUILDTAGS" ./... | xargs -L 1 -I{} bash -c 'export PACKAGE={}; godep go test -tags "$DOCKER_BUILDTAGS" -test.short -coverprofile=$GOPATH/src/$PACKAGE/coverage.out -coverpkg=$(./coverpkg.sh $PACKAGE $ROOT_PACKAGE) $PACKAGE':
|
||||
- gvm use stable; export ROOT_PACKAGE=$(go list .); go list -tags "$DOCKER_BUILDTAGS" ./... | grep -v "/vendor/" | xargs -L 1 -I{} bash -c 'export PACKAGE={}; godep go test -tags "$DOCKER_BUILDTAGS" -test.short -coverprofile=$GOPATH/src/$PACKAGE/coverage.out -coverpkg=$(./coverpkg.sh $PACKAGE $ROOT_PACKAGE) $PACKAGE':
|
||||
timeout: 600
|
||||
pwd: $BASE_STABLE
|
||||
|
||||
|
||||
@@ -8,25 +8,17 @@ import (
|
||||
// since that time. If the key is not found, the value returned will be zero.
|
||||
// This is helpful when inferring metrics related to context execution times.
|
||||
func Since(ctx Context, key interface{}) time.Duration {
|
||||
startedAtI := ctx.Value(key)
|
||||
if startedAtI != nil {
|
||||
if startedAt, ok := startedAtI.(time.Time); ok {
|
||||
return time.Since(startedAt)
|
||||
}
|
||||
if startedAt, ok := ctx.Value(key).(time.Time); ok {
|
||||
return time.Since(startedAt)
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
// GetStringValue returns a string value from the context. The empty string
|
||||
// will be returned if not found.
|
||||
func GetStringValue(ctx Context, key interface{}) (value string) {
|
||||
stringi := ctx.Value(key)
|
||||
if stringi != nil {
|
||||
if valuev, ok := stringi.(string); ok {
|
||||
value = valuev
|
||||
}
|
||||
if valuev, ok := ctx.Value(key).(string); ok {
|
||||
value = valuev
|
||||
}
|
||||
|
||||
return value
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
# need to be passed to `go test -coverpkg`: this includes all of the
|
||||
# subpackage's dependencies within the containing package, as well as the
|
||||
# subpackage itself.
|
||||
DEPENDENCIES="$(go list -f $'{{range $f := .Deps}}{{$f}}\n{{end}}' ${1} | grep ${2})"
|
||||
DEPENDENCIES="$(go list -f $'{{range $f := .Deps}}{{$f}}\n{{end}}' ${1} | grep ${2} | grep -v github.com/docker/distribution/vendor)"
|
||||
echo "${1} ${DEPENDENCIES}" | xargs echo -n | tr ' ' ','
|
||||
|
||||
@@ -47,11 +47,19 @@ type PlatformSpec struct {
|
||||
// OS specifies the operating system, for example `linux` or `windows`.
|
||||
OS string `json:"os"`
|
||||
|
||||
// OSVersion is an optional field specifying the operating system
|
||||
// version, for example `10.0.10586`.
|
||||
OSVersion string `json:"os.version,omitempty"`
|
||||
|
||||
// OSFeatures is an optional field specifying an array of strings,
|
||||
// each listing a required OS feature (for example on Windows `win32k`).
|
||||
OSFeatures []string `json:"os.features,omitempty"`
|
||||
|
||||
// Variant is an optional field specifying a variant of the CPU, for
|
||||
// example `ppc64le` to specify a little-endian version of a PowerPC CPU.
|
||||
Variant string `json:"variant,omitempty"`
|
||||
|
||||
// Features is an optional field specifuing an array of strings, each
|
||||
// Features is an optional field specifying an array of strings, each
|
||||
// listing a required CPU feature (for example `sse4` or `aes`).
|
||||
Features []string `json:"features,omitempty"`
|
||||
}
|
||||
|
||||
@@ -55,6 +55,9 @@ func (mb *builder) Build(ctx context.Context) (distribution.Manifest, error) {
|
||||
|
||||
// Add config to the blob store
|
||||
m.Config, err = mb.bs.Put(ctx, MediaTypeConfig, mb.configJSON)
|
||||
// Override MediaType, since Put always replaces the specified media
|
||||
// type with application/octet-stream in the descriptor it returns.
|
||||
m.Config.MediaType = MediaTypeConfig
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -58,6 +58,20 @@ type ManifestServiceOption interface {
|
||||
Apply(ManifestService) error
|
||||
}
|
||||
|
||||
// WithTag allows a tag to be passed into Put
|
||||
func WithTag(tag string) ManifestServiceOption {
|
||||
return WithTagOption{tag}
|
||||
}
|
||||
|
||||
// WithTagOption holds a tag
|
||||
type WithTagOption struct{ Tag string }
|
||||
|
||||
// Apply conforms to the ManifestServiceOption interface
|
||||
func (o WithTagOption) Apply(m ManifestService) error {
|
||||
// no implementation
|
||||
return nil
|
||||
}
|
||||
|
||||
// Repository is a named collection of manifests and layers.
|
||||
type Repository interface {
|
||||
// Named returns the name of the repository.
|
||||
|
||||
@@ -17,33 +17,35 @@ import (
|
||||
// under "/foo/v2/...". Most application will only provide a schema, host and
|
||||
// port, such as "https://localhost:5000/".
|
||||
type URLBuilder struct {
|
||||
root *url.URL // url root (ie http://localhost/)
|
||||
router *mux.Router
|
||||
root *url.URL // url root (ie http://localhost/)
|
||||
router *mux.Router
|
||||
relative bool
|
||||
}
|
||||
|
||||
// NewURLBuilder creates a URLBuilder with provided root url object.
|
||||
func NewURLBuilder(root *url.URL) *URLBuilder {
|
||||
func NewURLBuilder(root *url.URL, relative bool) *URLBuilder {
|
||||
return &URLBuilder{
|
||||
root: root,
|
||||
router: Router(),
|
||||
root: root,
|
||||
router: Router(),
|
||||
relative: relative,
|
||||
}
|
||||
}
|
||||
|
||||
// NewURLBuilderFromString workes identically to NewURLBuilder except it takes
|
||||
// a string argument for the root, returning an error if it is not a valid
|
||||
// url.
|
||||
func NewURLBuilderFromString(root string) (*URLBuilder, error) {
|
||||
func NewURLBuilderFromString(root string, relative bool) (*URLBuilder, error) {
|
||||
u, err := url.Parse(root)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewURLBuilder(u), nil
|
||||
return NewURLBuilder(u, relative), nil
|
||||
}
|
||||
|
||||
// NewURLBuilderFromRequest uses information from an *http.Request to
|
||||
// construct the root url.
|
||||
func NewURLBuilderFromRequest(r *http.Request) *URLBuilder {
|
||||
func NewURLBuilderFromRequest(r *http.Request, relative bool) *URLBuilder {
|
||||
var scheme string
|
||||
|
||||
forwardedProto := r.Header.Get("X-Forwarded-Proto")
|
||||
@@ -85,7 +87,7 @@ func NewURLBuilderFromRequest(r *http.Request) *URLBuilder {
|
||||
u.Path = requestPath[0 : index+1]
|
||||
}
|
||||
|
||||
return NewURLBuilder(u)
|
||||
return NewURLBuilder(u, relative)
|
||||
}
|
||||
|
||||
// BuildBaseURL constructs a base url for the API, typically just "/v2/".
|
||||
@@ -194,12 +196,13 @@ func (ub *URLBuilder) cloneRoute(name string) clonedRoute {
|
||||
*route = *ub.router.GetRoute(name) // clone the route
|
||||
*root = *ub.root
|
||||
|
||||
return clonedRoute{Route: route, root: root}
|
||||
return clonedRoute{Route: route, root: root, relative: ub.relative}
|
||||
}
|
||||
|
||||
type clonedRoute struct {
|
||||
*mux.Route
|
||||
root *url.URL
|
||||
root *url.URL
|
||||
relative bool
|
||||
}
|
||||
|
||||
func (cr clonedRoute) URL(pairs ...string) (*url.URL, error) {
|
||||
@@ -208,6 +211,10 @@ func (cr clonedRoute) URL(pairs ...string) (*url.URL, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if cr.relative {
|
||||
return routeURL, nil
|
||||
}
|
||||
|
||||
if routeURL.Scheme == "" && routeURL.User == nil && routeURL.Host == "" {
|
||||
routeURL.Path = routeURL.Path[1:]
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ func checkHTTPRedirect(req *http.Request, via []*http.Request) error {
|
||||
|
||||
// NewRegistry creates a registry namespace which can be used to get a listing of repositories
|
||||
func NewRegistry(ctx context.Context, baseURL string, transport http.RoundTripper) (Registry, error) {
|
||||
ub, err := v2.NewURLBuilderFromString(baseURL)
|
||||
ub, err := v2.NewURLBuilderFromString(baseURL, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -133,7 +133,7 @@ func (r *registry) Repositories(ctx context.Context, entries []string, last stri
|
||||
|
||||
// NewRepository creates a new Repository for the given repository name and base URL.
|
||||
func NewRepository(ctx context.Context, name reference.Named, baseURL string, transport http.RoundTripper) (distribution.Repository, error) {
|
||||
ub, err := v2.NewURLBuilderFromString(baseURL)
|
||||
ub, err := v2.NewURLBuilderFromString(baseURL, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -402,9 +402,9 @@ func (ms *manifests) Get(ctx context.Context, dgst digest.Digest, options ...dis
|
||||
)
|
||||
|
||||
for _, option := range options {
|
||||
if opt, ok := option.(withTagOption); ok {
|
||||
digestOrTag = opt.tag
|
||||
ref, err = reference.WithTag(ms.name, opt.tag)
|
||||
if opt, ok := option.(distribution.WithTagOption); ok {
|
||||
digestOrTag = opt.Tag
|
||||
ref, err = reference.WithTag(ms.name, opt.Tag)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -465,21 +465,6 @@ func (ms *manifests) Get(ctx context.Context, dgst digest.Digest, options ...dis
|
||||
return nil, HandleErrorResponse(resp)
|
||||
}
|
||||
|
||||
// WithTag allows a tag to be passed into Put which enables the client
|
||||
// to build a correct URL.
|
||||
func WithTag(tag string) distribution.ManifestServiceOption {
|
||||
return withTagOption{tag}
|
||||
}
|
||||
|
||||
type withTagOption struct{ tag string }
|
||||
|
||||
func (o withTagOption) Apply(m distribution.ManifestService) error {
|
||||
if _, ok := m.(*manifests); ok {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("withTagOption is a client-only option")
|
||||
}
|
||||
|
||||
// Put puts a manifest. A tag can be specified using an options parameter which uses some shared state to hold the
|
||||
// tag name in order to build the correct upload URL.
|
||||
func (ms *manifests) Put(ctx context.Context, m distribution.Manifest, options ...distribution.ManifestServiceOption) (digest.Digest, error) {
|
||||
@@ -487,9 +472,9 @@ func (ms *manifests) Put(ctx context.Context, m distribution.Manifest, options .
|
||||
var tagged bool
|
||||
|
||||
for _, option := range options {
|
||||
if opt, ok := option.(withTagOption); ok {
|
||||
if opt, ok := option.(distribution.WithTagOption); ok {
|
||||
var err error
|
||||
ref, err = reference.WithTag(ref, opt.tag)
|
||||
ref, err = reference.WithTag(ref, opt.Tag)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# Changelog
|
||||
|
||||
## 0.7.0-rc.7 (2016-04-22)
|
||||
- Fixes https://github.com/docker/libnetwork/issues/1113
|
||||
- Fixes https://github.com/docker/libnetwork/issues/1069
|
||||
- Fxies https://github.com/docker/libnetwork/issues/1117
|
||||
- Increase the concurrent query rate-limit count.
|
||||
|
||||
## 0.7.0-rc.6 (2016-04-10)
|
||||
- Flush cached resolver socket on default gateway change
|
||||
|
||||
|
||||
@@ -395,9 +395,10 @@ func (n *network) watchMiss(nlSock *nl.NetlinkSocket) {
|
||||
continue
|
||||
}
|
||||
|
||||
if neigh.IP.To16() != nil {
|
||||
if neigh.IP.To4() == nil {
|
||||
continue
|
||||
}
|
||||
logrus.Debugf("miss notification for dest IP, %v", neigh.IP.String())
|
||||
|
||||
if neigh.State&(netlink.NUD_STALE|netlink.NUD_INCOMPLETE) == 0 {
|
||||
continue
|
||||
|
||||
@@ -9,7 +9,6 @@ import (
|
||||
"time"
|
||||
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/docker/libnetwork/iptables"
|
||||
"github.com/docker/libnetwork/netutils"
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
@@ -47,7 +46,7 @@ const (
|
||||
maxExtDNS = 3 //max number of external servers to try
|
||||
extIOTimeout = 4 * time.Second
|
||||
defaultRespSize = 512
|
||||
maxConcurrent = 50
|
||||
maxConcurrent = 100
|
||||
logInterval = 2 * time.Second
|
||||
maxDNSID = 65536
|
||||
)
|
||||
@@ -105,8 +104,6 @@ func (r *resolver) SetupFunc() func() {
|
||||
r.err = fmt.Errorf("error in opening name server socket %v", err)
|
||||
return
|
||||
}
|
||||
laddr := r.conn.LocalAddr()
|
||||
_, ipPort, _ := net.SplitHostPort(laddr.String())
|
||||
|
||||
// Listen on a TCP as well
|
||||
tcpaddr := &net.TCPAddr{
|
||||
@@ -118,21 +115,6 @@ func (r *resolver) SetupFunc() func() {
|
||||
r.err = fmt.Errorf("error in opening name TCP server socket %v", err)
|
||||
return
|
||||
}
|
||||
ltcpaddr := r.tcpListen.Addr()
|
||||
_, tcpPort, _ := net.SplitHostPort(ltcpaddr.String())
|
||||
rules := [][]string{
|
||||
{"-t", "nat", "-A", "OUTPUT", "-d", resolverIP, "-p", "udp", "--dport", dnsPort, "-j", "DNAT", "--to-destination", laddr.String()},
|
||||
{"-t", "nat", "-A", "POSTROUTING", "-s", resolverIP, "-p", "udp", "--sport", ipPort, "-j", "SNAT", "--to-source", ":" + dnsPort},
|
||||
{"-t", "nat", "-A", "OUTPUT", "-d", resolverIP, "-p", "tcp", "--dport", dnsPort, "-j", "DNAT", "--to-destination", ltcpaddr.String()},
|
||||
{"-t", "nat", "-A", "POSTROUTING", "-s", resolverIP, "-p", "tcp", "--sport", tcpPort, "-j", "SNAT", "--to-source", ":" + dnsPort},
|
||||
}
|
||||
|
||||
for _, rule := range rules {
|
||||
r.err = iptables.RawCombinedOutputNative(rule...)
|
||||
if r.err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
r.err = nil
|
||||
})
|
||||
}
|
||||
@@ -142,6 +124,11 @@ func (r *resolver) Start() error {
|
||||
if r.err != nil {
|
||||
return r.err
|
||||
}
|
||||
|
||||
if err := r.setupIPTable(); err != nil {
|
||||
return fmt.Errorf("setting up IP table rules failed: %v", err)
|
||||
}
|
||||
|
||||
s := &dns.Server{Handler: r, PacketConn: r.conn}
|
||||
r.server = s
|
||||
go func() {
|
||||
@@ -305,6 +292,7 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||
extConn net.Conn
|
||||
resp *dns.Msg
|
||||
err error
|
||||
writer dns.ResponseWriter
|
||||
)
|
||||
|
||||
if query == nil || len(query.Question) == 0 {
|
||||
@@ -342,7 +330,9 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||
if resp.Len() > maxSize {
|
||||
truncateResp(resp, maxSize, proto == "tcp")
|
||||
}
|
||||
writer = w
|
||||
} else {
|
||||
queryID := query.Id
|
||||
for i := 0; i < maxExtDNS; i++ {
|
||||
extDNS := &r.extDNSList[i]
|
||||
if extDNS.ipStr == "" {
|
||||
@@ -388,11 +378,11 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||
|
||||
// forwardQueryStart stores required context to mux multiple client queries over
|
||||
// one connection; and limits the number of outstanding concurrent queries.
|
||||
if r.forwardQueryStart(w, query) == false {
|
||||
if r.forwardQueryStart(w, query, queryID) == false {
|
||||
old := r.tStamp
|
||||
r.tStamp = time.Now()
|
||||
if r.tStamp.Sub(old) > logInterval {
|
||||
log.Errorf("More than %v concurrent queries from %s", maxConcurrent, w.LocalAddr().String())
|
||||
log.Errorf("More than %v concurrent queries from %s", maxConcurrent, extConn.LocalAddr().String())
|
||||
}
|
||||
continue
|
||||
}
|
||||
@@ -418,32 +408,33 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||
|
||||
// Retrieves the context for the forwarded query and returns the client connection
|
||||
// to send the reply to
|
||||
w = r.forwardQueryEnd(w, resp)
|
||||
if w == nil {
|
||||
writer = r.forwardQueryEnd(w, resp)
|
||||
if writer == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
resp.Compress = true
|
||||
break
|
||||
}
|
||||
|
||||
if resp == nil || w == nil {
|
||||
if resp == nil || writer == nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
err = w.WriteMsg(resp)
|
||||
if err != nil {
|
||||
if writer == nil {
|
||||
return
|
||||
}
|
||||
if err = writer.WriteMsg(resp); err != nil {
|
||||
log.Errorf("error writing resolver resp, %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *resolver) forwardQueryStart(w dns.ResponseWriter, msg *dns.Msg) bool {
|
||||
func (r *resolver) forwardQueryStart(w dns.ResponseWriter, msg *dns.Msg, queryID uint16) bool {
|
||||
proto := w.LocalAddr().Network()
|
||||
dnsID := uint16(rand.Intn(maxDNSID))
|
||||
|
||||
cc := clientConn{
|
||||
dnsID: msg.Id,
|
||||
dnsID: queryID,
|
||||
respWriter: w,
|
||||
}
|
||||
|
||||
@@ -462,7 +453,7 @@ func (r *resolver) forwardQueryStart(w dns.ResponseWriter, msg *dns.Msg) bool {
|
||||
for ok := true; ok == true; dnsID = uint16(rand.Intn(maxDNSID)) {
|
||||
_, ok = r.client[dnsID]
|
||||
}
|
||||
log.Debugf("client dns id %v, changed id %v", msg.Id, dnsID)
|
||||
log.Debugf("client dns id %v, changed id %v", queryID, dnsID)
|
||||
r.client[dnsID] = cc
|
||||
msg.Id = dnsID
|
||||
default:
|
||||
@@ -497,6 +488,7 @@ func (r *resolver) forwardQueryEnd(w dns.ResponseWriter, msg *dns.Msg) dns.Respo
|
||||
log.Debugf("Can't retrieve client context for dns id %v", msg.Id)
|
||||
return nil
|
||||
}
|
||||
log.Debugf("dns msg id %v, client id %v", msg.Id, cc.dnsID)
|
||||
delete(r.client, msg.Id)
|
||||
msg.Id = cc.dnsID
|
||||
w = cc.respWriter
|
||||
|
||||
77
vendor/src/github.com/docker/libnetwork/resolver_unix.go
vendored
Normal file
77
vendor/src/github.com/docker/libnetwork/resolver_unix.go
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
// +build !windows
|
||||
|
||||
package libnetwork
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"os/exec"
|
||||
"runtime"
|
||||
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/docker/docker/pkg/reexec"
|
||||
"github.com/docker/libnetwork/iptables"
|
||||
"github.com/vishvananda/netns"
|
||||
)
|
||||
|
||||
func init() {
|
||||
reexec.Register("setup-resolver", reexecSetupResolver)
|
||||
}
|
||||
|
||||
func reexecSetupResolver() {
|
||||
runtime.LockOSThread()
|
||||
defer runtime.UnlockOSThread()
|
||||
|
||||
if len(os.Args) < 4 {
|
||||
log.Error("invalid number of arguments..")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
_, ipPort, _ := net.SplitHostPort(os.Args[2])
|
||||
_, tcpPort, _ := net.SplitHostPort(os.Args[3])
|
||||
rules := [][]string{
|
||||
{"-t", "nat", "-A", "OUTPUT", "-d", resolverIP, "-p", "udp", "--dport", dnsPort, "-j", "DNAT", "--to-destination", os.Args[2]},
|
||||
{"-t", "nat", "-A", "POSTROUTING", "-s", resolverIP, "-p", "udp", "--sport", ipPort, "-j", "SNAT", "--to-source", ":" + dnsPort},
|
||||
{"-t", "nat", "-A", "OUTPUT", "-d", resolverIP, "-p", "tcp", "--dport", dnsPort, "-j", "DNAT", "--to-destination", os.Args[3]},
|
||||
{"-t", "nat", "-A", "POSTROUTING", "-s", resolverIP, "-p", "tcp", "--sport", tcpPort, "-j", "SNAT", "--to-source", ":" + dnsPort},
|
||||
}
|
||||
|
||||
f, err := os.OpenFile(os.Args[1], os.O_RDONLY, 0)
|
||||
if err != nil {
|
||||
log.Errorf("failed get network namespace %q: %v", os.Args[1], err)
|
||||
os.Exit(2)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
nsFD := f.Fd()
|
||||
if err = netns.Set(netns.NsHandle(nsFD)); err != nil {
|
||||
log.Errorf("setting into container net ns %v failed, %v", os.Args[1], err)
|
||||
os.Exit(3)
|
||||
}
|
||||
|
||||
for _, rule := range rules {
|
||||
if iptables.RawCombinedOutputNative(rule...) != nil {
|
||||
log.Errorf("setting up rule failed, %v", rule)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (r *resolver) setupIPTable() error {
|
||||
if r.err != nil {
|
||||
return r.err
|
||||
}
|
||||
laddr := r.conn.LocalAddr().String()
|
||||
ltcpaddr := r.tcpListen.Addr().String()
|
||||
|
||||
cmd := &exec.Cmd{
|
||||
Path: reexec.Self(),
|
||||
Args: append([]string{"setup-resolver"}, r.sb.Key(), laddr, ltcpaddr),
|
||||
Stdout: os.Stdout,
|
||||
Stderr: os.Stderr,
|
||||
}
|
||||
if err := cmd.Run(); err != nil {
|
||||
return fmt.Errorf("reexec failed: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
7
vendor/src/github.com/docker/libnetwork/resolver_windows.go
vendored
Normal file
7
vendor/src/github.com/docker/libnetwork/resolver_windows.go
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
// +build windows
|
||||
|
||||
package libnetwork
|
||||
|
||||
func (r *resolver) setupIPTable() error {
|
||||
return nil
|
||||
}
|
||||
@@ -436,6 +436,7 @@ func (sb *sandbox) ResolveName(name string, ipType int) ([]net.IP, bool) {
|
||||
// {a.b in network c.d},
|
||||
// {a in network b.c.d},
|
||||
|
||||
log.Debugf("Name To resolve: %v", name)
|
||||
name = strings.TrimSuffix(name, ".")
|
||||
reqName := []string{name}
|
||||
networkName := []string{""}
|
||||
@@ -456,7 +457,6 @@ func (sb *sandbox) ResolveName(name string, ipType int) ([]net.IP, bool) {
|
||||
|
||||
epList := sb.getConnectedEndpoints()
|
||||
for i := 0; i < len(reqName); i++ {
|
||||
log.Debugf("To resolve: %v in %v", reqName[i], networkName[i])
|
||||
|
||||
// First check for local container alias
|
||||
ip, ipv6Miss := sb.resolveName(reqName[i], networkName[i], epList, true, ipType)
|
||||
|
||||
@@ -49,7 +49,7 @@ type Process struct {
|
||||
|
||||
// ApparmorProfile specified the apparmor profile for the container. (this field is platform dependent)
|
||||
ApparmorProfile string `json:"apparmorProfile,omitempty" platform:"linux"`
|
||||
// SelinuxProcessLabel specifies the selinux context that the container process is run as. (this field is platform dependent)
|
||||
// SelinuxLabel specifies the selinux context that the container process is run as. (this field is platform dependent)
|
||||
SelinuxLabel string `json:"selinuxLabel,omitempty" platform:"linux"`
|
||||
}
|
||||
|
||||
@@ -140,6 +140,8 @@ type Linux struct {
|
||||
MaskedPaths []string `json:"maskedPaths,omitempty"`
|
||||
// ReadonlyPaths sets the provided paths as RO inside the container.
|
||||
ReadonlyPaths []string `json:"readonlyPaths,omitempty"`
|
||||
// MountLabel specifies the selinux context for the mounts in the container.
|
||||
MountLabel string `json:"mountLabel,omitempty"`
|
||||
}
|
||||
|
||||
// Namespace is the configuration for a Linux namespace
|
||||
|
||||
@@ -6,7 +6,7 @@ const (
|
||||
// VersionMajor is for an API incompatible changes
|
||||
VersionMajor = 0
|
||||
// VersionMinor is for functionality in a backwards-compatible manner
|
||||
VersionMinor = 5
|
||||
VersionMinor = 6
|
||||
// VersionPatch is for backwards-compatible bug fixes
|
||||
VersionPatch = 0
|
||||
|
||||
|
||||
@@ -5,9 +5,6 @@ import (
|
||||
"os"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
"github.com/docker/docker/pkg/system"
|
||||
)
|
||||
|
||||
// DefaultDriverName is the driver name used for the driver
|
||||
@@ -79,8 +76,7 @@ func (m *MountPoint) Setup() (string, error) {
|
||||
return "", err
|
||||
}
|
||||
if runtime.GOOS != "windows" { // Windows does not have deprecation issues here
|
||||
logrus.Warnf("Auto-creating non-existent volume host path %s, this is deprecated and will be removed soon", m.Source)
|
||||
if err := system.MkdirAll(m.Source, 0755); err != nil {
|
||||
if err := os.MkdirAll(m.Source, 0755); err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user