2016-09-23 04:54:58 +00:00
< rd-header >
2018-06-06 16:12:35 +00:00
< rd-header-title title-text = "Service details" >
2018-02-01 12:27:52 +00:00
< a data-toggle = "tooltip" title = "Refresh" ui-sref = "docker.services.service({id: service.Id})" ui-sref-opts = "{reload: true}" >
2018-03-13 05:36:53 +00:00
< i class = "fa fa-sync" aria-hidden = "true" > < / i >
2016-09-23 04:54:58 +00:00
< / a >
< / rd-header-title >
< rd-header-content >
2018-02-01 12:27:52 +00:00
< a ui-sref = "docker.services" > Services< / a > > < a ui-sref = "docker.services.service({id: service.Id})" > {{ service.Name }}< / a >
2016-09-23 04:54:58 +00:00
< / rd-header-content >
< / rd-header >
< div class = "row" >
2017-03-20 20:28:09 +00:00
< div ng-if = "isUpdating" class = "col-lg-12 col-md-12 col-xs-12" >
< div class = "alert alert-info" role = "alert" id = "service-update-alert" >
< p > This service is being updated. Editing this service is currently disabled.< / p >
2018-02-01 12:27:52 +00:00
< a ui-sref = "docker.services.service({id: service.Id}, {reload: true})" > Refresh to see if this service has finished updated.< / a >
2017-03-20 20:28:09 +00:00
< / div >
< / div >
< / div >
< div class = "row" >
< div class = "col-lg-9 col-md-9 col-xs-9" >
2016-09-23 04:54:58 +00:00
< rd-widget >
2018-06-06 16:12:35 +00:00
< rd-widget-header icon = "fa-list-alt" title-text = "Service details" > < / rd-widget-header >
2016-09-23 04:54:58 +00:00
< rd-widget-body classes = "no-padding" >
< table class = "table" >
< tbody >
< tr >
< td > Name< / td >
2017-03-20 20:28:09 +00:00
< td ng-if = "applicationState.endpoint.apiVersion <= 1.24" >
2020-04-10 21:54:53 +00:00
< input type = "text" class = "form-control" ng-model = "service.Name" ng-change = "updateServiceAttribute(service, 'Name')" ng-disabled = "isUpdating" / >
2016-09-23 04:54:58 +00:00
< / td >
2017-03-20 20:28:09 +00:00
< td ng-if = "applicationState.endpoint.apiVersion >= 1.25" >
{{ service.Name }}
2016-09-23 04:54:58 +00:00
< / td >
< / tr >
< tr >
< td > ID< / td >
< td >
{{ service.Id }}
< / td >
< / tr >
2017-03-20 20:28:09 +00:00
< tr ng-if = "service.CreatedAt" >
< td > Created at< / td >
2020-04-10 21:54:53 +00:00
< td > {{ service.CreatedAt | getisodate }}< / td >
2017-03-20 20:28:09 +00:00
< / tr >
< tr ng-if = "service.UpdatedAt" >
< td > Last updated at< / td >
2020-04-10 21:54:53 +00:00
< td > {{ service.UpdatedAt | getisodate }}< / td >
2017-03-20 20:28:09 +00:00
< / tr >
< tr ng-if = "service.Version" >
< td > Version< / td >
< td > {{ service.Version }}< / td >
< / tr >
2016-09-23 04:54:58 +00:00
< tr >
< td > Scheduling mode< / td >
< td > {{ service.Mode }}< / td >
< / tr >
< tr ng-if = "service.Mode === 'replicated'" >
< td > Replicas< / td >
< td >
2017-03-20 20:28:09 +00:00
< span ng-if = "service.Mode === 'replicated'" >
2020-04-10 21:54:53 +00:00
< input
class="input-sm"
type="number"
ng-model="service.Replicas"
ng-change="updateServiceAttribute(service, 'Replicas')"
disable-authorization="DockerServiceUpdate"
/>
2016-09-23 04:54:58 +00:00
< / span >
< / td >
< / tr >
< tr >
< td > Image< / td >
2019-11-27 22:36:39 +00:00
< td > {{ service.Image }}< / td >
2016-12-25 20:31:22 +00:00
< / tr >
2019-07-25 22:38:07 +00:00
< tr ng-if = "applicationState.endpoint.type !== 4" >
2020-04-10 21:54:53 +00:00
< td colspan = "{{ webhookURL ? '1' : '2' }}" >
2018-09-03 10:08:03 +00:00
Service webhook
2020-04-10 21:54:53 +00:00
< portainer-tooltip
position="top"
message="Webhook (or callback URI) used to automate the update of this service. Sending a POST request to this callback URI (without requiring any authentication) will pull the most up-to-date version of the associated image and re-deploy this service."
>< / portainer-tooltip >
2018-09-03 10:08:03 +00:00
< label class = "switch" style = "margin-left: 20px;" >
2020-04-10 21:54:53 +00:00
< input disable-authorization = "DockerServiceUpdate" type = "checkbox" ng-model = "WebhookExists" ng-click = "updateWebhook(service)" / > < i > < / i >
2018-09-03 10:08:03 +00:00
< / label >
< / td >
< td ng-if = "webhookURL" >
< span class = "text-muted" > {{ webhookURL | truncatelr }}< / span >
2020-04-10 21:54:53 +00:00
< button type = "button" class = "btn btn-sm btn-primary btn-sm space-left" ng-if = "webhookURL" ng-click = "copyWebhook()" >
2018-09-03 10:08:03 +00:00
< span > < i class = "fa fa-copy space-right" aria-hidden = "true" > < / i > Copy link< / span >
< / button >
< span >
< i id = "copyNotification" class = "fa fa-check green-icon" aria-hidden = "true" style = "margin-left: 7px; display: none;" > < / i >
< / span >
< / td >
2020-04-10 21:54:53 +00:00
< / tr >
2019-05-24 06:04:58 +00:00
< tr authorization = "DockerServiceLogs, DockerServiceUpdate, DockerServiceDelete" >
2017-07-08 09:34:21 +00:00
< td colspan = "2" >
2020-01-31 15:49:59 +00:00
< p class = "small text-muted" authorization = "DockerServiceUpdate" >
2020-04-10 21:54:53 +00:00
Note: you can only rollback one level of changes. Clicking the rollback button without making a new change will undo your previous rollback < /p
>< p >
< a
authorization="DockerServiceLogs"
ng-if="applicationState.endpoint.apiVersion >= 1.3"
class="btn btn-primary btn-sm"
type="button"
ui-sref="docker.services.service.logs({id: service.Id})"
>< i class = "fa fa-file-alt space-right" aria-hidden = "true" > < / i > Service logs< /a
>
< button
authorization="DockerServiceUpdate"
type="button"
class="btn btn-primary btn-sm"
ng-disabled="state.updateInProgress || isUpdating"
ng-click="forceUpdateService(service)"
button-spinner="state.updateInProgress"
ng-if="applicationState.endpoint.apiVersion >= 1.25"
>
< span ng-hide = "state.updateInProgress" > < i class = "fa fa-sync space-right" aria-hidden = "true" > < / i > Update the service< / span >
< span ng-show = "state.updateInProgress" > Update in progress...< / span >
< / button >
< button
authorization="DockerServiceUpdate"
type="button"
class="btn btn-primary btn-sm"
ng-disabled="state.rollbackInProgress || isUpdating"
ng-click="rollbackService(service)"
button-spinner="state.rollbackInProgress"
ng-if="applicationState.endpoint.apiVersion >= 1.25"
>
< span ng-hide = "state.rollbackInProgress" > < i class = "fa fa-undo space-right" aria-hidden = "true" > < / i > Rollback the service< / span >
< span ng-show = "state.rollbackInProgress" > Rollback in progress...< / span >
< / button >
< button
authorization="DockerServiceDelete"
type="button"
class="btn btn-danger btn-sm"
ng-disabled="state.deletionInProgress || isUpdating"
ng-click="removeService()"
button-spinner="state.deletionInProgress"
>
< span ng-hide = "state.deletionInProgress" > < i class = "fa fa-trash-alt space-right" aria-hidden = "true" > < / i > Delete the service< / span >
< span ng-show = "state.deletionInProgress" > Deletion in progress...< / span >
< / button >
< / p > < /td
>
2017-07-08 09:34:21 +00:00
< / tr >
2016-09-23 04:54:58 +00:00
< / tbody >
< / table >
< / rd-widget-body >
2019-05-24 06:04:58 +00:00
< rd-widget-footer authorization = "DockerServiceUpdate" >
2017-03-20 20:28:09 +00:00
< p class = "small text-muted" >
Do you need help? View the Docker Service documentation < a href = "https://docs.docker.com/engine/reference/commandline/service_update/" target = "self" > here< / a > .
< / p >
< div class = "btn-toolbar" role = "toolbar" >
< div class = "btn-group" role = "group" >
2020-04-10 21:54:53 +00:00
< button type = "button" class = "btn btn-primary" ng-disabled = "!hasChanges(service, ['Mode', 'Replicas', 'Name', 'Webhooks'])" ng-click = "updateService(service)"
>Apply changes< /button
>
2017-03-20 20:28:09 +00:00
< button type = "button" class = "btn btn-default dropdown-toggle" data-toggle = "dropdown" aria-haspopup = "true" aria-expanded = "false" >
< span class = "caret" > < / span >
< / button >
< ul class = "dropdown-menu" >
2019-11-27 22:36:39 +00:00
< li > < a ng-click = "cancelChanges(service, ['Mode', 'Replicas', 'Name'])" > Reset changes< / a > < / li >
2017-03-20 20:28:09 +00:00
< li > < a ng-click = "cancelChanges(service)" > Reset all changes< / a > < / li >
< / ul >
< / div >
2016-11-09 00:23:56 +00:00
< / div >
< / rd-widget-footer >
2016-09-23 04:54:58 +00:00
< / rd-widget >
< / div >
2017-03-20 20:28:09 +00:00
< div class = "col-lg-3 col-md-3 col-xs-3" >
2016-09-23 04:54:58 +00:00
< rd-widget >
2018-06-06 16:12:35 +00:00
< rd-widget-header icon = "fa-bars" title-text = "Quick navigation" > < / rd-widget-header >
2016-09-23 04:54:58 +00:00
< rd-widget-body classes = "no-padding" >
2017-03-20 20:28:09 +00:00
< ul class = "nav nav-pills nav-stacked" >
< li > < a href ng-click = "goToItem('service-env-variables')" > Environment variables< / a > < / li >
2019-11-27 22:36:39 +00:00
< li > < a href ng-click = "goToItem('service-container-image')" > Container image< / a > < / li >
2017-03-20 20:28:09 +00:00
< li > < a href ng-click = "goToItem('service-container-labels')" > Container labels< / a > < / li >
< li > < a href ng-click = "goToItem('service-mounts')" > Mounts< / a > < / li >
< li > < a href ng-click = "goToItem('service-network-specs')" > Network & published ports< / a > < / li >
< li > < a href ng-click = "goToItem('service-resources')" > Resource limits & reservations< / a > < / li >
< li > < a href ng-click = "goToItem('service-placement-constraints')" > Placement constraints< / a > < / li >
2020-04-10 21:54:53 +00:00
< li ng-if = "applicationState.endpoint.apiVersion >= 1.3" > < a href ng-click = "goToItem('service-placement-preferences')" > Placement preferences< / a > < / li >
2017-03-20 20:28:09 +00:00
< li > < a href ng-click = "goToItem('service-restart-policy')" > Restart policy< / a > < / li >
< li > < a href ng-click = "goToItem('service-update-config')" > Update configuration< / a > < / li >
2017-12-22 09:05:31 +00:00
< li > < a href ng-click = "goToItem('service-logging')" > Logging< / a > < / li >
2017-03-20 20:28:09 +00:00
< li > < a href ng-click = "goToItem('service-labels')" > Service labels< / a > < / li >
2017-11-06 08:47:31 +00:00
< li > < a href ng-click = "goToItem('service-configs')" > Configs< / a > < / li >
2017-07-24 09:59:09 +00:00
< li ng-if = "applicationState.endpoint.apiVersion >= 1.25" > < a href ng-click = "goToItem('service-secrets')" > Secrets< / a > < / li >
2017-03-20 20:28:09 +00:00
< li > < a href ng-click = "goToItem('service-tasks')" > Tasks< / a > < / li >
2017-06-20 10:54:27 +00:00
< / ul >
2016-09-23 04:54:58 +00:00
< / rd-widget-body >
< / rd-widget >
< / div >
< / div >
2017-03-20 20:28:09 +00:00
2017-07-12 07:51:51 +00:00
<!-- access - control - panel -->
< por-access-control-panel
ng-if="service & & applicationState.application.authentication"
2017-07-20 13:48:05 +00:00
resource-id="service.Id"
2017-07-12 07:51:51 +00:00
resource-control="service.ResourceControl"
2020-04-10 21:54:53 +00:00
resource-type="'service'"
>
2017-07-12 07:51:51 +00:00
< / por-access-control-panel >
<!-- !access - control - panel -->
2017-05-23 18:56:10 +00:00
2017-03-20 20:28:09 +00:00
< div class = "row" >
2020-04-10 21:54:53 +00:00
< hr / >
2017-03-20 20:28:09 +00:00
< div class = "col-lg-12 col-md-12 col-xs-12" >
< h3 id = "container-specs" > Container specification< / h3 >
2018-02-01 12:27:52 +00:00
< div id = "service-container-spec" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/container-specs.html'" > < / div >
2019-11-27 22:36:39 +00:00
< div id = "service-container-image" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/image.html'" > < / div >
2018-02-01 12:27:52 +00:00
< div id = "service-env-variables" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/environmentvariables.html'" > < / div >
< div id = "service-container-labels" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/containerlabels.html'" > < / div >
< div id = "service-mounts" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/mounts.html'" > < / div >
2017-03-20 20:28:09 +00:00
< / div >
< / div >
< div class = "row" >
2020-04-10 21:54:53 +00:00
< hr / >
2017-03-20 20:28:09 +00:00
< div class = "col-lg-12 col-md-12 col-xs-12" >
< h3 id = "service-network-specs" > Networks & ports< / h3 >
2018-02-01 12:27:52 +00:00
< div id = "service-networks" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/networks.html'" > < / div >
< div id = "service-published-ports" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/ports.html'" > < / div >
< div id = "service-hosts-entries" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/hosts.html'" > < / div >
2017-03-20 20:28:09 +00:00
< / div >
< / div >
< div class = "row" >
2020-04-10 21:54:53 +00:00
< hr / >
2017-03-20 20:28:09 +00:00
< div class = "col-lg-12 col-md-12 col-xs-12" >
< h3 id = "service-specs" > Service specification< / h3 >
2018-02-01 12:27:52 +00:00
< div id = "service-resources" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/resources.html'" > < / div >
< div id = "service-placement-constraints" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/constraints.html'" > < / div >
2020-04-10 21:54:53 +00:00
< div
id="service-placement-preferences"
ng-if="applicationState.endpoint.apiVersion >= 1.3"
class="padding-top"
ng-include="'app/docker/views/services/edit/includes/placementPreferences.html'"
>< / div >
2018-02-01 12:27:52 +00:00
< div id = "service-restart-policy" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/restart.html'" > < / div >
< div id = "service-update-config" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/updateconfig.html'" > < / div >
< div id = "service-logging" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/logging.html'" > < / div >
< div id = "service-labels" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/servicelabels.html'" > < / div >
< div id = "service-configs" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/configs.html'" > < / div >
< div id = "service-secrets" ng-if = "applicationState.endpoint.apiVersion >= 1.25" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/secrets.html'" > < / div >
< div id = "service-tasks" class = "padding-top" ng-include = "'app/docker/views/services/edit/includes/tasks.html'" > < / div >
2017-03-20 20:28:09 +00:00
< / div >
< / div >