Dagger là một ứng dụng mã nguồn mở và miễn phí để tự động hóa các đường ống Tích hợp liên tục/Phân phối liên tục (CI/CD). Nó cho phép các quản trị viên và nhà phát triển tạo các tập lệnh để lắp ráp, thử nghiệm, xây dựng và thậm chí xuất bản một dự án vào một sổ đăng ký container. Dagger bao gồm các API cho một số ngôn ngữ lập trình, cung cấp thêm sự tiện lợi. Hướng dẫn này cung cấp phần giới thiệu ngắn gọn về Dagger và trình bày cách tạo một đường ống Dagger đơn giản.

Dagger là gì?

Dagger ban đầu được tạo ra bởi người sáng lập Docker. Nó cho phép người dùng tự động hóa các đường ống sản xuất của họ bằng ngôn ngữ mà họ thích. Giao diện Dagger cho phép người dùng tạo, xây dựng, thử nghiệm và chứa các ứng dụng của họ thông qua việc sử dụng SDK chi tiết. Dagger chạy toàn bộ đường ống bên trong một hoặc nhiều vùng chứa và yêu cầu Docker BuildKit backend để hoạt động. Nó được thiết kế để sử dụng như một phần của đường ống CI/CD, tự động hóa toàn bộ vòng đời phát triển ứng dụng. Đường ống CI/CD trưởng thành cho phép có lịch trình phân phối nhanh hơn, hiệu quả hơn và mạnh mẽ hơn.

Đầu tiên, tập lệnh nhập gói Dagger và mở một phiên cho công cụ Dagger. Sau đó, tập lệnh truyền các yêu cầu đường ống đến công cụ bằng giao thức nội bộ. Đối với mỗi yêu cầu, công cụ Dagger xác định các hoạt động cần thiết để tính toán kết quả. Các tác vụ khác nhau được chạy đồng thời để có hiệu suất tốt hơn. Sau đó, các kết quả được xử lý không đồng bộ và gửi lại cho tập lệnh khi mọi thứ đã được giải quyết. Kết quả có thể được gán cho một biến và được sử dụng làm đầu vào cho các giai đoạn tiếp theo của đường ống.

Ngoài việc hỗ trợ đa ngôn ngữ, Dagger còn cung cấp một số lợi thế sau:

  • Nó cho phép các nhà phát triển tích hợp các bài kiểm tra tự động trực tiếp vào quy trình của họ.
  • Vì được phát triển bằng ngôn ngữ lập trình chuẩn, nên tập lệnh Dagger có tính di động và không phụ thuộc vào hệ thống. Nó có thể chạy trên bất kỳ kiến ​​trúc nào.
  • Các tập lệnh có thể chạy cục bộ hoặc từ xa.
  • Dagger lưu trữ kết quả để sử dụng sau nhằm tối ưu hóa hiệu suất.
  • Nó hoàn toàn tương thích và tích hợp chặt chẽ với Docker. Docker hỗ trợ Dagger trong việc quản lý sự phụ thuộc. Các tập lệnh tương thích chéo với nhiều môi trường CI/CD khác.
  • Chỉ cần rất ít mã để phát triển một quy trình phức tạp.
  • Tùy chọn có thể sử dụng tiện ích mở rộng Dagger CLI để tương tác với Dagger Engine từ dòng lệnh.
  • Dagger có khả năng mở rộng và có thể xử lý đồng thời nhiều đường ống có độ chi tiết cao.

Vì Dagger là một ứng dụng tương đối mới nên nó chưa có lượng người dùng rộng rãi hoặc nhiều phương tiện hỗ trợ. Mặc dù Dagger SDK rất mạnh mẽ, nhưng nó cũng phức tạp và mất một thời gian để học.

Do hỗ trợ đa ngôn ngữ của Dagger, các nhà phát triển có thể mã hóa đường ống của họ bằng ngôn ngữ yêu thích của họ. Nó có khả năng cung cấp cơ hội sử dụng cùng ngôn ngữ lập trình với ngôn ngữ được sử dụng để phát triển ứng dụng. Dagger SDK/API có sẵn bằng các ngôn ngữ sau:

  • Trăn
  • Đi
  • Node.js
  • Đồ thị

Dagger đề xuất Go SDK cho những ai không chắc chắn nên sử dụng SDK nào. GraphQL API không phụ thuộc vào ngôn ngữ. Nó có thể đóng vai trò là một khuôn khổ cấp thấp cho những ai muốn sử dụng một ngôn ngữ mà không cần API riêng.

Để biết thêm thông tin cơ bản về Dagger, hãy xem Tài liệu Dagger và Sách hướng dẫn Dagger .

Trước khi bạn bắt đầu

  1. Nếu bạn chưa thực hiện, hãy tạo một tài khoản Linode và Compute Instance. Xem hướng dẫn Bắt đầu với Linode và Tạo Compute Instance của chúng tôi .
  2. Làm theo hướng dẫn Thiết lập và Bảo mật Phiên bản Compute của chúng tôi để cập nhật hệ thống của bạn. Bạn cũng có thể muốn đặt múi giờ, cấu hình tên máy chủ, tạo tài khoản người dùng giới hạn và tăng cường quyền truy cập SSH.
  3. Để xuất bản container, bạn phải có quyền truy cập vào sổ đăng ký container. Hướng dẫn này sử dụng sổ đăng ký Harbor nguồn mở để xuất bản container. Tuy nhiên, có thể đẩy container vào bất kỳ kho lưu trữ container nào. Để biết thông tin về cách tạo sổ đăng ký Harbor trên một Compute Instance riêng biệt, hãy xem hướng dẫn về Triển khai Harbor thông qua Linode Marketplace . Trước khi sử dụng Harbor, cần tạo một dự án có tên là daggerlưu trữ container mẫu.

Ghi chúHướng dẫn này được viết cho người dùng không phải root. Các lệnh yêu cầu quyền nâng cao được thêm tiền tố 

sudo. Nếu bạn không quen với 

sudolệnh, hãy xem hướng dẫn 

Người dùng và Nhóm .

Cách cài đặt Dagger

Dagger yêu cầu sử dụng Docker. Hướng dẫn này sử dụng Python SDK để biên soạn tập lệnh. Mô-đun Dagger cho Python được cài đặt bằng pip, trình quản lý gói Python. Hướng dẫn này được viết cho người dùng Ubuntu 22.04 LTS, nhưng thường áp dụng cho hầu hết các bản phát hành gần đây và các bản phân phối Linux khác. Để cài đặt Dagger, hãy làm theo các bước sau.

1.Cài đặt mọi bản cập nhật để đảm bảo hệ thống được cập nhật:

sudo apt update -y && sudo apt upgrade -y

Sau đó, hãy khởi động lại hệ thống nếu được yêu cầu.

2.Đảm bảo gitđược cài đặt trên hệ thống:

sudo apt install git

3.Để chuẩn bị cho việc cài đặt Docker v2, hãy xóa mọi bản phát hành cũ hơn của ứng dụng rồi cài đặt một số thành phần bổ sung:

sudo apt remove docker docker-engine docker.io containerd runc
sudo apt install ca-certificates curl gnupg lsb-release

4.Thêm khóa GPG Docker chính thức để giúp xác thực cài đặt:

sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

5.Thêm kho lưu trữ Docker vào apt, sau đó cập nhật danh sách gói:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

6.Cài đặt phiên bản mới nhất của Docker Engine và CLI cùng với một số gói liên quan:

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

7.Để đảm bảo Docker hoạt động chính xác, hãy chạy hello-worldcontainer:

sudo docker run hello-world

Nếu mọi thứ đều hoạt động, container sẽ hiển thị thông báo Hello from Docker!:

Hello from Docker!
This message shows that your installation appears to be working correctly.

8.Cài đặt Dagger SDK cho ngôn ngữ lập trình phù hợp. Hướng dẫn này sử dụng Python để tạo ứng dụng ví dụ, vì vậy các bước tiếp theo sẽ giải thích cách tải xuống Python SDK. Sử dụng pipđể cài đặt dagger-iomô-đun. Nếu pipchưa cài đặt, có thể thêm bằng lệnh sudo apt install python3-pip. Yêu cầu Python bản phát hành 3.10.

Tùy chọn bắt buộc

Dagger sử dụng Docker để tạo một container, nhưng sudothông thường là bắt buộc để chạy Docker. Điều này có nghĩa là gói Python dagger-iophải có thể truy cập được đối với người dùng root. Thật không may, Python cài đặt các mô-đun cục bộ theo mặc định. Có một vài cách để giải quyết vấn đề này:

Phương pháp nhanh nhất là cài đặt dagger-iogói trên toàn cầu bằng cách sử dụng pip -Hcờ. Điều này đảm bảo rằng tất cả người dùng đều có thể truy cập được. Thật không may, việc sử dụng piptrên toàn cầu có thể dẫn đến các vấn đề phức tạp và khó hiểu về quyền. Kỹ thuật này nên được sử dụng hết sức cẩn thận, đặc biệt là trong môi trường nhiều người dùng. Để cài đặt gói trên toàn cầu, hãy sử dụng lệnh này thay vì lệnh bên dưới:

sudo -H pip install dagger-io

Một giải pháp thay thế tốt hơn là thêm người dùng hiện tại vào dockernhóm. Điều này cho phép người dùng truy cập Docker mà không cần quyền root, nhưng điều này yêu cầu phải khởi động lại để có hiệu lực. Hướng dẫn này tiến hành như thể người dùng đã được thêm vào dockernhóm và cài đặt dagger-iocục bộ. Để thêm người dùng hiện tại vào dockernhóm, hãy sử dụng cú pháp lệnh sau, thay thế example-usernamebằng tên người dùng thực tế của bạn:

sudo usermod -aG docker example-username
pip install dagger-io

Ghi chú: SDK cũng khả dụng cho Node.js và Go. Để cài đặt Go SDK, hãy sử dụng lệnh go mod init mainvà go get dagger.io/dagger. Đối với Node.js SDK, hãy sử dụng npm install @dagger.io/dagger --save-dev.

Cách tạo đường ống Dagger mẫu

Hướng dẫn này sử dụng Python SDK để tạo một ví dụ về đường ống Dagger CI/CD. Để đơn giản hóa quy trình, hướng dẫn này sử dụng hello-daggerứng dụng demo để trình bày các bước chính. Dagger khuyên bạn nên sử dụng ứng dụng này khi học cách tạo đường ống. Tuy nhiên, bạn có thể sử dụng bất kỳ ứng dụng nào cho bản demo, miễn là có các bản cập nhật tập lệnh phù hợp.

Để biết thêm thông tin về Python SDK hoặc để tùy chỉnh thêm ứng dụng, hãy xem tài liệu Dagger Python SDK . Xem bản demo Dagger Quickstart để biết thông tin về cách tạo đường ống này bằng Go hoặc Node.

Để tạo đường ống Dagger trong Python, hãy làm theo các bước sau.

Tải xuống ứng dụng mẫu

Dagger đã phát triển một ứng dụng React mẫu có tên hello-daggerlà công cụ hỗ trợ giảng dạy. Để bắt đầu, hãy tải xuống ứng dụng từ GitHub bằng cách sử dụng git.

1.Sao chép ứng dụng từ GitHub:

git clone https://github.com/dagger/hello-dagger.git

2.Chuyển sang thư mục mới hello-daggervà tạo một cithư mục mới để chứa các tập lệnh:

cd hello-dagger
mkdir ci

Tạo và kiểm tra đường ống Dagger cho ứng dụng

Máy khách Dagger cho phép người dùng tạo chương trình Python nhiều giai đoạn để xác định, kiểm tra và xây dựng ứng dụng. Phần này của hướng dẫn chưa công bố ứng dụng. Điều quan trọng là phải kiểm tra ứng dụng trước để đảm bảo ứng dụng được xây dựng đúng cách. Để tạo đường ống mới, hãy làm theo các bước sau.

1.Điều hướng đến hello-dagger/cithư mục, tạo một main.pytệp dự án Python mới và mở tệp trong nanotrình soạn thảo văn bản:

cd ~/hello-dagger/ci
nano main.py

2.Ở đầu tệp, thêm importcác câu lệnh bắt buộc, bao gồm import daggerlệnh để nhập Dagger SDK:

import sys
import anyio
import dagger

3.Xác định một mainthói quen, tạo một đối tượng cấu hình Dagger và xác định stdoutlà luồng đầu ra:

async def main():
    config = dagger.Config(log_output=sys.stdout)

Tạo một máy khách Dagger bằng cách sử dụng dagger.Connection, truyền cho nó configđối tượng làm cấu hình mặc định. Tạo một vùng chứa máy khách mới với các tham số sau:

  • Đặt container dựa trên node:16-slimhình ảnh bằng from_phương pháp này. Phương pháp này cũng khởi tạo container.
  • Sử dụng with_directoryphương pháp này để chỉ định cả thư mục dùng làm nguồn và vị trí gắn kết bên trong vùng chứa.
  • Chỉ định thư mục hiện tại làm nguồn của ứng dụng bằng cách sử dụng chuỗi client.host().directory(".").
  • Gắn ứng dụng vào bên trong /srcthư mục của vùng chứa.
  • Loại trừ các thư mục node_modulesvà cinội dung không liên quan khỏi quy trình này.

Thêm các dòng sau vào tệp để gắn mã nguồn vào thư srcmục của node:16-slimvùng chứa:

async with dagger.Connection(config) as client:
    source = (
        client.container()
        .from_("node:16-slim")
        .with_directory(
            "/src",
            client.host().directory("."),
            exclude=["node_modules/", "ci/"],
        )
    )

Ghi chú: Dagger Python SDK sử dụng rộng rãi một kỹ thuật được gọi là phương thức nối chuỗi . Các phương thức được xử lý theo thứ tự xuất hiện. Các phương thức tiếp theo tác động lên đối tượng được trả về trong phương thức trước đó.

5.Giai đoạn tiếp theo của pipeline sử dụng npm installđể cài đặt các phụ thuộc ứng dụng bên trong container. with_workdirPhương pháp này cho Dagger biết nơi bên trong container để chạy lệnh. with_execPhương pháp này cho Dagger biết chạy npm installtại vị trí đó. Thêm các dòng sau vào tập lệnh:

runner = source.with_workdir("/src").with_exec(["npm", "install"])

6.Phần cuối cùng của tập lệnh Python tự động chạy một bộ kiểm thử đối với ứng dụng. Lệnh này sử dụng with_execlại phương pháp này, với npm test --watchAll=falsetư cách là lệnh kiểm thử. Nếu lỗi xảy ra, thông tin chi tiết sẽ được in ra bảng điều khiển thông qua stderrluồng và đường ống sẽ kết thúc. Ở cuối tệp, hãy thêm lệnh gọi vào mainquy trình:

        out = await runner.with_exec(["npm", "test", "--", "--watchAll=false"]).stderr()
        print(out)

anyio.run(main)

7.Toàn bộ tập tin sẽ trông như thế này:

import sys
import anyio
import dagger

async def main():
    config = dagger.Config(log_output=sys.stdout)

    async with dagger.Connection(config) as client:
        source = (
            client.container()
            .from_("node:16-slim")
            .with_directory(
                "/src",
                client.host().directory("."),
                exclude=["node_modules/", "ci/"],
            )
        )

        runner = source.with_workdir("/src").with_exec(["npm", "install"])

        out = await runner.with_exec(["npm", "test", "--", "--watchAll=false"]).stderr()
        print(out)

anyio.run(main)

Đảm bảo thụt lề đúng cách ở mỗi dòng.

Khi hoàn tất, nhấn CTRLX, tiếp theo là Ythen Enterđể lưu tệp và thoát nano.

8.Quay lại hello-daggerthư mục dự án chính và chạy tập lệnh Python bằng cách sử dụng python3 ci/main.py:

cd ~/hello-dagger
python3 ci/main.py

Không có lỗi nào được phát hiện và tất cả npmcác bài kiểm tra đều phải vượt qua:

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.896 s
Ran all test suites.

Ghi chú: Vì Dagger trước tiên phải yêu cầu Docker tải xuống node:16-slimcontainer, nên có thể mất vài phút trước khi npm installlệnh chạy. Các lần chạy tiếp theo của chương trình này mất ít thời gian hơn.

Thêm Giai đoạn Xây dựng vào Đường ống

Sau khi các thành phần chính của pipeline đã được tạo, như đã mô tả trong phần trước, đã đến lúc thêm giai đoạn build. Hầu hết các main.pytệp vẫn giữ nguyên trong phiên bản tệp này. Tuy nhiên, đầu ra của giai đoạn kiểm tra không còn được gửi đến đầu ra chuẩn nữa. Thay vào đó, nó đưa vào giai đoạn build của pipeline. Để thêm chỉ thị build vào tệp, hãy làm theo các bước sau.

1.Mở main.pytệp đã sử dụng ở phần trước:

nano ~/hello-dagger/ci/main.py

2.Thực hiện những thay đổi sau:

  • Tệp tin vẫn giữ nguyên cho đến khi runner.with_execthực hiện lệnh.
  • Xóa lệnh out = await runner.with_exec(["npm", "test", "--", "--watchAll=false"]).stderr()và thêm dòng sau. Đây là lệnh tương tự ngoại trừ kết quả được gán cho testđối tượng.
  • Xóa print(out)lệnh vì câu lệnh này được đưa lại vào sau trong chương trình mới.
test = runner.with_exec(["npm", "test", "--", "--watchAll=false"])

3.Thêm hướng dẫn mới để xây dựng ứng dụng bao gồm các chi tiết sau:

  • Sử dụng with_execphương thức để xác định npm run buildlệnh xây dựng.
  • Lưu trữ kết quả trong /buildthư mục của container bằng directoryphương pháp. Thư mục mới được gán cho build_dir.
  • Phương pháp này exportghi nội dung của thư mục trở lại thư ./buildmục trên máy chủ. awaitTừ khóa yêu cầu đường ống chờ hoạt động hoàn tất trước khi tiếp tục.
  • Phương pháp này entriestrích xuất danh sách đầy đủ các thư mục từ buildthư mục và ghi danh sách trở lại bảng điều khiển.
        build_dir = (
            test.with_exec(["npm", "run", "build"])
            .directory("./build")
        )

        await build_dir.export("./build")
        e = await build_dir.entries()
        print(f"build dir contents:\n{e}")

anyio.run(main)

4.Sau khi phần xây dựng mới được thêm vào, toàn bộ tệp sẽ giống như ví dụ sau:

import sys
import anyio
import dagger

async def main():
    config = dagger.Config(log_output=sys.stdout)

    async with dagger.Connection(config) as client:
        source = (
            client.container()
            .from_("node:16-slim")
            .with_directory(
                "/src",
                client.host().directory("."),
                exclude=["node_modules/", "ci/"],
            )
        )

        runner = source.with_workdir("/src").with_exec(["npm", "install"])

        test = runner.with_exec(["npm", "test", "--", "--watchAll=false"])

        build_dir = (
            test.with_exec(["npm", "run", "build"])
            .directory("./build")
        )

        await build_dir.export("./build")
        e = await build_dir.entries()
        print(f"build dir contents:\n{e}")

anyio.run(main)

5.Quay lại hello-daggerthư mục và chạy lại tập lệnh Python:

cd ~/hello-dagger
python3 ci/main.py

Tập lệnh hiển thị danh sách các thư mục bên trong thư mục build:

build dir contents:
['asset-manifest.json', 'favicon.ico', 'index.html', 'logo192.png', 'logo512.png', 'manifest.json', 'robots.txt', 'static']

Ghi chú: Phần đầu tiên của tập lệnh sẽ chạy nhanh hơn vì không cần phải tải xuống container. Tuy nhiên, quá trình xây dựng thường mất khoảng một phút để hoàn tất.

Xuất bản Container vào Registry

Tại thời điểm này, Dagger pipeline tạo, kiểm tra và xây dựng ứng dụng. Pipeline đã rất hữu ích và thậm chí có thể được coi là hoàn chỉnh. Tuy nhiên, Dagger cũng có thể xuất bản container vào sổ đăng ký để tạo quy trình làm việc được tối ưu hóa hơn nữa.

Trước khi xuất bản container, bản dựng ứng dụng được sao chép vào nginxcontainer. Bất kỳ chi tiết xác thực nào cũng phải được xác định trước.

Ví dụ này công bố hướng dẫn về sổ đăng ký Harbor. Harbor là một nền tảng sổ đăng ký container nhẹ và dễ sử dụng có thể được cài đặt trên một hệ thống riêng biệt. Nó cung cấp lưu trữ đám mây, công cụ ký và quét, bảo mật, kiểm soát truy cập, cơ chế kiểm toán và quản lý container. Nó cho phép quản trị viên kiểm soát sổ đăng ký của riêng họ và giữ nó trên cùng một mạng với các hệ thống phát triển của họ. Để biết thêm thông tin về cách sử dụng sổ đăng ký, hãy xem tài liệu Harbor .

Để xuất bản ứng dụng, hãy làm theo các bước sau.

1.Mở lại tệp main.py:

nano ~/hello-dagger/ci/main.py

2.Ngay bên dưới phần bắt đầu của async with dagger.Connection(config) as client:khối, thêm chi tiết mật khẩu. Sử dụng set_secretphương pháp để cung cấp mật khẩu đăng ký. Các tham số phải là chuỗi passwordtrong dấu ngoặc kép, theo sau là mật khẩu thực tế cho tài khoản Harbor. Chuỗi passwordcho Dagger biết loại bí mật nào đang được xác định. Gán kết quả cho secretbiến.

secret = client.set_secret("password", "HARBORPASSWORD")

3.Thay đổi tiếp theo áp dụng cho giai đoạn xây dựng. Những thay đổi sau đây là bắt buộc đối với phần này của đường ống:

  • Không gán kết quả của bản dựng cho build_dirbiến. Thay vào đó, hãy đợi tất cả các hoạt động xây dựng, bao gồm cả việc xuất thư mục trở lại máy chủ, hoàn tất.
  • Thay thế lệnh gán thư mục build_dirbằng các dòng sau.
  • Xóa phần còn lại của mainhàm, cho đến lệnh anyio.run(main). Xóa hai awaitchỉ thị không đồng bộ và printlệnh.
await (
    test.with_exec(["npm", "run", "build"])
    .directory("./build")
    .export("./build")
)

4.Xác định một container mới dựa trên nginx:1.23-alpinehình ảnh và đóng gói ứng dụng vào container này. Thêm các chi tiết sau:

  • Phần này tạo một container mới dựa trên nginx:1.23-alpinehình ảnh. Sử dụng cú pháp client.container().from_("nginx:1.23-alpine")để khởi tạo container.
  • Sử dụng .with_directoryphương pháp này để ghi buildthư mục vào thư mục gốc htmlNGINX bên trong vùng chứa.
  • Gán vùng chứa cho ctrbiến.
ctr =  (
    client.container()
    .from_("nginx:1.23-alpine")
    .with_directory("/usr/share/nginx/html", client.host().directory("./build"))
)

5.Để xuất bản container lên sổ đăng ký, hãy sử dụng các phương thức with_registry_authvà publish. Ví dụ này sử dụng Harbor làm sổ đăng ký mục tiêu, nhưng container có thể được xuất bản lên bất kỳ sổ đăng ký nào tương thích với Docker. Thêm phần sau vào tệp, tính đến các thay đổi sau:

  • Đính kèm thông tin chi tiết vào awaitlệnh gọi không đồng bộ.
  • Đối với tham số đầu tiên của with_registry_authphương pháp, hãy cung cấp tên miền của sổ đăng ký theo định dạng registrydomainname/project/repository:tag. Thay thế registrydomainnamebằng tên miền Harbor của bạn, projectbằng tên dự án và repositorybằng tên kho lưu trữ để xuất bản. tagTrường này là tùy chọn.
  • Đối với các tham số còn lại, hãy thêm tên người dùng cho tài khoản Harbor cùng với secretbiến. Trong ví dụ này, tên tài khoản là admin.
  • Trong ví dụ này, example.com/dagger/daggerdemo:maincó nghĩa là container được xuất bản vào daggerdemokho lưu trữ bên trong daggerdự án trong example.comsổ đăng ký. Container được gắn thẻ bằng mainthẻ.
  • Trong publishphương pháp này, hãy chỉ ra nơi xuất bản container. Thông tin này tuân theo cùng định dạng như thông tin đăng ký with_registry_authvà phải lặp lại các chi tiết giống nhau.
        addr = await (
            ctr
            .with_registry_auth("example.com/dagger/daggerdemo:main", "admin", secret)
            .publish("example.com/dagger/daggerdemo:main")
        )
    print(f"Published image to: {addr}")

anyio.run(main)

Ghi chú: Trước khi xuất bản một container lên sổ đăng ký Harbor, bạn phải tạo một dự án để chứa container. Ví dụ này xuất bản container lên daggerdemokho lưu trữ bên trong daggerdự án. Nếu daggerchưa tồn tại, yêu cầu sẽ không thành công.

6.Toàn bộ tệp phải tương tự như ví dụ sau. Thay thế example.combằng tên miền của sổ đăng ký Harbor và HARBORPASSWORDbằng mật khẩu thực tế của sổ đăng ký.

import sys
import anyio
import dagger

async def main():
    config = dagger.Config(log_output=sys.stdout)

    async with dagger.Connection(config) as client:
        secret = client.set_secret("password", "HARBORPASSWORD")
        source = (
            client.container()
            .from_("node:16-slim")
            .with_directory(
                "/src",
                client.host().directory("."),
                exclude=["node_modules/", "ci/"],
            )
        )

        runner = source.with_workdir("/src").with_exec(["npm", "install"])

        test = runner.with_exec(["npm", "test", "--", "--watchAll=false"])

        await (
            test.with_exec(["npm", "run", "build"])
            .directory("./build")
            .export("./build")
        )

        ctr =  (
            client.container()
            .from_("nginx:1.23-alpine")
            .with_directory("/usr/share/nginx/html", client.host().directory("./build"))
        )

        addr = await (
            ctr
            .with_registry_auth("example.com/dagger/daggerdemo:main", "admin", secret)
            .publish("example.com/dagger/daggerdemo:main")
        )
    print(f"Published image to: {addr}")

anyio.run(main)

Lưu tệp và thoát nanokhi hoàn tất.

7.Từ hello-daggerthư mục, chạy lại tập lệnh Python. Tập lệnh sẽ xây dựng vùng chứa và đẩy nó ra sổ đăng ký. Toàn bộ quá trình có thể mất vài phút để hoàn tất. Khi hoàn tất, tập lệnh sẽ hiển thị tên và thẻ được tạo cho hình ảnh. Ghi lại tên và thẻ vùng chứa đầy đủ để sử dụng sau này.

cd ~/hello-dagger
python3 ci/main.py

Published image to: example.com/dagger/daggerdemo:main@sha256:eb8dbf08fb05180ffbf56b

8.Xác nhận container đã được xây dựng và tải lên thành công. Sử dụng docker runlệnh để kéo container trở lại máy chủ và chạy ứng dụng. Chỉ định tên container và địa chỉ chính xác được chỉ định trong đầu ra của main.pytập lệnh.

docker run -p 8080:80 example.com/dagger/daggerdemo:main@sha256:eb8dbf08fb05180ffbf56b602ee320ef5aa89b8f972f553e478f6b64a492dd50

Điều hướng đến cổng 8080của nút, sử dụng địa chỉ IP hoặc tên miền đủ điều kiện. Trình duyệt sẽ hiển thị trang web “Welcome to Dagger”.

Phần kết luận

Dagger cung cấp một khuôn khổ đa ngôn ngữ cho tự động hóa CI/CD trong một bối cảnh chứa. Nó bao gồm các khả năng để xây dựng một đường ống lắp ráp, kiểm tra, xây dựng và xuất bản một ứng dụng bằng một tập lệnh duy nhất. Dagger bao gồm các SDK cho Python, Go và Node.js, cùng với một API GraphQL để tích hợp cấp thấp với các ngôn ngữ khác. Để biết thêm thông tin về cách sử dụng Dagger, hãy tham khảo Tài liệu Dagger .

Thông tin thêm

Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.