diff --git a/api/services/control.pb.go b/api/services/control.pb.go index 776eb30754b7809e04ae7a50df8e7fa1c21e64d8..cb46112dcde4a93b5c2a931f3ad2f194df0eccba 100644 --- a/api/services/control.pb.go +++ b/api/services/control.pb.go @@ -73,7 +73,9 @@ type BuildRequest struct { // buildStatic is used to hold the options for static build BuildStatic *BuildStatic `protobuf:"bytes,9,opt,name=buildStatic,proto3" json:"buildStatic,omitempty"` // encryptKey is key to encrypt items in buildArgs - EncryptKey string `protobuf:"bytes,10,opt,name=encryptKey,proto3" json:"encryptKey,omitempty"` + EncryptKey string `protobuf:"bytes,10,opt,name=encryptKey,proto3" json:"encryptKey,omitempty"` + // additionalTag is the tag applied to the built image + AdditionalTag string `protobuf:"bytes,11,opt,name=additionalTag,proto3" json:"additionalTag,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -173,6 +175,13 @@ func (m *BuildRequest) GetEncryptKey() string { return "" } +func (m *BuildRequest) GetAdditionalTag() string { + if m != nil { + return m.AdditionalTag + } + return "" +} + type ImportRequest struct { // reference is reference of the import image Reference string `protobuf:"bytes,1,opt,name=reference,proto3" json:"reference,omitempty"` @@ -1080,69 +1089,70 @@ func init() { func init() { proto.RegisterFile("api/services/control.proto", fileDescriptor_d71ef680555cb937) } var fileDescriptor_d71ef680555cb937 = []byte{ - // 986 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0x5b, 0x6f, 0xe3, 0xc4, - 0x17, 0xff, 0x3b, 0x17, 0xa7, 0x3d, 0x4e, 0xb2, 0xd5, 0xfc, 0x51, 0x65, 0xa5, 0x65, 0x37, 0x18, - 0x09, 0x05, 0x90, 0xdc, 0xdd, 0xc0, 0x03, 0x20, 0x2d, 0x52, 0x2f, 0x4b, 0x09, 0x5b, 0xb2, 0xc2, - 0x2d, 0xcb, 0x23, 0x9a, 0x26, 0xd3, 0x74, 0xb4, 0xb6, 0xc7, 0xcc, 0x8c, 0xcb, 0x06, 0xbe, 0x0a, - 0x7c, 0x22, 0xc4, 0x33, 0x5f, 0x07, 0xcd, 0x78, 0x7c, 0x8b, 0x53, 0xba, 0x6f, 0x73, 0x2e, 0x73, - 0xe6, 0x5c, 0x7e, 0xbf, 0x63, 0xc3, 0x08, 0x27, 0xf4, 0x48, 0x10, 0x7e, 0x47, 0x17, 0x44, 0x1c, - 0x2d, 0x58, 0x2c, 0x39, 0x0b, 0xfd, 0x84, 0x33, 0xc9, 0xd0, 0x90, 0x8a, 0x34, 0xc4, 0xfe, 0x75, - 0x4a, 0xc3, 0xa5, 0x7f, 0xf7, 0x6c, 0x74, 0xb0, 0x62, 0x6c, 0x15, 0x92, 0x23, 0x6d, 0xbd, 0x4e, - 0x6f, 0x8e, 0x48, 0x94, 0xc8, 0x75, 0xe6, 0x3c, 0x7a, 0xb2, 0x69, 0x94, 0x34, 0x22, 0x42, 0xe2, - 0x28, 0xc9, 0x1c, 0xbc, 0xbf, 0x5b, 0xd0, 0x3f, 0x51, 0xa1, 0x02, 0xf2, 0x4b, 0x4a, 0x84, 0x44, - 0x87, 0xb0, 0xab, 0x43, 0x5f, 0xad, 0x13, 0xe2, 0x5a, 0x63, 0x6b, 0xb2, 0x1b, 0x94, 0x0a, 0xe4, - 0x42, 0x4f, 0x0b, 0xb3, 0x33, 0xb7, 0xa5, 0x6d, 0xb9, 0x88, 0x1e, 0x03, 0xa8, 0x3c, 0xc9, 0x5b, - 0x79, 0x46, 0xb9, 0xdb, 0xd6, 0xc6, 0x8a, 0x06, 0x8d, 0xc1, 0xb9, 0xa1, 0x21, 0x39, 0x55, 0x9a, - 0x58, 0xba, 0x1d, 0xed, 0x50, 0x55, 0xa1, 0x7d, 0xb0, 0x59, 0x2a, 0x93, 0x54, 0xba, 0x5d, 0x6d, - 0x34, 0x52, 0x91, 0xd1, 0x31, 0x5f, 0x09, 0xd7, 0x1e, 0xb7, 0x8b, 0x8c, 0x94, 0x02, 0xbd, 0x07, - 0xdd, 0x84, 0xb3, 0xb7, 0x6b, 0xb7, 0x37, 0xb6, 0x26, 0x3b, 0x41, 0x26, 0xa8, 0x3c, 0x29, 0x5d, - 0xaa, 0xe8, 0xee, 0x4e, 0x96, 0xa7, 0x11, 0xd1, 0x73, 0x70, 0xf4, 0xe5, 0x4b, 0x89, 0x25, 0x5d, - 0xb8, 0xbb, 0x63, 0x6b, 0xe2, 0x4c, 0x0f, 0xfc, 0x7a, 0x53, 0xfd, 0x93, 0xd2, 0x25, 0xa8, 0xfa, - 0xab, 0x32, 0x49, 0xbc, 0xe0, 0xeb, 0x44, 0xbe, 0x24, 0x6b, 0x17, 0xb2, 0x32, 0x4b, 0x8d, 0x77, - 0x0c, 0x83, 0x59, 0x94, 0x30, 0x2e, 0x2b, 0xfd, 0xe4, 0xe4, 0x86, 0x70, 0x12, 0x2f, 0x8a, 0x7e, - 0x16, 0x0a, 0x84, 0xa0, 0xb3, 0xc4, 0x12, 0xeb, 0x66, 0xf6, 0x03, 0x7d, 0xf6, 0x3e, 0x81, 0x61, - 0x1e, 0x42, 0x24, 0x2c, 0x16, 0xba, 0xeb, 0x34, 0xc2, 0x2b, 0x32, 0x3b, 0x33, 0x11, 0x72, 0xd1, - 0x3b, 0x07, 0xa7, 0x92, 0x2a, 0xfa, 0x22, 0x1f, 0x1e, 0x8d, 0xb2, 0xc7, 0x9c, 0xe9, 0xc8, 0xcf, - 0x20, 0xe0, 0xe7, 0x10, 0xf0, 0xaf, 0x72, 0x08, 0x04, 0xa5, 0xb3, 0xf7, 0x1c, 0x06, 0x06, 0x06, - 0x0f, 0xbd, 0xb9, 0x35, 0xe7, 0x8f, 0x61, 0xa0, 0x52, 0x48, 0x45, 0x5e, 0x76, 0x05, 0x28, 0x56, - 0x0d, 0x28, 0xaa, 0xbc, 0xdc, 0xb5, 0x7c, 0x6a, 0x61, 0x60, 0x61, 0x7c, 0x8d, 0xe8, 0x7d, 0x0a, - 0xce, 0x05, 0x15, 0xd5, 0x5e, 0xea, 0x24, 0xe6, 0x38, 0x2a, 0x7a, 0x59, 0x28, 0xbc, 0xbf, 0x2c, - 0xe8, 0x67, 0xde, 0x26, 0xee, 0xd7, 0x60, 0x6b, 0xab, 0x70, 0xad, 0x71, 0x7b, 0xe2, 0x4c, 0x3f, - 0xda, 0x9c, 0x72, 0xd5, 0xdb, 0x9f, 0xe9, 0xf2, 0xe2, 0x1b, 0x16, 0x98, 0x5b, 0xa3, 0xdf, 0x61, - 0xb7, 0x50, 0xaa, 0xc1, 0x73, 0x92, 0x30, 0x41, 0x25, 0xe3, 0x6b, 0xf3, 0x78, 0x45, 0x83, 0xf6, - 0xa0, 0x2d, 0xf1, 0xca, 0xb0, 0x42, 0x1d, 0xd1, 0x10, 0x5a, 0x74, 0x69, 0x98, 0xd0, 0xa2, 0x4b, - 0x5d, 0x26, 0x27, 0x58, 0x92, 0xa5, 0x41, 0x7f, 0x2e, 0xaa, 0x8e, 0x0a, 0xfa, 0x1b, 0x31, 0xb8, - 0xd7, 0x67, 0xef, 0x4f, 0x0b, 0x1e, 0xbd, 0x26, 0x5c, 0x50, 0x16, 0x57, 0x1b, 0x75, 0x97, 0xa9, - 0xf2, 0x46, 0x19, 0x51, 0x75, 0x66, 0xc5, 0x8c, 0xbb, 0xc9, 0xa1, 0x54, 0x68, 0x2b, 0x95, 0xa7, - 0x2c, 0x8a, 0xa8, 0x34, 0x09, 0x95, 0x8a, 0x92, 0xf1, 0x0a, 0x34, 0x9d, 0x2a, 0xe3, 0x69, 0x44, - 0x34, 0x2b, 0xc5, 0x31, 0x5f, 0xdc, 0x16, 0xac, 0xd4, 0x92, 0xf7, 0x03, 0x0c, 0x02, 0x12, 0xb1, - 0x3b, 0x52, 0x99, 0x78, 0x09, 0x98, 0x76, 0x15, 0x30, 0x7b, 0xd0, 0xc6, 0x61, 0xa8, 0xd3, 0xda, - 0x09, 0xd4, 0x31, 0x23, 0x6d, 0x1a, 0x13, 0x9d, 0x8c, 0x26, 0x6d, 0x1a, 0x13, 0xef, 0x73, 0x18, - 0xe6, 0x21, 0x4d, 0xc1, 0x1e, 0xf4, 0x43, 0xbc, 0x26, 0xfc, 0x7b, 0x22, 0x04, 0x5e, 0xe5, 0x33, - 0xaf, 0xe9, 0xbc, 0x3f, 0x2c, 0xf8, 0xff, 0xb7, 0x04, 0x87, 0xf2, 0xf6, 0xf4, 0x96, 0x2c, 0xde, - 0x14, 0x77, 0x67, 0x60, 0x0b, 0x8d, 0x33, 0x7d, 0x6b, 0x38, 0x7d, 0xb6, 0x39, 0xfd, 0x2d, 0x97, - 0xfc, 0x4b, 0xb5, 0x73, 0xe3, 0x95, 0x01, 0xa8, 0x09, 0xe0, 0x7d, 0x05, 0x83, 0x9a, 0x01, 0x39, - 0xd0, 0xfb, 0x71, 0xfe, 0x72, 0xfe, 0xea, 0xa7, 0xf9, 0xde, 0xff, 0x94, 0x70, 0xf9, 0x22, 0x78, - 0x3d, 0x9b, 0x9f, 0xef, 0x59, 0xe8, 0x11, 0x38, 0xf3, 0x57, 0x57, 0x3f, 0xe7, 0x8a, 0x96, 0x97, - 0x40, 0xff, 0x82, 0xad, 0x68, 0x9c, 0xb7, 0x69, 0x1f, 0x6c, 0xb5, 0xd8, 0x09, 0x37, 0xc5, 0x18, - 0x09, 0x8d, 0x60, 0x27, 0x15, 0x84, 0xc7, 0x0a, 0xda, 0xd9, 0x00, 0x0b, 0x59, 0xd9, 0x12, 0x2c, - 0xc4, 0xaf, 0x8c, 0xe7, 0x78, 0x2a, 0x64, 0xd5, 0xdc, 0x37, 0x64, 0x6d, 0xe6, 0xa6, 0x8e, 0x8a, - 0x8b, 0xe6, 0xc5, 0x07, 0xf9, 0xf5, 0xa5, 0x76, 0x65, 0xa9, 0x7c, 0x28, 0xbb, 0xc6, 0x08, 0xbd, - 0x09, 0x0c, 0xf3, 0xab, 0xe6, 0x99, 0x7d, 0xb0, 0x39, 0x11, 0x69, 0x98, 0xbf, 0x62, 0x24, 0xef, - 0x03, 0x70, 0x2e, 0x18, 0x2e, 0x3e, 0x30, 0x08, 0x3a, 0x09, 0x96, 0xb7, 0xc6, 0x49, 0x9f, 0xbd, - 0x89, 0x6a, 0x12, 0x7e, 0x87, 0xe5, 0x33, 0xfd, 0xa7, 0x0b, 0xbd, 0xd3, 0xec, 0x7b, 0x88, 0xbe, - 0x81, 0xae, 0xde, 0x59, 0xe8, 0x70, 0xeb, 0xfa, 0x36, 0x0f, 0x8e, 0xde, 0xbf, 0xc7, 0x9a, 0xbd, - 0xf5, 0xd4, 0x52, 0x48, 0x31, 0x73, 0x6d, 0xb8, 0xd6, 0x96, 0xda, 0xe8, 0xf1, 0x7d, 0xe6, 0x22, - 0xd4, 0x31, 0x74, 0xd4, 0x52, 0x41, 0x07, 0xdb, 0x57, 0x4d, 0x16, 0xe6, 0xf0, 0xbf, 0xf6, 0x10, - 0x3a, 0x81, 0x5e, 0xce, 0xdb, 0xfd, 0xc6, 0xee, 0x7e, 0xa1, 0xbe, 0xed, 0xa3, 0x27, 0x9b, 0x01, - 0x36, 0x17, 0xc5, 0x0c, 0xec, 0x8c, 0x49, 0xcd, 0x8a, 0x6a, 0xa4, 0x6d, 0x56, 0x54, 0x27, 0xe0, - 0x53, 0x0b, 0x7d, 0x07, 0x4e, 0x85, 0x28, 0xf7, 0xa6, 0xf4, 0xe1, 0x3b, 0xb0, 0x0b, 0x9d, 0x41, - 0x57, 0x23, 0xb3, 0x39, 0xb0, 0x2a, 0x45, 0x9a, 0x03, 0xab, 0xc3, 0xf9, 0x1c, 0xec, 0x0c, 0x79, - 0x68, 0x9b, 0x63, 0x09, 0xe6, 0x66, 0x71, 0x1b, 0x80, 0x55, 0xc3, 0x62, 0x78, 0xb9, 0x65, 0x58, - 0x25, 0x5c, 0xb7, 0x0c, 0xab, 0x0a, 0xd4, 0x19, 0xd8, 0xd9, 0xb7, 0xba, 0x99, 0x4b, 0xed, 0x37, - 0xa0, 0x99, 0x4b, 0xfd, 0x13, 0x3f, 0xb1, 0xae, 0x6d, 0xdd, 0xd1, 0xcf, 0xfe, 0x0d, 0x00, 0x00, - 0xff, 0xff, 0xeb, 0x46, 0x9c, 0xd1, 0xfc, 0x09, 0x00, 0x00, + // 1005 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0xeb, 0x6e, 0xe3, 0x44, + 0x14, 0xc6, 0x4d, 0xe3, 0xb4, 0xc7, 0x49, 0xb6, 0x1a, 0x50, 0x65, 0x65, 0xcb, 0x6e, 0x30, 0x08, + 0x05, 0x90, 0xdc, 0xdd, 0xc0, 0x0f, 0x40, 0x5a, 0xa4, 0x5e, 0x96, 0x12, 0xb6, 0x64, 0x85, 0x5b, + 0x96, 0x9f, 0x68, 0x9a, 0x4c, 0xdd, 0xd1, 0xda, 0x1e, 0x33, 0x33, 0x2e, 0x1b, 0x78, 0x15, 0x78, + 0x22, 0x1e, 0x80, 0x07, 0xe1, 0x05, 0xd0, 0x8c, 0xc7, 0xb7, 0x38, 0xa5, 0xfb, 0x6f, 0xce, 0x65, + 0xce, 0x9c, 0xcb, 0xf7, 0x1d, 0x1b, 0x46, 0x38, 0xa5, 0x87, 0x82, 0xf0, 0x5b, 0xba, 0x20, 0xe2, + 0x70, 0xc1, 0x12, 0xc9, 0x59, 0xe4, 0xa7, 0x9c, 0x49, 0x86, 0x86, 0x54, 0x64, 0x11, 0xf6, 0xaf, + 0x32, 0x1a, 0x2d, 0xfd, 0xdb, 0xa7, 0xa3, 0x87, 0x21, 0x63, 0x61, 0x44, 0x0e, 0xb5, 0xf5, 0x2a, + 0xbb, 0x3e, 0x24, 0x71, 0x2a, 0x57, 0xb9, 0xf3, 0xe8, 0xf1, 0xba, 0x51, 0xd2, 0x98, 0x08, 0x89, + 0xe3, 0x34, 0x77, 0xf0, 0xfe, 0xdd, 0x82, 0xfe, 0xb1, 0x0a, 0x15, 0x90, 0x5f, 0x33, 0x22, 0x24, + 0x3a, 0x80, 0x5d, 0x1d, 0xfa, 0x72, 0x95, 0x12, 0xd7, 0x1a, 0x5b, 0x93, 0xdd, 0xa0, 0x52, 0x20, + 0x17, 0x7a, 0x5a, 0x98, 0x9d, 0xba, 0x5b, 0xda, 0x56, 0x88, 0xe8, 0x11, 0x80, 0xca, 0x93, 0xbc, + 0x91, 0xa7, 0x94, 0xbb, 0x1d, 0x6d, 0xac, 0x69, 0xd0, 0x18, 0x9c, 0x6b, 0x1a, 0x91, 0x13, 0xa5, + 0x49, 0xa4, 0xbb, 0xad, 0x1d, 0xea, 0x2a, 0xb4, 0x0f, 0x36, 0xcb, 0x64, 0x9a, 0x49, 0xb7, 0xab, + 0x8d, 0x46, 0x2a, 0x33, 0x3a, 0xe2, 0xa1, 0x70, 0xed, 0x71, 0xa7, 0xcc, 0x48, 0x29, 0xd0, 0x7b, + 0xd0, 0x4d, 0x39, 0x7b, 0xb3, 0x72, 0x7b, 0x63, 0x6b, 0xb2, 0x13, 0xe4, 0x82, 0xca, 0x93, 0xd2, + 0xa5, 0x8a, 0xee, 0xee, 0xe4, 0x79, 0x1a, 0x11, 0x3d, 0x03, 0x47, 0x5f, 0xbe, 0x90, 0x58, 0xd2, + 0x85, 0xbb, 0x3b, 0xb6, 0x26, 0xce, 0xf4, 0xa1, 0xdf, 0x6c, 0xaa, 0x7f, 0x5c, 0xb9, 0x04, 0x75, + 0x7f, 0x55, 0x26, 0x49, 0x16, 0x7c, 0x95, 0xca, 0x17, 0x64, 0xe5, 0x42, 0x5e, 0x66, 0xa5, 0x41, + 0x1f, 0xc1, 0x00, 0x2f, 0x97, 0x54, 0x52, 0x96, 0xe0, 0xe8, 0x12, 0x87, 0xae, 0xa3, 0x5d, 0x9a, + 0x4a, 0xef, 0x08, 0x06, 0xb3, 0x38, 0x65, 0x5c, 0xd6, 0xba, 0xce, 0xc9, 0x35, 0xe1, 0x24, 0x59, + 0x94, 0x5d, 0x2f, 0x15, 0x08, 0xc1, 0xf6, 0x12, 0x4b, 0xac, 0x5b, 0xde, 0x0f, 0xf4, 0xd9, 0xfb, + 0x14, 0x86, 0x45, 0x08, 0x91, 0xb2, 0x44, 0xe8, 0xd9, 0xd0, 0x18, 0x87, 0x64, 0x76, 0x6a, 0x22, + 0x14, 0xa2, 0x77, 0x06, 0x4e, 0xad, 0x20, 0xf4, 0x65, 0x31, 0x62, 0x1a, 0xe7, 0x8f, 0x39, 0xd3, + 0x91, 0x9f, 0x03, 0xc5, 0x2f, 0x80, 0xe2, 0x5f, 0x16, 0x40, 0x09, 0x2a, 0x67, 0xef, 0x19, 0x0c, + 0x0c, 0x58, 0xee, 0x7b, 0x73, 0x63, 0xce, 0x9f, 0xc0, 0x40, 0xa5, 0x90, 0x89, 0xa2, 0xec, 0x1a, + 0x9c, 0xac, 0x06, 0x9c, 0x54, 0x79, 0x85, 0x6b, 0xf5, 0xd4, 0xc2, 0x80, 0xc7, 0xf8, 0x1a, 0xd1, + 0xfb, 0x0c, 0x9c, 0x73, 0x2a, 0xea, 0xbd, 0xd4, 0x49, 0xcc, 0x71, 0x5c, 0xf6, 0xb2, 0x54, 0x78, + 0x7f, 0x5b, 0xd0, 0xcf, 0xbd, 0x4d, 0xdc, 0x6f, 0xc0, 0xd6, 0x56, 0xe1, 0x5a, 0xe3, 0xce, 0xc4, + 0x99, 0x7e, 0xbc, 0x8e, 0x85, 0xba, 0xb7, 0x3f, 0xd3, 0xe5, 0x25, 0xd7, 0x2c, 0x30, 0xb7, 0x46, + 0x7f, 0xc0, 0x6e, 0xa9, 0x54, 0xf0, 0xe0, 0x24, 0x65, 0x82, 0x4a, 0xc6, 0x57, 0xe6, 0xf1, 0x9a, + 0x06, 0xed, 0x41, 0x47, 0xe2, 0xd0, 0x70, 0x47, 0x1d, 0xd1, 0x10, 0xb6, 0xe8, 0xd2, 0xf0, 0x65, + 0x8b, 0x2e, 0x75, 0x99, 0x9c, 0x60, 0x49, 0x96, 0x86, 0x23, 0x85, 0xa8, 0x3a, 0x2a, 0xe8, 0xef, + 0xc4, 0xb0, 0x43, 0x9f, 0xbd, 0xbf, 0x2c, 0x78, 0xf0, 0x8a, 0x70, 0x41, 0x59, 0x52, 0x6f, 0xd4, + 0x6d, 0xae, 0x2a, 0x1a, 0x65, 0x44, 0xd5, 0x99, 0x90, 0x19, 0x77, 0x93, 0x43, 0xa5, 0xd0, 0x56, + 0x2a, 0x4f, 0x58, 0x1c, 0x53, 0x69, 0x12, 0xaa, 0x14, 0xd5, 0x5e, 0x50, 0xa0, 0xd9, 0xae, 0xef, + 0x05, 0x1a, 0x13, 0xcd, 0x5d, 0x71, 0xc4, 0x17, 0x37, 0x25, 0x77, 0xb5, 0xe4, 0xfd, 0x08, 0x83, + 0x80, 0xc4, 0xec, 0x96, 0xd4, 0x26, 0x5e, 0x01, 0xa6, 0x53, 0x07, 0xcc, 0x1e, 0x74, 0x70, 0x14, + 0xe9, 0xb4, 0x76, 0x02, 0x75, 0xcc, 0xa9, 0x9d, 0x25, 0x44, 0x27, 0xa3, 0xa9, 0x9d, 0x25, 0xc4, + 0xfb, 0x02, 0x86, 0x45, 0x48, 0x53, 0xb0, 0x07, 0xfd, 0x08, 0xaf, 0x08, 0xff, 0x81, 0x08, 0x81, + 0xc3, 0x62, 0xe6, 0x0d, 0x9d, 0xf7, 0xa7, 0x05, 0xef, 0x7e, 0x47, 0x70, 0x24, 0x6f, 0x4e, 0x6e, + 0xc8, 0xe2, 0x75, 0x79, 0x77, 0x06, 0xb6, 0xd0, 0x38, 0xd3, 0xb7, 0x86, 0xd3, 0xa7, 0xeb, 0xd3, + 0xdf, 0x70, 0xc9, 0xbf, 0x50, 0x9b, 0x39, 0x09, 0x0d, 0x40, 0x4d, 0x00, 0xef, 0x6b, 0x18, 0x34, + 0x0c, 0xc8, 0x81, 0xde, 0x4f, 0xf3, 0x17, 0xf3, 0x97, 0x3f, 0xcf, 0xf7, 0xde, 0x51, 0xc2, 0xc5, + 0xf3, 0xe0, 0xd5, 0x6c, 0x7e, 0xb6, 0x67, 0xa1, 0x07, 0xe0, 0xcc, 0x5f, 0x5e, 0xfe, 0x52, 0x28, + 0xb6, 0xbc, 0x14, 0xfa, 0xe7, 0x2c, 0xa4, 0x49, 0xd1, 0xa6, 0x7d, 0xb0, 0xd5, 0xfa, 0x27, 0xdc, + 0x14, 0x63, 0x24, 0x34, 0x82, 0x9d, 0x4c, 0x10, 0x9e, 0x28, 0x68, 0xe7, 0x03, 0x2c, 0x65, 0x65, + 0x4b, 0xb1, 0x10, 0xbf, 0x31, 0x5e, 0xe0, 0xa9, 0x94, 0x55, 0x73, 0x5f, 0x93, 0x95, 0x99, 0x9b, + 0x3a, 0x2a, 0x2e, 0x9a, 0x17, 0xef, 0xe5, 0xd7, 0x57, 0xda, 0x95, 0x65, 0xf2, 0xbe, 0xec, 0x5a, + 0x23, 0xf4, 0x26, 0x30, 0x2c, 0xae, 0x9a, 0x67, 0xf6, 0xc1, 0xe6, 0x44, 0x64, 0x51, 0xf1, 0x8a, + 0x91, 0xbc, 0x0f, 0xc0, 0x39, 0x67, 0xb8, 0xfc, 0x0c, 0x21, 0xd8, 0x4e, 0xb1, 0xbc, 0x31, 0x4e, + 0xfa, 0xec, 0x4d, 0x54, 0x93, 0xf0, 0x5b, 0x2c, 0x9f, 0xe9, 0x3f, 0x5d, 0xe8, 0x9d, 0xe4, 0x5f, + 0x4d, 0xf4, 0x2d, 0x74, 0xf5, 0xce, 0x42, 0x07, 0x1b, 0x97, 0xbc, 0x79, 0x70, 0xf4, 0xfe, 0x1d, + 0xd6, 0xfc, 0xad, 0x27, 0x96, 0x42, 0x8a, 0x99, 0x6b, 0xcb, 0xb5, 0xb1, 0xd4, 0x46, 0x8f, 0xee, + 0x32, 0x97, 0xa1, 0x8e, 0x60, 0x5b, 0x2d, 0x15, 0xf4, 0x70, 0xf3, 0xaa, 0xc9, 0xc3, 0x1c, 0xfc, + 0xdf, 0x1e, 0x42, 0xc7, 0xd0, 0x2b, 0x78, 0xbb, 0xdf, 0xda, 0xdd, 0xcf, 0xd5, 0x1f, 0xc0, 0xe8, + 0xf1, 0x7a, 0x80, 0xf5, 0x45, 0x31, 0x03, 0x3b, 0x67, 0x52, 0xbb, 0xa2, 0x06, 0x69, 0xdb, 0x15, + 0x35, 0x09, 0xf8, 0xc4, 0x42, 0xdf, 0x83, 0x53, 0x23, 0xca, 0x9d, 0x29, 0x7d, 0xf8, 0x16, 0xec, + 0x42, 0xa7, 0xd0, 0xd5, 0xc8, 0x6c, 0x0f, 0xac, 0x4e, 0x91, 0xf6, 0xc0, 0x9a, 0x70, 0x3e, 0x03, + 0x3b, 0x47, 0x1e, 0xda, 0xe4, 0x58, 0x81, 0xb9, 0x5d, 0xdc, 0x1a, 0x60, 0xd5, 0xb0, 0x18, 0x5e, + 0x6e, 0x18, 0x56, 0x05, 0xd7, 0x0d, 0xc3, 0xaa, 0x03, 0x75, 0x06, 0x76, 0xfe, 0xad, 0x6e, 0xe7, + 0xd2, 0xf8, 0x0d, 0x68, 0xe7, 0xd2, 0xfc, 0xc4, 0x4f, 0xac, 0x2b, 0x5b, 0x77, 0xf4, 0xf3, 0xff, + 0x02, 0x00, 0x00, 0xff, 0xff, 0xdb, 0x22, 0xc1, 0x44, 0x22, 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/api/services/control.proto b/api/services/control.proto index 0efad956aa981fbc4c2d011bae585a294c986235..05e8e85a5fbb6371e8f4e03a3ec7310a5a7c69a4 100644 --- a/api/services/control.proto +++ b/api/services/control.proto @@ -61,6 +61,8 @@ message BuildRequest { BuildStatic buildStatic = 9; // encryptKey is key to encrypt items in buildArgs string encryptKey = 10; + // additionalTag is the tag applied to the built image + string additionalTag = 11; } message ImportRequest { diff --git a/builder/dockerfile/builder.go b/builder/dockerfile/builder.go index 68a21588675bbb0b578d2b7ea46c2f675d3a3288..af522890250f88d4eb662bc14bd81c1eb4b07250 100644 --- a/builder/dockerfile/builder.go +++ b/builder/dockerfile/builder.go @@ -26,6 +26,7 @@ import ( "strings" "time" + "github.com/containers/image/v5/docker/reference" "github.com/opencontainers/go-digest" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -43,13 +44,14 @@ import ( // BuildOptions is the option for build an image type BuildOptions struct { - BuildArgs map[string]string - ContextDir string - File string - Iidfile string - Output []string - ProxyFlag bool - Tag string + BuildArgs map[string]string + ContextDir string + File string + Iidfile string + Output []string + ProxyFlag bool + Tag string + AdditionalTag string } // Builder is the object to build a Dockerfile @@ -104,14 +106,8 @@ func NewBuilder(ctx context.Context, store store.Store, req *pb.BuildRequest, ru Iidfile: req.GetIidfile(), } b.parseStaticBuildOpts(req) - - tag := parseTag(req.Output) - if tag != "" { - candidates, _, rerr := image.ResolveName(tag, nil, b.localStore) - if rerr != nil || len(candidates) == 0 { - return nil, errors.Wrapf(rerr, "parse target tag %v err", tag) - } - b.buildOpts.Tag = candidates[0] + if err = b.parseTag(req.Output, req.AdditionalTag); err != nil { + return nil, err } // prepare workdirs for dockerfile builder @@ -137,6 +133,23 @@ func NewBuilder(ctx context.Context, store store.Store, req *pb.BuildRequest, ru return b, nil } +func (b *Builder) parseTag(output, additionalTag string) error { + var err error + if tag := parseOutputTag(output); tag != "" { + if b.buildOpts.Tag, err = expandTag(tag, b.localStore); err != nil { + return err + } + } + + if additionalTag != "" { + if b.buildOpts.AdditionalTag, err = expandTag(additionalTag, b.localStore); err != nil { + return err + } + } + + return nil +} + func (b *Builder) parseOutput(output string) error { var ( pipeWrapper *exporter.PipeWrapper @@ -458,11 +471,10 @@ func (b *Builder) cleanup() { func (b *Builder) export(imageID string) error { exportTimer := b.cliLog.StartTimer("EXPORT") - if b.buildOpts.Tag != "" { - if serr := b.localStore.SetNames(imageID, []string{b.buildOpts.Tag}); serr != nil { - return errors.Wrap(serr, "set tag for image error") - } + if err := b.applyTag(imageID); err != nil { + return err } + var retErr error for _, o := range b.buildOpts.Output { exOpts := exporter.ExportOptions{ @@ -482,6 +494,24 @@ func (b *Builder) export(imageID string) error { return retErr } +func (b *Builder) applyTag(imageID string) error { + tags := make([]string, 0, 0) + if b.buildOpts.Tag != "" { + tags = append(tags, b.buildOpts.Tag) + } + if b.buildOpts.AdditionalTag != "" { + tags = append(tags, b.buildOpts.AdditionalTag) + } + + if len(tags) > 0 { + if serr := b.localStore.SetNames(imageID, tags); serr != nil { + return errors.Wrapf(serr, "set tags %v for image %v error", tags, imageID) + } + } + + return nil +} + func (b *Builder) writeImageID(imageID string) error { if b.buildOpts.Iidfile != "" { if err := ioutil.WriteFile(b.buildOpts.Iidfile, []byte(imageID), constant.DefaultRootFileMode); err != nil { @@ -517,7 +547,7 @@ func (b *Builder) OutputPipeWrapper() *exporter.PipeWrapper { return b.pipeWrapper } -func parseTag(output string) string { +func parseOutputTag(output string) string { outputFields := strings.Split(output, ":") const archiveOutputWithoutTagLen = 2 @@ -526,9 +556,6 @@ func parseTag(output string) string { case (outputFields[0] == "docker-daemon" || outputFields[0] == "isulad") && len(outputFields) > 1: tag = strings.Join(outputFields[1:], ":") case outputFields[0] == "docker-archive" && len(outputFields) > archiveOutputWithoutTagLen: - if len(outputFields[archiveOutputWithoutTagLen:]) == 1 { - outputFields = append(outputFields, "latest") - } tag = strings.Join(outputFields[archiveOutputWithoutTagLen:], ":") case outputFields[0] == "docker" && len(outputFields) > 1: repoAndTag := strings.Join(outputFields[1:], ":") @@ -538,10 +565,24 @@ func parseTag(output string) string { return "" } tag = repoAndTag[len(repo):] - if len(strings.Split(tag, ":")) == 1 { - tag += ":latest" - } } return tag } + +// expandTag resolves tag name, if it not include a domain, "localhost" will be +// added, and if it not include a tag, "latest" will be added. +func expandTag(tag string, store store.Store) (string, error) { + candidates, _, err := image.ResolveName(tag, nil, store) + if err != nil || len(candidates) == 0 { + return "", errors.Errorf("resolve tag %v err: %v", tag, err) + } + + tagNamed, err := reference.ParseNormalizedNamed(candidates[0]) + if err != nil { + return "", errors.Wrapf(err, "parse tag %v err", candidates[0]) + } + tagNamed = reference.TagNameOnly(tagNamed) + + return tagNamed.String(), nil +} diff --git a/builder/dockerfile/builder_test.go b/builder/dockerfile/builder_test.go index 12dfeb14c9cef3d5b822f0498d9ae836dc3721d8..a54401258678f2184fd88165a835342940db278e 100644 --- a/builder/dockerfile/builder_test.go +++ b/builder/dockerfile/builder_test.go @@ -1288,7 +1288,7 @@ func TestParseTag(t *testing.T) { { name: "docker-archive output only with name", output: "docker-archive:./isula.tar:isula", - tag: "isula:latest", + tag: "isula", }, { name: "docker output", @@ -1298,7 +1298,7 @@ func TestParseTag(t *testing.T) { { name: "docker output", output: "docker://localhost:5000/isula/test", - tag: "isula/test:latest", + tag: "isula/test", }, { name: "invalid docker output", @@ -1307,7 +1307,7 @@ func TestParseTag(t *testing.T) { }, } for _, tc := range testcases { - tag := parseTag(tc.output) + tag := parseOutputTag(tc.output) assert.Equal(t, tag, tc.tag, tc.name) } } diff --git a/cmd/cli/build.go b/cmd/cli/build.go index 5f4448e945b67f3d4a6ad2a74d0eb63169e44562..d1339bb27e70134bbda7297e6c19fe1a83637906 100644 --- a/cmd/cli/build.go +++ b/cmd/cli/build.go @@ -41,15 +41,16 @@ import ( ) type buildOptions struct { - file string - output string - buildArgs []string - encryptKey string - contextDir string - buildID string - proxyFlag bool - buildStatic opts.ListOpts - imageIDFile string + file string + output string + buildArgs []string + encryptKey string + contextDir string + buildID string + proxyFlag bool + buildStatic opts.ListOpts + imageIDFile string + additionalTag string } type staticBuildMode string @@ -106,6 +107,7 @@ func NewBuildCmd() *cobra.Command { buildCmd.PersistentFlags().VarP(&buildOpts.buildStatic, "build-static", "", "Static build with the given option") buildCmd.PersistentFlags().StringArrayVar(&buildOpts.buildArgs, "build-arg", []string{}, "Arguments used during build time") buildCmd.PersistentFlags().StringVar(&buildOpts.imageIDFile, "iidfile", "", "Write image ID to the file") + buildCmd.PersistentFlags().StringVarP(&buildOpts.additionalTag, "tag", "", "", "Add tag to the built image") return buildCmd } @@ -277,16 +279,17 @@ func runBuild(ctx context.Context, cli Cli) (string, error) { } budStream, err := cli.Client().Build(ctx, &pb.BuildRequest{ - BuildType: constant.BuildContainerImageType, - BuildID: buildOpts.buildID, - BuildArgs: buildOpts.buildArgs, - EncryptKey: buildOpts.encryptKey, - ContextDir: buildOpts.contextDir, - FileContent: content, - Output: buildOpts.output, - Proxy: buildOpts.proxyFlag, - BuildStatic: buildStatic, - Iidfile: buildOpts.imageIDFile, + BuildType: constant.BuildContainerImageType, + BuildID: buildOpts.buildID, + BuildArgs: buildOpts.buildArgs, + EncryptKey: buildOpts.encryptKey, + ContextDir: buildOpts.contextDir, + FileContent: content, + Output: buildOpts.output, + Proxy: buildOpts.proxyFlag, + BuildStatic: buildStatic, + Iidfile: buildOpts.imageIDFile, + AdditionalTag: buildOpts.additionalTag, }) if err != nil { return "", err diff --git a/daemon/images.go b/daemon/images.go index 137378ffb4b9a38d84b3ddc46efcda71b0941507..cb2a00c8688239fd82af15d5e17d85bc3dbed8cd 100644 --- a/daemon/images.go +++ b/daemon/images.go @@ -39,10 +39,10 @@ func (b *Backend) List(ctx context.Context, req *pb.ListRequest) (*pb.ListRespon imageName := req.ImageName reqRepository, reqTag := imageName, "" - const imageFieldLen = 2 - parts := strings.SplitN(imageName, ":", imageFieldLen) - if len(parts) == imageFieldLen { - reqRepository, reqTag = parts[0], parts[1] + const minImageFieldLenWithTag = 2 + parts := strings.Split(imageName, ":") + if len(parts) >= minImageFieldLenWithTag { + reqRepository, reqTag = strings.Join(parts[0:len(parts)-1], ":"), parts[len(parts)-1] } images, err := b.daemon.localStore.Images() @@ -58,9 +58,9 @@ func (b *Backend) List(ctx context.Context, req *pb.ListRequest) (*pb.ListRespon } for _, name := range names { repository, tag := name, none - parts := strings.SplitN(name, ":", imageFieldLen) - if len(parts) == imageFieldLen { - repository, tag = parts[0], parts[1] + parts := strings.Split(name, ":") + if len(parts) >= minImageFieldLenWithTag { + repository, tag = strings.Join(parts[0:len(parts)-1], ":"), parts[len(parts)-1] } if reqRepository != "" && reqRepository != repository { continue diff --git a/doc/usage.md b/doc/usage.md index 82c921670f66f34e14e87deca551f7c27c41a8f8..110e53b206880d9452810eff134ddf359a76bd42 100644 --- a/doc/usage.md +++ b/doc/usage.md @@ -75,10 +75,11 @@ The build contains the following flags: - --build-arg: string slice, which is used during the build process - --build-static: string slice. Build binary equivalence. If this parameter is set, all timestamp differences and other build process differences (including the container ID and host name) will be eliminated, and a container image that meets BE requirements will be built. -- -f, --filename:string: indicates the path of the Dockerfile. If this parameter is not specified, the Dockerfile in the current path is used -- --iidfile:string, output image ID to the local file -- -o, --output:string: specifies the image export mode and path +- -f, --filename: string, indicates the path of the Dockerfile. If this parameter is not specified, the Dockerfile in the current path is used +- --iidfile: string, output image ID to the local file +- -o, --output: string, specifies the image export mode and path - --proxy: bool, which inherits the proxy environment variable on the host side. The default value is true +- --tag: string, add tag to the built image #### --build-arg @@ -175,6 +176,14 @@ In addition, the command line of the build subcommand also receives an argument( Indicates whether the container started by running the RUN command inherits the proxy environment variable "http_proxy","https_proxy","ftp_proxy","no_proxy","HTTP_PROXY","HTTPS_PROXY","FTP_PROXY","NO_PROXY". The default value is true. +#### --tag + +add tag to the built image + +Usage: + +`isula-build ctr-img build --tag busybox:latest` + ### Viewing a Local Persistent Image We can run the images command to view the image stored locally.