Làm cách nào để triển khai hình ảnh Docker cập nhật cho các tác vụ Amazon ECS?


110

Đâu là cách tiếp cận phù hợp để thực hiện các nhiệm vụ Amazon ECS của tôi cập nhật hình ảnh Docker của họ, sau khi hình ảnh được cho là đã được cập nhật trong sổ đăng ký tương ứng?


Tôi khuyên bạn nên chạy một hàm Lambda tự động / được lập lịch. Bằng cách này, nó nằm ngoài phiên bản. Bạn đã thử điều đó chưa? Bạn cũng có thể sử dụng SWF để làm bước tại một thời điểm
iSkore

Tôi không cần phải tự động hóa nó @iSkore. Cuối cùng thì tôi cũng muốn viết một kịch bản cho nó, nhưng tự mình chọn thời điểm chạy nó.
aknuds1

Ahh gotcha. Không chắc chắn về điều đó. Bạn có thể cung cấp thêm một chút thông tin?
iSkore

@iSkore Tôi không biết làm thế nào để mô tả nó tốt hơn tôi đã làm. Quy trình là: 1. Đẩy phiên bản mới của hình ảnh Docker vào sổ đăng ký. 2. Triển khai phiên bản hình ảnh mới cho ECS. Câu hỏi là làm thế nào để thực hiện sau này.
aknuds1

điều này cũng không dễ dàng hoặc rõ ràng với EKS..làm thế nào F là nhiệm vụ phổ biến nhất của việc sử dụng một cụm, triển khai một hình ảnh mới, quá tối nghĩa trong tài liệu?

Câu trả lời:


88

Nếu nhiệm vụ của bạn đang chạy trong một dịch vụ, bạn có thể bắt buộc triển khai mới. Điều này buộc định nghĩa nhiệm vụ phải được đánh giá lại và hình ảnh vùng chứa mới được kéo.

aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment

1
Tôi nghĩ để điều này hoạt động, bạn cần đảm bảo rằng có đủ tài nguyên trên các phiên bản ECS của bạn để triển khai một tác vụ bổ sung có cùng kích thước. Tôi giả định rằng AWS về cơ bản cố gắng thực hiện một hoán đổi, đợi một phiên bản nhiệm vụ mới được khởi động trước, trước khi chấm dứt phiên bản cũ. Nó chỉ tiếp tục thêm các mục "triển khai" với 0 phiên bản đang chạy, nếu bạn không.
Alex Fedulov

3
@AlexFedulov, vâng, tôi nghĩ bạn nói đúng. Để không phải chịu thời gian chết khi tạo một triển khai mới, bạn có thể 1) Cung cấp đủ phiên bản để triển khai phiên bản mới cùng với phiên bản cũ. Điều này có thể đạt được với tính năng tự động cân bằng. 2) Sử dụng kiểu triển khai Fargate. Bạn có thể tránh phân bổ thêm tài nguyên bằng cách đặt thông số "phần trăm khỏe mạnh tối thiểu" của dịch vụ thành 0 để cho phép ECS xóa dịch vụ cũ của bạn trước khi triển khai dịch vụ mới. Tuy nhiên, điều này sẽ phải chịu một số thời gian chết.
Dima

3
Các tùy chọn không xác định: --force-new-
deploy

1
Unknown lựa chọn: --force-new-triển khai: nâng cấp awscli
Kyle Parisi

1
Tôi đã thử lệnh này, nó không cập nhật vùng chứa với hình ảnh mới, nó quay lên vùng chứa khác có cùng hình ảnh cũ. Vì vậy, tôi kết thúc có hai vùng chứa đang chạy mặc dù trong dịch vụ tôi có số lượng mong muốn cụ thể = 1
maths

61

Mỗi khi bạn bắt đầu một nhiệm vụ (thông qua lệnh gọi StartTaskRunTaskAPI hoặc được bắt đầu tự động như một phần của Dịch vụ), ECS Agent sẽ thực hiện một docker pulltrong các thao tác imagebạn chỉ định trong định nghĩa nhiệm vụ của mình. Nếu bạn sử dụng cùng một tên hình ảnh (bao gồm cả thẻ) mỗi khi bạn đẩy vào sổ đăng ký của mình, bạn sẽ có thể chạy hình ảnh mới bằng cách chạy một tác vụ mới. Lưu ý rằng nếu Docker không thể truy cập sổ đăng ký vì bất kỳ lý do gì (ví dụ: sự cố mạng hoặc sự cố xác thực), ECS Agent sẽ cố gắng sử dụng hình ảnh được lưu trong bộ nhớ cache; nếu bạn muốn tránh sử dụng hình ảnh đã lưu trong bộ nhớ cache khi cập nhật hình ảnh của mình, bạn sẽ muốn đẩy một thẻ khác vào sổ đăng ký của mình mỗi lần và cập nhật định nghĩa nhiệm vụ của bạn tương ứng trước khi chạy tác vụ mới.

Cập nhật: Hành vi này hiện có thể được điều chỉnh thông qua ECS_IMAGE_PULL_BEHAVIORbiến môi trường được đặt trên tác nhân ECS. Xem tài liệu để biết chi tiết. Kể từ thời điểm viết bài, các cài đặt sau được hỗ trợ:

Hành vi được sử dụng để tùy chỉnh quy trình kéo hình ảnh cho các trường hợp vùng chứa của bạn. Phần sau mô tả các hành vi tùy chọn:

  • Nếu defaultđược chỉ định, hình ảnh sẽ được kéo từ xa. Nếu kéo hình ảnh không thành công, thì vùng chứa sẽ sử dụng hình ảnh được lưu trong bộ nhớ cache trên phiên bản.

  • Nếu alwaysđược chỉ định, hình ảnh luôn được kéo từ xa. Nếu kéo hình ảnh không thành công, thì tác vụ không thành công. Tùy chọn này đảm bảo rằng phiên bản mới nhất của hình ảnh luôn được kéo. Mọi hình ảnh đã lưu trong bộ nhớ cache đều bị bỏ qua và phải tuân theo quy trình dọn dẹp hình ảnh tự động.

  • Nếu onceđược chỉ định, hình ảnh chỉ được kéo từ xa nếu nó chưa được kéo bởi tác vụ trước đó trên cùng một trường hợp vùng chứa hoặc nếu hình ảnh được lưu trong bộ nhớ cache đã bị xóa bởi quy trình dọn dẹp hình ảnh tự động. Nếu không, hình ảnh được lưu trong bộ nhớ cache trên phiên bản sẽ được sử dụng. Điều này đảm bảo rằng không có lần kéo hình ảnh không cần thiết nào được cố gắng.

  • Nếu prefer-cachedđược chỉ định, hình ảnh sẽ được kéo từ xa nếu không có hình ảnh được lưu trong bộ nhớ cache. Nếu không, hình ảnh được lưu trong bộ nhớ cache trên phiên bản sẽ được sử dụng. Tính năng dọn dẹp hình ảnh tự động bị tắt cho vùng chứa để đảm bảo rằng hình ảnh được lưu trong bộ nhớ cache không bị xóa.


4
Bạn có chắc không? Tôi đã thấy các trường hợp mà hình ảnh docker cũ vẫn chạy ngay cả sau khi tôi đã đẩy một hình ảnh mới lên Dockerhub (sử dụng cùng một tên thẻ). Tôi đoán có lẽ tôi chỉ nên tăng tên thẻ mỗi khi một hình ảnh mới được tạo. Tuy nhiên, điều này là khá hiếm theo kinh nghiệm của tôi, vì vậy có thể đó chỉ là sự cố mạng nhất thời. (Tôi biết rằng bạn làm việc trên ECS, vì vậy bạn là người tốt nhất để trả lời điều này, nhưng đây không phải là chính xác những gì tôi đã trải qua. Xin lỗi nếu điều này là thô lỗ, không phải ý định của tôi!)
Ibrahim

1
Có, hành vi hiện tại là nó sẽ cố gắng kéo mỗi lần. Nếu kéo không thành công (sự cố mạng, thiếu quyền, v.v.), nó sẽ cố gắng sử dụng hình ảnh được lưu trong bộ nhớ cache. Bạn có thể tìm thêm thông tin chi tiết trong tệp nhật ký tác nhân thường có trong đó /var/log/ecs.
Samuel Karp

26

Đăng ký định nghĩa nhiệm vụ mới và cập nhật dịch vụ để sử dụng định nghĩa nhiệm vụ mới là cách tiếp cận được AWS khuyến nghị. Cách dễ nhất để làm điều này là:

  1. Điều hướng đến Định nghĩa nhiệm vụ
  2. Chọn nhiệm vụ chính xác
  3. Chọn tạo bản sửa đổi mới
  4. Nếu bạn đang lấy phiên bản mới nhất của hình ảnh vùng chứa với một cái gì đó như thẻ: mới nhất, thì chỉ cần nhấp vào Tạo. Nếu không, hãy cập nhật số phiên bản của hình ảnh vùng chứa rồi nhấp vào Tạo.
  5. Mở rộng hành động
  6. Chọn Dịch vụ cập nhật (hai lần)
  7. Sau đó đợi dịch vụ được khởi động lại

Hướng dẫn này chi tiết hơn và mô tả cách các bước trên phù hợp với quy trình phát triển sản phẩm từ đầu đến cuối.

Tiết lộ đầy đủ: Hướng dẫn này có các bộ chứa từ Bitnami và tôi làm việc cho Bitnami. Tuy nhiên, những suy nghĩ được thể hiện ở đây là của riêng tôi và không phải quan điểm của Bitnami.


3
Điều này hoạt động, nhưng bạn có thể phải thay đổi các giá trị tối thiểu / tối đa của dịch vụ. Nếu bạn chỉ có một phiên bản EC2, bạn phải đặt phần trăm lành mạnh tối thiểu thành 0, nếu không nó sẽ không bao giờ kết thúc tác vụ (làm cho dịch vụ của bạn tạm thời ngoại tuyến) để triển khai vùng chứa đã cập nhật.
Malvineous

3
@Malvineous Điểm tốt! Trong phần thiết lập ECS của hướng dẫn , tôi mô tả chính xác điều đó. Đây là cấu hình được đề xuất từ ​​phần đó: Số tác vụ - 1, Phần trăm khỏe mạnh tối thiểu - 0, Phần trăm tối đa - 200.
Neal

@Neal Tôi đã thử cách tiếp cận của bạn như đã nêu ở đây ... vẫn không vui
Hafiz

@Hafiz Nếu bạn cần trợ giúp để tìm ra điều này, bạn nên mô tả bạn đã đi được bao xa và bạn gặp lỗi gì.
Neal

Điều này chỉ hoạt động cho các dịch vụ, không phải các tác vụ không có dịch vụ.
zaitsman

8

Có hai cách để làm điều này.

Đầu tiên, hãy sử dụng AWS CodeDeploy. Bạn có thể cấu hình các phần triển khai Blue / Green trong định nghĩa dịch vụ ECS. Điều này bao gồm một CodeDeployRoleForECS, một TargetGroup khác cho switch và một Listener thử nghiệm (tùy chọn). AWS ECS sẽ tạo ứng dụng CodeDeploy và nhóm triển khai và liên kết các tài nguyên CodeDeploy này với Cụm / Dịch vụ ECS và ELB / Nhóm mục tiêu cho bạn. Sau đó, bạn có thể sử dụng CodeDeploy để bắt đầu triển khai, trong đó bạn cần nhập một AppSpec chỉ định sử dụng tác vụ / vùng chứa nào để cập nhật dịch vụ nào. Đây là nơi bạn chỉ định nhiệm vụ / vùng chứa mới của mình. Sau đó, bạn sẽ thấy các phiên bản mới xuất hiện trong TargetGroup mới và TargetGroup cũ bị ngắt kết nối với ELB và các phiên bản cũ đã đăng ký với TargetGroup cũ sẽ sớm bị chấm dứt.

Điều này nghe có vẻ rất phức tạp. Trên thực tế, vì / nếu bạn đã bật tính năng tự động mở rộng quy mô trên dịch vụ ECS của mình, một cách đơn giản để thực hiện là chỉ cần buộc triển khai mới bằng bảng điều khiển hoặc cli, như một quý ông ở đây đã chỉ ra:

aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment

Bằng cách này, bạn vẫn có thể sử dụng kiểu triển khai "cập nhật lần lượt" và ECS sẽ chỉ đơn giản là tạo ra các phiên bản mới và rút các phiên bản cũ mà không có thời gian ngừng hoạt động của dịch vụ nếu mọi thứ đều ổn. Mặt xấu là bạn mất kiểm soát tốt việc triển khai và bạn không thể quay trở lại phiên bản trước nếu có lỗi và điều này sẽ phá vỡ dịch vụ đang diễn ra. Nhưng đây là một cách thực sự đơn giản để đi.

BTW, đừng quên đặt các số thích hợp cho Phần trăm khỏe mạnh tối thiểu và Phần trăm tối đa, như 100 và 200.


Có cách nào để làm điều này mà không cần phải thay đổi IP không? Đối với tôi khi tôi chạy nó hoạt động nhưng nó đã thay đổi IP Riêng tư mà tôi đang chạy
Migdotcom

@Migdotcom Tôi đã gặp sự cố tương tự khi cần NLB proxy. Nói tóm lại, cách duy nhất để giữ nguyên IP phiên bản EC2 là sử dụng các địa chỉ IP đàn hồi hoặc sử dụng một cách tiếp cận khác. Tôi không biết trường hợp sử dụng của bạn nhưng việc liên kết Global Accelerator với ALB được liên kết ECS đã cung cấp cho tôi địa chỉ IP tĩnh, điều này đã giải quyết được trường hợp sử dụng của tôi. Nếu bạn muốn biết các IP nội bộ động, bạn sẽ cần truy vấn ALB bằng lambda. Đây là rất nhiều nỗ lực. Liên kết bên dưới: aws.amazon.com/blogs/networking-and-content-delivery/…
Marcus

aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deploy đã làm việc cho tôi!
gvasquez

3

Tôi đã tạo một tập lệnh để triển khai các hình ảnh Docker được cập nhật cho một dịch vụ dàn dựng trên ECS, để định nghĩa tác vụ tương ứng đề cập đến các phiên bản hiện tại của hình ảnh Docker. Tôi không biết chắc liệu mình có đang làm theo các phương pháp hay nhất hay không, vì vậy chúng tôi hoan nghênh phản hồi.

Để tập lệnh hoạt động, bạn cần một phiên bản ECS dự phòng hoặc một deploymentConfiguration.minimumHealthyPercentgiá trị để ECS có thể lấy cắp một phiên bản để triển khai định nghĩa nhiệm vụ được cập nhật.

Thuật toán của tôi như thế này:

  1. Gắn thẻ hình ảnh Docker tương ứng với vùng chứa trong định nghĩa nhiệm vụ với bản sửa đổi Git.
  2. Đẩy các thẻ hình ảnh Docker vào các đăng ký tương ứng.
  3. Hủy đăng ký các định nghĩa nhiệm vụ cũ trong họ định nghĩa nhiệm vụ.
  4. Đăng ký định nghĩa nhiệm vụ mới, bây giờ đề cập đến hình ảnh Docker được gắn thẻ với các bản sửa đổi Git hiện tại.
  5. Cập nhật dịch vụ để sử dụng định nghĩa nhiệm vụ mới.

Mã của tôi được dán bên dưới:

triển khai-ecs

#!/usr/bin/env python3
import subprocess
import sys
import os.path
import json
import re
import argparse
import tempfile

_root_dir = os.path.abspath(os.path.normpath(os.path.dirname(__file__)))
sys.path.insert(0, _root_dir)
from _common import *


def _run_ecs_command(args):
    run_command(['aws', 'ecs', ] + args)


def _get_ecs_output(args):
    return json.loads(run_command(['aws', 'ecs', ] + args, return_stdout=True))


def _tag_image(tag, qualified_image_name, purge):
    log_info('Tagging image \'{}\' as \'{}\'...'.format(
        qualified_image_name, tag))
    log_info('Pulling image from registry in order to tag...')
    run_command(
        ['docker', 'pull', qualified_image_name], capture_stdout=False)
    run_command(['docker', 'tag', '-f', qualified_image_name, '{}:{}'.format(
        qualified_image_name, tag), ])
    log_info('Pushing image tag to registry...')
    run_command(['docker', 'push', '{}:{}'.format(
        qualified_image_name, tag), ], capture_stdout=False)
    if purge:
        log_info('Deleting pulled image...')
        run_command(
            ['docker', 'rmi', '{}:latest'.format(qualified_image_name), ])
        run_command(
            ['docker', 'rmi', '{}:{}'.format(qualified_image_name, tag), ])


def _register_task_definition(task_definition_fpath, purge):
    with open(task_definition_fpath, 'rt') as f:
        task_definition = json.loads(f.read())

    task_family = task_definition['family']

    tag = run_command([
        'git', 'rev-parse', '--short', 'HEAD', ], return_stdout=True).strip()
    for container_def in task_definition['containerDefinitions']:
        image_name = container_def['image']
        _tag_image(tag, image_name, purge)
        container_def['image'] = '{}:{}'.format(image_name, tag)

    log_info('Finding existing task definitions of family \'{}\'...'.format(
        task_family
    ))
    existing_task_definitions = _get_ecs_output(['list-task-definitions', ])[
        'taskDefinitionArns']
    for existing_task_definition in [
        td for td in existing_task_definitions if re.match(
            r'arn:aws:ecs+:[^:]+:[^:]+:task-definition/{}:\d+'.format(
                task_family),
            td)]:
        log_info('Deregistering task definition \'{}\'...'.format(
            existing_task_definition))
        _run_ecs_command([
            'deregister-task-definition', '--task-definition',
            existing_task_definition, ])

    with tempfile.NamedTemporaryFile(mode='wt', suffix='.json') as f:
        task_def_str = json.dumps(task_definition)
        f.write(task_def_str)
        f.flush()
        log_info('Registering task definition...')
        result = _get_ecs_output([
            'register-task-definition',
            '--cli-input-json', 'file://{}'.format(f.name),
        ])

    return '{}:{}'.format(task_family, result['taskDefinition']['revision'])


def _update_service(service_fpath, task_def_name):
    with open(service_fpath, 'rt') as f:
        service_config = json.loads(f.read())
    services = _get_ecs_output(['list-services', ])[
        'serviceArns']
    for service in [s for s in services if re.match(
        r'arn:aws:ecs:[^:]+:[^:]+:service/{}'.format(
            service_config['serviceName']),
        s
    )]:
        log_info('Updating service with new task definition...')
        _run_ecs_command([
            'update-service', '--service', service,
            '--task-definition', task_def_name,
        ])


parser = argparse.ArgumentParser(
    description="""Deploy latest Docker image to staging server.
The task definition file is used as the task definition, whereas
the service file is used to configure the service.
""")
parser.add_argument(
    'task_definition_file', help='Your task definition JSON file')
parser.add_argument('service_file', help='Your service JSON file')
parser.add_argument(
    '--purge_image', action='store_true', default=False,
    help='Purge Docker image after tagging?')
args = parser.parse_args()

task_definition_file = os.path.abspath(args.task_definition_file)
service_file = os.path.abspath(args.service_file)

os.chdir(_root_dir)

task_def_name = _register_task_definition(
    task_definition_file, args.purge_image)
_update_service(service_file, task_def_name)

_common.py

import sys
import subprocess


__all__ = ['log_info', 'handle_error', 'run_command', ]


def log_info(msg):
    sys.stdout.write('* {}\n'.format(msg))
    sys.stdout.flush()


def handle_error(msg):
    sys.stderr.write('* {}\n'.format(msg))
    sys.exit(1)


def run_command(
        command, ignore_error=False, return_stdout=False, capture_stdout=True):
    if not isinstance(command, (list, tuple)):
        command = [command, ]
    command_str = ' '.join(command)
    log_info('Running command {}'.format(command_str))
    try:
        if capture_stdout:
            stdout = subprocess.check_output(command)
        else:
            subprocess.check_call(command)
            stdout = None
    except subprocess.CalledProcessError as err:
        if not ignore_error:
            handle_error('Command failed: {}'.format(err))
    else:
        return stdout.decode() if return_stdout else None

@Andris Cảm ơn, đã sửa.
aknuds1

5
Điều này là quá mức cần thiết. Có thể triển khai thông qua địa hình hoặc chỉ một đường ecs-cli.
holms

@holms Tôi đang sử dụng Terraform để cập nhật hình ảnh tác vụ ECS. Đó là quá mức cần thiết như mã python ở trên. Các bước cần thiết cũng phức tạp.
Jari Turkia

3

AWS CodePipeline.

Bạn có thể đặt ECR làm nguồn và ECS làm mục tiêu để triển khai.


2
bạn có thể liên kết đến bất kỳ tài liệu cho điều này?
BenDog

1

Cách làm sau phù hợp với tôi trong trường hợp thẻ hình ảnh docker giống nhau:

  1. Đi tới cụm và dịch vụ.
  2. Chọn dịch vụ và nhấp vào cập nhật.
  3. Đặt số lượng nhiệm vụ là 0 và cập nhật.
  4. Sau khi kết thúc triển khai, hãy chia tỷ lệ số tác vụ thành 1.

1

Chạy vào cùng một vấn đề. Sau khi dành hàng giờ, đã kết thúc các bước đơn giản này để triển khai tự động hình ảnh cập nhật:

1. Thay đổi định nghĩa nhiệm vụ củaECS: Để hiểu rõ hơn, hãy giả sử bạn đã tạo định nghĩa nhiệm vụ với các chi tiết dưới đây (lưu ý: những con số này sẽ thay đổi tương ứng theo định nghĩa nhiệm vụ của bạn):

launch_type = EC2

desired_count = 1

Sau đó, bạn cần thực hiện các thay đổi sau:

deployment_minimum_healthy_percent = 0  //this does the trick, if not set to zero the force deployment wont happen as ECS won't allow to stop the current running task

deployment_maximum_percent = 200  //for allowing rolling update

2. Gắn thẻ hình ảnh của bạn là < your-image-name>: mới nhất . Khóa mới nhất sẽ đảm nhận việc kéo theo tác vụ ECS tương ứng.

sudo docker build -t imageX:master .   //build your image with some tag
sudo -s eval $(aws ecr get-login --no-include-email --region us-east-1)  //login to ECR
sudo docker tag imageX:master <your_account_id>.dkr.ecr.us-east-1.amazonaws.com/<your-image-name>:latest    //tag your image with latest tag

3. đẩy hình ảnh vào ECR

sudo docker push  <your_account_id>.dkr.ecr.us-east-1.amazonaws.com/<your-image-name>:latest

4. áp dụng lực lượng triển khai

sudo aws ecs update-service --cluster <your-cluster-name> --service <your-service-name> --force-new-deployment --region us-east-1

Lưu ý: Tôi đã viết tất cả các lệnh giả sử khu vực là chúng ta-đông-1 . Chỉ cần thay thế nó bằng khu vực tương ứng của bạn trong khi triển khai.


Tôi nhận thấy các thông số là thông số địa hình; Bất kỳ ý tưởng nào về cách đạt được điều tương tự cho CloudFormation: Tôi có AutoScalingGroup MinSize: 0 và MaxSize: 1; những gì khác cần được thiết lập?
Wayne

0

Sử dụng AWS cli Tôi đã thử dịch vụ cập nhật aws ecs như đã đề xuất ở trên. Không nhận docker mới nhất từ ​​ECR. Cuối cùng, tôi chạy lại playbook Ansible của mình đã tạo cụm ECS. Phiên bản của định nghĩa nhiệm vụ bị thay đổi khi chạy ecs_taskdefinition. Sau đó, tất cả là tốt. Hình ảnh docker mới được chọn.

Thực sự không chắc liệu việc thay đổi phiên bản tác vụ có buộc triển khai lại hay không hoặc liệu playbook sử dụng ecs_service có khiến tác vụ tải lại hay không.

Nếu có ai quan tâm, tôi sẽ xin phép xuất bản phiên bản sách vở đã được khử trùng của tôi.


Tôi tin rằng bản sửa đổi định nghĩa nhiệm vụ chỉ được yêu cầu khi bạn cập nhật cấu hình định nghĩa nhiệm vụ thực tế. trong trường hợp này nếu bạn đang sử dụng hình ảnh có thẻ mới nhất thì không cần sửa đổi cấu hình? Tất nhiên có cam kết id như một thẻ là tốt, và có cả bản sửa đổi định nghĩa nhiệm vụ riêng biệt để bạn có thể khôi phục, nhưng sau đó CI của bạn sẽ thấy tất cả thông tin đăng nhập bạn đang sử dụng cho vùng chứa, đây không phải là cách tôi muốn triển khai mọi thứ.
holms

0

Tôi cũng đang cố gắng tìm một cách tự động để làm việc đó, Đó là đẩy các thay đổi lên ECR và sau đó thẻ mới nhất sẽ được dịch vụ chọn. Ngay, bạn có thể làm điều đó theo cách thủ công bằng cách Dừng tác vụ cho dịch vụ của bạn từ cụm của bạn. Các tác vụ mới sẽ kéo các vùng chứa ECR được cập nhật.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.