// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto2";

package docker.spec;

/**
 * The docker image reference:
 *   [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG|@DIGEST]
 *
 * See more details in:
 * https://github.com/docker/distribution/blob/master/reference/reference.go
 */
message ImageReference {
  // The registry in the following format: 'HOST:PORT'.
  optional string registry = 1;

  // The repository name (e.g., library/busybox, ubuntu).
  required string repository = 2;

  // For example: latest, 2.0.2, etc.
  optional string tag = 3;

  // In the format of 'ALGORITHM:HEX'.
  optional string digest = 4;
}


/**
 * The config structure for docker config file
 * (e.g., ~/.docker/config.json or ~/.dockercfg).
 */
message Config {
  // The base64 encoded 'auth' and 'email' pair in docker
  // config file.
  message Auth {
    optional string auth = 1;
    optional string email = 2;
  }
}
