<rd-header> <rd-header-title title-text="Service details"> <a data-toggle="tooltip" title="Refresh" ui-sref="docker.services.service({id: service.Id})" ui-sref-opts="{reload: true}"> <i class="fa fa-sync" aria-hidden="true"></i> </a> </rd-header-title> <rd-header-content> <a ui-sref="docker.services">Services</a> > <a ui-sref="docker.services.service({id: service.Id})">{{ service.Name }}</a> </rd-header-content> </rd-header> <div class="row"> <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> <a ui-sref="docker.services.service({id: service.Id}, {reload: true})">Refresh to see if this service has finished updated.</a> </div> </div> </div> <div class="row"> <div class="col-lg-9 col-md-9 col-xs-9"> <rd-widget> <rd-widget-header icon="fa-list-alt" title-text="Service details"></rd-widget-header> <rd-widget-body classes="no-padding"> <table class="table"> <tbody> <tr> <td>Name</td> <td ng-if="applicationState.endpoint.apiVersion <= 1.24"> <input type="text" class="form-control" ng-model="service.Name" ng-change="updateServiceAttribute(service, 'Name')" ng-disabled="isUpdating" /> </td> <td ng-if="applicationState.endpoint.apiVersion >= 1.25"> {{ service.Name }} </td> </tr> <tr> <td>ID</td> <td> {{ service.Id }} </td> </tr> <tr ng-if="service.CreatedAt"> <td>Created at</td> <td>{{ service.CreatedAt | getisodate }}</td> </tr> <tr ng-if="service.UpdatedAt"> <td>Last updated at</td> <td>{{ service.UpdatedAt | getisodate }}</td> </tr> <tr ng-if="service.Version"> <td>Version</td> <td>{{ service.Version }}</td> </tr> <tr> <td>Scheduling mode</td> <td>{{ service.Mode }}</td> </tr> <tr ng-if="service.Mode === 'replicated'"> <td>Replicas</td> <td> <span ng-if="service.Mode === 'replicated'"> <input class="input-sm" type="number" ng-model="service.Replicas" ng-change="updateServiceAttribute(service, 'Replicas')" disable-authorization="DockerServiceUpdate" /> </span> </td> </tr> <tr> <td>Image</td> <td>{{ service.Image }}</td> </tr> <tr ng-if="applicationState.endpoint.type !== 4"> <td colspan="{{ webhookURL ? '1' : '2' }}"> Service webhook <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> <label class="switch" style="margin-left: 20px;"> <input disable-authorization="DockerServiceUpdate" type="checkbox" ng-model="WebhookExists" ng-click="updateWebhook(service)" /><i></i> </label> </td> <td 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()"> <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> </tr> <tr authorization="DockerServiceLogs, DockerServiceUpdate, DockerServiceDelete"> <td colspan="2"> <p class="small text-muted" authorization="DockerServiceUpdate"> 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 > </tr> </tbody> </table> </rd-widget-body> <rd-widget-footer authorization="DockerServiceUpdate"> <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"> <button type="button" class="btn btn-primary" ng-disabled="!hasChanges(service, ['Mode', 'Replicas', 'Name', 'Webhooks'])" ng-click="updateService(service)" >Apply changes</button > <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"> <li><a ng-click="cancelChanges(service, ['Mode', 'Replicas', 'Name'])">Reset changes</a></li> <li><a ng-click="cancelChanges(service)">Reset all changes</a></li> </ul> </div> </div> </rd-widget-footer> </rd-widget> </div> <div class="col-lg-3 col-md-3 col-xs-3"> <rd-widget> <rd-widget-header icon="fa-bars" title-text="Quick navigation"></rd-widget-header> <rd-widget-body classes="no-padding"> <ul class="nav nav-pills nav-stacked"> <li><a href ng-click="goToItem('service-env-variables')">Environment variables</a></li> <li><a href ng-click="goToItem('service-container-image')">Container image</a></li> <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> <li ng-if="applicationState.endpoint.apiVersion >= 1.3"><a href ng-click="goToItem('service-placement-preferences')">Placement preferences</a></li> <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> <li><a href ng-click="goToItem('service-logging')">Logging</a></li> <li><a href ng-click="goToItem('service-labels')">Service labels</a></li> <li><a href ng-click="goToItem('service-configs')">Configs</a></li> <li ng-if="applicationState.endpoint.apiVersion >= 1.25"><a href ng-click="goToItem('service-secrets')">Secrets</a></li> <li><a href ng-click="goToItem('service-tasks')">Tasks</a></li> </ul> </rd-widget-body> </rd-widget> </div> </div> <!-- access-control-panel --> <por-access-control-panel ng-if="service" resource-id="service.Id" resource-control="service.ResourceControl" resource-type="'service'"> </por-access-control-panel> <!-- !access-control-panel --> <div class="row"> <hr /> <div class="col-lg-12 col-md-12 col-xs-12"> <h3 id="container-specs">Container specification</h3> <div id="service-container-spec" class="padding-top" ng-include="'app/docker/views/services/edit/includes/container-specs.html'"></div> <div id="service-container-image" class="padding-top" ng-include="'app/docker/views/services/edit/includes/image.html'"></div> <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> </div> </div> <div class="row"> <hr /> <div class="col-lg-12 col-md-12 col-xs-12"> <h3 id="service-network-specs">Networks & ports</h3> <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> </div> </div> <div class="row"> <hr /> <div class="col-lg-12 col-md-12 col-xs-12"> <h3 id="service-specs">Service specification</h3> <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> <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> <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> </div> </div>