以下の内容はhttps://cream-worker.blog.jp/tag/AlmaLinuxより取得しました。


AlmaLinux8のローカルリポジトリのモジュール問題

AlmaLinux8というかRHEL8かな。

企業の本番環境って割とネットと遮断されている事が多いので、パッケージのアップデートとかインストールなんかをオフラインでやる必要がある。

その際、一般的(?)にはローカルにRPM持って来てリポジトリ作ってやると思うのですが、RHEL8系だとモジュール管理されてるパッケージのリポジトリって作るの無理だと思うのでその辺の内容を特筆。

いつもは、RPM持ってきた後に createrepo でローカルリポジトリを作るのですが、一部のモジュールが入ってると、下記の様なエラーがでる。

Problem 1: cannot install both perl-libs-4:5.24.4-404.module+el8.1.0+2926+ce7246ad.x86_64 and perl-libs-4:5.26.3-416.el8.x86_64
  - package perl-Digest-1.17-396.module+el8.1.0+2926+ce7246ad.noarch requires perl(:MODULE_COMPAT_5.24.4), but none of the providers can be installed
  - cannot install the best update candidate for package perl-libs-4:5.26.3-416.el8.x86_64
  - cannot install the best update candidate for package perl-Digest-1.17-395.el8.noarch

で、これの原因(?)がcreaterepoだとmodule.ymlが作成されてなくて、モジュールのメタ情報を参照できないってことみたい。

なので、RPMなりを持ってきた際に、該当リポジトリのキャッシュが下記の様な場所に出来るのですが、そこにリポジトリのmodule.ymlが入ってるので、それをコピーしてローカルリポジトリでモジュールのメタ情報を作るって流れが一番手っ取り早そう。

参考: https://bugzilla.redhat.com/show_bug.cgi?id=1795936

具体的には例えば、

# とりあえずパッケージの依存関係全て含んだDLしてローカルリポジトリを更新
sudo dnf download --alldeps --resolve --disablerepo=myhogealma git
sudo cp -f /var/tmp/repowork/* /usr/local/myhogerepo/Packages/
sudo createrepo --update /usr/local/myhogerepo

# 下記の場所にキャッシュが出来てるので、そこからmodules.yaml.gzをコピってくる
gunzip -c /var/cache/dnf/appstream-..../repodata/.....-modules.yaml.gz > /tmp/appstream-modules.yaml

# そしたらローカルリポジトリにyamlを格納して
sudo mv /tmp/appstream-modules.yaml /usr/local/myhogerepo/
cd /usr/local/myhogerepo/
sudo mv appstream-modules.yaml modules.yaml

# モジュールメタ情報の更新する
sudo modifyrepo_c --mdtype=modules modules.yaml repodata/
sudo createrepo --update /usr/local/myhogerepo
sudo dnf clean all

これでmoduleのメタ情報がないよエラーは解消できた。

絶対まともなやりかたじゃない(笑

でもこれしか楽なやり方が思いつかなかった。

まー、問答無用でリモートリポジトリのミラーサイトをローカルに作っちゃえばよいのですが、

とんでもないサイズになるので、資源持ち込んだりを考えるとやりにくいんですよね。

なので必要なパッケージだけに絞りたいわけで。。。


RHEL9系からはcreaterepoだけで上手くいくんですけどね。。。

AlmaLinux9 Podman4でdocker-composeを動かす

ネット見てると色々やり方書いてあるのですが、"現時点(2022/8/8)"だと上手くいかないので特筆。

AlmaLinux 9 のminimalで実施。

あんまり良くないやり方のような気もするのですが、これしか上手くいく方法がなかった。

多分、ルートレス起動にしないとダメなのかしら。

結論のコマンド類まとめ(ユーザグループをrootにする版)

# update
sudo dnf update -y

# podmanのもろもろインストール
sudo dnf install podman podman-plugins podman-docker podman-remote -y

# podman本体の動作確認
podman --version
podman run hello-world

# docker-compose のインストール
sudo curl -L https://github.com/docker/compose/releases/download/v2.8.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# podmanのunix socketのサービス有効化
sudo systemctl enable --now podman.socket
systemctl status podman.socket

# リンク確認(/var/run/docker.sock: symbolic link to /run/podman/podman.sock)
sudo file /var/run/docker.sock

# パーミッション周り
sudo usermod -aG root ${USER}
sudo chmod 770 /var/run/podman

# 確認(jsonの文字列が返ってくればOK)
sudo curl --unix-socket /var/run/docker.sock http:/v1.41/info

# .bashrcに以下を追記
export DOCKER_BUILDKIT=0

# sourceの読み込みなおし
. ~/.bashrc

とりあえず、これでdocker-composeが動くようになる。

結論のコマンド類まとめ(ユーザグループ変えない版)

# update
sudo dnf update -y

# podmanのもろもろインストール
sudo dnf install podman podman-plugins podman-docker podman-remote -y

# podman本体の動作確認
podman --version
podman run hello-world

# docker-compose のインストール
sudo curl -L https://github.com/docker/compose/releases/download/v2.8.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# podmanのunix socketのサービス有効化
systemctl --user enable --now podman.socket

# サービスの起動確認
systemctl --user status podman.socket

# .bashrcに以下を追記(DOCKER_HOSTは上記statusでLISTEN:のパス)
export DOCKER_BUILDKIT=0
export DOCKER_HOST=unix:///run/user/1000/podman/podman.sock

# sourceの読み込みなおし
. ~/.bashrc


もろもろのエラーとか

podmanとdocker-compose入れて、「sudo systemctl enable --now podman.socket」だと、docker-compose buildとかupで下記のパーミッションのエラーが出る。

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.project%3Dwsample%22%3Atrue%7D%7D&limit=0": dial unix /var/run/docker.sock: connect: permission denied

これをやるのにdockerの場合は「sudo usermod -aG docker ${USER}」みたいにするのですが、

podmanだとそもそもこれが無いので、実行ユーザでsocketのサービスを作る。

あと、これだとデフォでdocker-composeが見てるパスと変わっちゃうので、環境変数のDOCKER_HOSTで見る先を変更する。

上記を行うとパーミッションはクリアするのですが、次は下記エラーが出る。

listing workers for Build: failed to list workers: Unavailable: connection error: desc = "transport: Error while dialing unable to upgrade to h2c, received 404"

で、これのISSUEが下記。

https://github.com/containers/podman/issues/13889

どうも、podman4からセキュアなビルドを出来るようにしたらしく、これが悪さしてる模様。

なので、docker-compose を実行するユーザで、下記の環境変数を設定する。

export DOCKER_BUILDKIT=0

常時やりたい場合は「.bashrc」とかに書いておけば良いかな?


podman3でRHEL8.6くらいは問題なかったみたいですが、最新のバージョンだと色々無理っぽい。

確実に超絶無理矢理なやり方なので、何かいい方法ないかなー。

参考: RHEL公式DOC




以上の内容はhttps://cream-worker.blog.jp/tag/AlmaLinuxより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14