bouzuya.hatenablog.com

ぼうずやのにっき

GitHub Container Registry でコンテナイメージをリポジトリに LABEL で関連付ける

TL;DR: LABEL org.opencontainers.image.source=https://github.com/OWNER/REPO を含んだ Docker イメージを GitHub Container Registry にプッシュするとリポジトリに関連付けられる。

bouzuya/genuuid では Github Container Registry を使用している。

https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#about-the-container-registry

名前のとおりだけど GitHub による Container Registry だ。 GitHub にコンテナイメージを登録しておくことができる。ぼくは GitHub Packages をコンテナイメージ向けに特化したようなものだと認識している。このコンテナイメージはアカウントごとに格納されるのだけど、リポジトリと関連付けることができる。

いくつかの方法で関連付けできるのだけど、ラベル付けによるものを試した。

https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#labelling-container-images

詳細な手順は↓に書いてあるみたい。

https://docs.github.com/en/packages/learn-github-packages/connecting-a-repository-to-a-package#connecting-a-repository-to-a-container-image-using-the-command-line

要約すると↓ (OWNER / REPO はそれぞれ置換) を Dockerfile に書いておくと良い。

LABEL org.opencontainers.image.source=https://github.com/OWNER/REPO

LABEL 自体は任意の Key Value を指定できる。ただ、ここで指定しているラベル (org.opencontainers.image.source) は OCI Image Format Specification で定められた一般的なものらしい。

https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys

org.opencontainers.image.source URL to get source code for building the image (string)

ぼくは最初マルチステージビルドの中間イメージに LABEL つけてしまって動かなかった (もしかすると他の問題かもしれないけど) 。


bouzuya/genpibouzuya/genuuid をそれぞれバージョンアップした。

axum 0.7.1 -> 0.7.2 と dependabot 設定の追加。


PAST #12 第12回 アルゴリズム実技検定 過去問

use std::{cmp::Reverse, collections::BinaryHeap};

use proconio::input;

fn main() {
    input! {
        n: usize,
        m: usize,
        a: [usize; n],
        blr: [(usize, usize, usize); m],
    };

    let mut edges = vec![vec![]; n + 1];
    for (i, a_i) in a.iter().copied().enumerate() {
        edges[i].push((i + 1, a_i));
    }
    for (b, l, r) in blr {
        edges[l - 1].push((r, b));
    }
    for i in 0..n {
        edges[i + 1].push((i, 0));
    }

    let inf = 1_usize << 60;
    let mut dist = vec![inf; n + 1];
    let mut pq = BinaryHeap::new();
    dist[0] = 0;
    pq.push((Reverse(0), 0));
    while let Some((Reverse(d), u)) = pq.pop() {
        if dist[u] < d {
            continue;
        }
        for (v, w) in edges[u].iter().copied() {
            if dist[v] <= d + w {
                continue;
            }
            dist[v] = d + w;
            pq.push((Reverse(d + w), v));
        }
    }

    let ans = dist[n];
    println!("{}", ans);
}

今日のコミット。