specs.proto 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. syntax = "proto3";
  2. package docker.swarmkit.v1;
  3. import "types.proto";
  4. import "gogoproto/gogo.proto";
  5. import "duration/duration.proto"; // TODO(stevvooe): use our own until we fix gogoproto/deepcopy
  6. // Specs are container objects for user provided input. All creations and
  7. // updates are done through spec types. As a convention, user input from a spec
  8. // is never touched in created objects. This allows one to verify that the
  9. // users intent has not been modified.
  10. //
  11. // Put differently, spec types can be said to represent the desired state of
  12. // the system. In situations where modifications need to be made to a
  13. // particular component, API objects will either contain a copy of the spec
  14. // component or a different representation to reflect allocation or resolution.
  15. message NodeSpec {
  16. Annotations annotations = 1 [(gogoproto.nullable) = false];
  17. enum Membership {
  18. option (gogoproto.goproto_enum_prefix) = false;
  19. PENDING = 0 [(gogoproto.enumvalue_customname) = "NodeMembershipPending"];
  20. ACCEPTED = 1 [(gogoproto.enumvalue_customname) = "NodeMembershipAccepted"];
  21. }
  22. enum Availability {
  23. option (gogoproto.goproto_enum_prefix) = false;
  24. // Active nodes.
  25. ACTIVE = 0 [(gogoproto.enumvalue_customname) = "NodeAvailabilityActive"];
  26. // Paused nodes won't be considered by the scheduler, preventing any
  27. // further task to run on them.
  28. PAUSE = 1 [(gogoproto.enumvalue_customname) = "NodeAvailabilityPause"];
  29. // Drained nodes are paused and any task already running on them will
  30. // be evicted.
  31. DRAIN = 2 [(gogoproto.enumvalue_customname) = "NodeAvailabilityDrain"];
  32. }
  33. // Role defines the role the node should have.
  34. NodeRole role = 2;
  35. // Membership controls the admission of the node into the cluster.
  36. Membership membership = 3;
  37. // Availability allows a user to control the current scheduling status of a
  38. // node.
  39. Availability availability = 4;
  40. }
  41. // ServiceSpec defines the properties of a service.
  42. //
  43. // A service instructs the cluster in orchestrating repeated instances of a
  44. // template, implemented as tasks. Based on the number of instances, scheduling
  45. // strategy and restart policy, a number of application-level behaviors can be
  46. // defined.
  47. message ServiceSpec {
  48. Annotations annotations = 1 [(gogoproto.nullable) = false];
  49. // Task defines the task template this service will spawn.
  50. TaskSpec task = 2 [(gogoproto.nullable) = false];
  51. oneof mode {
  52. ReplicatedService replicated = 3;
  53. GlobalService global = 4;
  54. }
  55. // UpdateConfig controls the rate and policy of updates.
  56. UpdateConfig update = 6;
  57. repeated NetworkAttachmentConfig networks = 7 [deprecated=true];
  58. // Service endpoint specifies the user provided configuration
  59. // to properly discover and load balance a service.
  60. EndpointSpec endpoint = 8;
  61. }
  62. // ReplicatedService sets the reconciliation target to certain number of replicas.
  63. message ReplicatedService {
  64. uint64 replicas = 1;
  65. }
  66. // GlobalService represents global service.
  67. message GlobalService {
  68. // Empty message for now.
  69. }
  70. message TaskSpec {
  71. oneof runtime {
  72. NetworkAttachmentSpec attachment = 8;
  73. ContainerSpec container = 1;
  74. }
  75. // Resource requirements for the container.
  76. ResourceRequirements resources = 2;
  77. // RestartPolicy specifies what to do when a task fails or finishes.
  78. RestartPolicy restart = 4;
  79. // Placement specifies node selection constraints
  80. Placement placement = 5;
  81. // LogDriver specifies the log driver to use for the task. Any runtime will
  82. // direct logs into the specified driver for the duration of the task.
  83. Driver log_driver = 6;
  84. // Networks specifies the list of network attachment
  85. // configurations (which specify the network and per-network
  86. // aliases) that this task spec is bound to.
  87. repeated NetworkAttachmentConfig networks = 7;
  88. // ForceUpdate is a counter that triggers an update even if no relevant
  89. // parameters have been changed. We do this to allow forced restarts
  90. // using the same reconcilation-based mechanism that performs rolling
  91. // updates.
  92. uint64 force_update = 9;
  93. }
  94. // NetworkAttachmentSpec specifies runtime parameters required to attach
  95. // a container to a network.
  96. message NetworkAttachmentSpec {
  97. // ContainerID spcifies a unique ID of the container for which
  98. // this attachment is for.
  99. string container_id = 1 [(gogoproto.customname) = "ContainerID"];
  100. }
  101. // Container specifies runtime parameters for a container.
  102. message ContainerSpec {
  103. // image defines the image reference, as specified in the
  104. // distribution/reference package. This may include a registry host, name,
  105. // tag or digest.
  106. //
  107. // The field will be directly passed to the engine pulling. Well-behaved
  108. // service definitions will used immutable references, either through tags
  109. // that don't change or verifiable digests.
  110. string image = 1;
  111. // Labels defines labels to be added to the container at creation time. If
  112. // collisions with system labels occur, these labels will be overridden.
  113. //
  114. // This field *must* remain compatible with the Labels field of
  115. // Annotations.
  116. map<string, string> labels = 2;
  117. // Command to run the the container. The first element is a path to the
  118. // executable and the following elements are treated as arguments.
  119. //
  120. // If command is empty, execution will fall back to the image's entrypoint.
  121. //
  122. // Command should only be used when overriding entrypoint.
  123. repeated string command = 3;
  124. // Args specifies arguments provided to the image's entrypoint.
  125. //
  126. // If Command and Args are provided, Args will be appended to Command.
  127. repeated string args = 4;
  128. // Hostname specifies the hostname that will be set on containers created by docker swarm.
  129. // All containers for a given service will have the same hostname
  130. string hostname = 14;
  131. // Env specifies the environment variables for the container in NAME=VALUE
  132. // format. These must be compliant with [IEEE Std
  133. // 1003.1-2001](http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html).
  134. repeated string env = 5;
  135. // Dir defines the working directory to set for the container process.
  136. string dir = 6;
  137. // User specifies the user that should be employed to run the container.
  138. //
  139. // Note that the primary group may be specified by appending the group name
  140. // or id to the user name, separated by a `:`. This syntax is
  141. // `<user>:<group>`.
  142. string user = 7;
  143. // Groups specifies supplementary groups available to the user.
  144. repeated string groups = 11;
  145. // TTY declares that a TTY should be attached to the standard streams,
  146. // including stdin if it is still open.
  147. bool tty = 13 [(gogoproto.customname) = "TTY"];
  148. // OpenStdin declares that the standard input (stdin) should be open.
  149. bool open_stdin = 18;
  150. repeated Mount mounts = 8 [(gogoproto.nullable) = false];
  151. // StopGracePeriod the grace period for stopping the container before
  152. // forcefully killing the container.
  153. Duration stop_grace_period = 9;
  154. // PullOptions allows one to parameterize an image pull.
  155. message PullOptions {
  156. // RegistryAuth is the registry auth token obtained from the client, required
  157. // to pull private images. This is the unmodified JSON used as part of
  158. // the `X-Registry-Auth` header.
  159. // TODO(nishanttotla): This field will later be deprecated
  160. string registry_auth = 64;
  161. }
  162. // PullOptions parameterize the behavior of image pulls.
  163. PullOptions pull_options = 10;
  164. // SecretReference contains references to zero or more secrets that
  165. // will be exposed to the container.
  166. repeated SecretReference secrets = 12;
  167. // Hosts allow additional entries to be specified in /etc/hosts
  168. // that associates IP addresses with hostnames.
  169. // Detailed documentation is available in:
  170. // http://man7.org/linux/man-pages/man5/hosts.5.html
  171. // IP_address canonical_hostname [aliases...]
  172. //
  173. // The format of the Hosts in swarmkit follows the same as
  174. // above.
  175. // This is different from `docker run --add-host <hostname>:<ip>`
  176. // where format is `<hostname>:<ip>`
  177. repeated string hosts = 17;
  178. // DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf)
  179. // Detailed documentation is available in:
  180. // http://man7.org/linux/man-pages/man5/resolv.conf.5.html
  181. // TODO: domain is not supported yet
  182. message DNSConfig {
  183. // Nameservers specifies the IP addresses of the name servers
  184. repeated string nameservers = 1;
  185. // Search specifies the search list for host-name lookup
  186. repeated string search = 2;
  187. // Options allows certain internal resolver variables to be modified
  188. repeated string options = 3;
  189. }
  190. // DNSConfig allows one to specify DNS related configuration in resolv.conf
  191. DNSConfig dns_config = 15 [(gogoproto.customname) = "DNSConfig"];
  192. // Healthcheck describes how to check the container is healthy. If the
  193. // container is considered unhealthy, it will be destroyed, its creating
  194. // task will exit and a new task will be rescheduled elsewhere. A container
  195. // is considered unhealthy after `Retries` number of consecutive failures.
  196. HealthConfig healthcheck = 16;
  197. }
  198. // EndpointSpec defines the properties that can be configured to
  199. // access and loadbalance the service.
  200. message EndpointSpec {
  201. // ResolutionMode specifies the mode of resolution to use for
  202. // internal loadbalancing between tasks which are all within
  203. // the cluster. This is sometimes calles east-west data path.
  204. enum ResolutionMode {
  205. option (gogoproto.goproto_enum_prefix) = false;
  206. // VIP resolution mode specifies that the
  207. // service resolves to a logical IP and the requests
  208. // are sent to that logical IP. Packets hitting that
  209. // logical IP are load balanced to a chosen backend.
  210. VIP = 0 [(gogoproto.enumvalue_customname) = "ResolutionModeVirtualIP"];
  211. // DNSRR resolution mode specifies that the
  212. // service directly gets resolved to one of the
  213. // backend IP and the client directly initiates a
  214. // request towards the actual backend. This requires
  215. // that the client does not cache the DNS responses
  216. // when the DNS response TTL is 0.
  217. DNSRR = 1 [(gogoproto.enumvalue_customname) = "ResolutionModeDNSRoundRobin"];
  218. }
  219. ResolutionMode mode = 1;
  220. // List of exposed ports that this service is accessible from
  221. // external to the cluster.
  222. repeated PortConfig ports = 2;
  223. }
  224. // NetworkSpec specifies user defined network parameters.
  225. message NetworkSpec {
  226. Annotations annotations = 1 [(gogoproto.nullable) = false];
  227. // DriverConfig specific configuration consumed by the network driver.
  228. Driver driver_config = 2;
  229. // IPv6Enabled enables support for IPv6 on the network.
  230. bool ipv6_enabled = 3;
  231. // internal restricts external access to the network. This may be
  232. // accomplished by disabling the default gateway or through other means.
  233. bool internal = 4;
  234. IPAMOptions ipam = 5 [(gogoproto.customname) = "IPAM"];
  235. // Attachable allows external(to swarm) entities to manually
  236. // attach to this network. With this flag enabled, external
  237. // entities such as containers running in an worker node in
  238. // the cluster can manually attach to this network and access
  239. // the services attached to this network. If this flag is not
  240. // enabled(default case) no manual attachment to this network
  241. // can happen.
  242. bool attachable = 6;
  243. }
  244. // ClusterSpec specifies global cluster settings.
  245. message ClusterSpec {
  246. Annotations annotations = 1 [(gogoproto.nullable) = false];
  247. // DEPRECATED: AcceptancePolicy defines the certificate issuance policy.
  248. // Acceptance policy is no longer customizable, and secrets have been
  249. // replaced with join tokens.
  250. AcceptancePolicy acceptance_policy = 2 [deprecated=true, (gogoproto.nullable) = false];
  251. // Orchestration defines cluster-level orchestration settings.
  252. OrchestrationConfig orchestration = 3 [(gogoproto.nullable) = false];
  253. // Raft defines the cluster's raft settings.
  254. RaftConfig raft = 4 [(gogoproto.nullable) = false];
  255. // Dispatcher defines cluster-level dispatcher settings.
  256. DispatcherConfig dispatcher = 5 [(gogoproto.nullable) = false];
  257. // CAConfig defines cluster-level certificate authority settings.
  258. CAConfig ca_config = 6 [(gogoproto.nullable) = false, (gogoproto.customname) = "CAConfig"];
  259. // TaskDefaults specifies the default values to use for task creation.
  260. TaskDefaults task_defaults = 7 [(gogoproto.nullable) = false];
  261. // EncryptionConfig defines the cluster's encryption settings.
  262. EncryptionConfig encryption_config = 8 [(gogoproto.nullable) = false];
  263. }
  264. // SecretSpec specifies a user-provided secret.
  265. message SecretSpec {
  266. Annotations annotations = 1 [(gogoproto.nullable) = false];
  267. // Data is the secret payload - the maximum size is 500KB (that is, 500*1024 bytes)
  268. bytes data = 2;
  269. }