2022-07-06 06:08:45 +00:00
< page-header title = "'Service details'" breadcrumbs = "[{label:'Services', link:'docker.services'}, service.Name]" reload = "true" > < / page-header >
2016-09-23 04:54:58 +00:00
< 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 >
2022-11-28 02:00:28 +00:00
< rd-widget-header icon = "shuffle" 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 >
2023-05-25 03:59:32 +00:00
< td class = "w-1/5" > 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 >
2022-01-27 00:38:29 +00:00
< tr ng-if = "isAdmin && applicationState.endpoint.type !== 4" >
2023-05-25 03:59:32 +00:00
< td >
< div class = "inline-flex items-center" >
< div > Service webhook < / div >
< portainer-tooltip
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.'"
2022-11-28 02:00:28 +00:00
>
2023-05-25 03:59:32 +00:00
< / portainer-tooltip >
< / div >
< / td >
< td >
< div class = "flex flex-wrap items-center" >
< por-switch-field label-class = "'!mr-0'" checked = "WebhookExists" disabled = "disabledWebhookButton(WebhookExists)" on-change = "(onWebhookChange)" > < / por-switch-field >
< span ng-if = "webhookURL" >
< span class = "text-muted" > {{ webhookURL | truncatelr }}< / span >
< button type = "button" class = "btn btn-sm btn-primary btn-sm space-left" ng-if = "webhookURL" ng-click = "copyWebhook()" >
< pr-icon icon = "'copy'" class-name = "'mr-1'" > < / pr-icon >
Copy link
< / button >
< span >
< pr-icon id = "copyNotification" icon = "'check'" mode = "'success'" style = "display: none" > < / pr-icon >
< / span >
< / span >
< / div >
2018-09-03 10:08:03 +00:00
< / 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
2023-02-12 21:04:24 +00:00
>< div class = "flex flex-wrap gap-x-2 gap-y-1" >
2020-04-10 21:54:53 +00:00
< 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})"
2022-11-28 02:00:28 +00:00
>
< pr-icon icon = "'file-text'" > < / pr-icon > Service logs< /a
2020-04-10 21:54:53 +00:00
>
< button
authorization="DockerServiceUpdate"
type="button"
2022-11-28 02:00:28 +00:00
class="btn btn-primary btn-sm !ml-0"
2020-04-10 21:54:53 +00:00
ng-disabled="state.updateInProgress || isUpdating"
ng-click="forceUpdateService(service)"
button-spinner="state.updateInProgress"
ng-if="applicationState.endpoint.apiVersion >= 1.25"
>
2022-11-28 02:00:28 +00:00
< span ng-hide = "state.updateInProgress" class = "vertical-center" >
< pr-icon icon = "'refresh-cw'" > < / pr-icon >
Update the service< /span
>
2020-04-10 21:54:53 +00:00
< span ng-show = "state.updateInProgress" > Update in progress...< / span >
< / button >
< button
authorization="DockerServiceUpdate"
type="button"
2022-11-28 02:00:28 +00:00
class="btn btn-primary btn-sm !ml-0"
2020-04-10 21:54:53 +00:00
ng-disabled="state.rollbackInProgress || isUpdating"
ng-click="rollbackService(service)"
button-spinner="state.rollbackInProgress"
ng-if="applicationState.endpoint.apiVersion >= 1.25"
>
2022-11-28 02:00:28 +00:00
< span ng-hide = "state.rollbackInProgress" class = "vertical-center" >
< pr-icon icon = "'rotate-ccw'" > < / pr-icon >
Rollback the service< /span
>
2020-04-10 21:54:53 +00:00
< span ng-show = "state.rollbackInProgress" > Rollback in progress...< / span >
< / button >
< button
authorization="DockerServiceDelete"
type="button"
2022-11-28 02:00:28 +00:00
class="btn btn-danger btn-sm !ml-0"
2020-04-10 21:54:53 +00:00
ng-disabled="state.deletionInProgress || isUpdating"
ng-click="removeService()"
button-spinner="state.deletionInProgress"
>
2022-11-28 02:00:28 +00:00
< span ng-hide = "state.deletionInProgress" class = "vertical-center" >
< pr-icon icon = "'trash-2'" > < / pr-icon >
Delete the service< /span
>
2020-04-10 21:54:53 +00:00
< span ng-show = "state.deletionInProgress" > Deletion in progress...< / span >
< / button >
2022-11-28 02:00:28 +00:00
< / div >
< / 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 >
2022-11-28 02:00:28 +00:00
< rd-widget-header icon = "menu" 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 -->
2022-03-16 06:35:32 +00:00
< access-control-panel
ng-if="service"
resource-id="service.Id"
resource-control="service.ResourceControl"
resource-type="resourceType"
on-update-success="(onUpdateResourceControlSuccess)"
>
< / access-control-panel >
2017-07-12 07:51:51 +00:00
<!-- !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 >