nakayumcの技術ブログ

エンジニア2年目のブログです。

ansible-builder 3系 で /usr/bin/dnf: No such file or directory で失敗する

はじめに

Ansible の ExecutionEnvironment をビルドするツールである ansible-builder がメジャーアップデートされ、 3.0.0 がリリースされました。

いままで ansible-builder の 1系を使っていたので、お試しで ansible-builder 3 を触ってビルドしてみたところ、/usr/bin/dnf: No such file or directory というエラーで失敗したのでメモします。

環境

  • ansible-builder 3.0.0
  • docker 24.0.2
  • EEベースイメージ: quay.io/centos/centos:stream9

事象

execution-environment.yml を以下のように記述してビルドを実行したところ、エラーになってしまいました。

---
version: 3

images:
  base_image:
    name: quay.io/centos/centos:stream9
dependencies:
  galaxy:
    collections:
      - name: community.general
        version: 6.4.0
  python:
    - ansible-lint==5.4.0
  system:
    - git
additional_build_files:
  - src: ./ansible.cfg
    dest: configs
additional_build_steps:
  prepend_base:
    - ADD _build/configs/ansible.cfg ~/.ansible.cfg
  prepend_final:
    - RUN whoami
    - RUN cat /etc/os-release
  append_final:
    - RUN echo This is a post-install command!
    - RUN ls -la /etc
ansible-builder build -t nakayumc0278/custom-ee:001

エラーメッセージ

#26 3.830 + /usr/bin/dnf install -y dnf gcc git krb5-devel ・・・
#26 3.830 /output/scripts/assemble: line 75: /usr/bin/dnf: No such file or directory
#26 ERROR: process "/bin/sh -c /output/scripts/assemble" did not complete successfully: exit code: 127
ERROR: failed to solve: process "/bin/sh -c /output/scripts/assemble" did not complete successfully: exit code: 127

結論から書くと、ansible-builder の 3系では、パッケージマネージャーがデフォルトで /usr/bin/dnf になっていて、ベースイメージに dnf が入っていないためでした。

ベースイメージのパッケージ一覧を確認してみると、確かに dnf は入っていませんが、microdnf というものが入っています。なにやら dnf よりも軽量なパッケージマネージャーで docker イメージのサイズを小さくするために使われているようでした。

また、RHEL のアップストリーム版である Fedora では、dnfmicrodnf に置き換わる計画をしているようです。 近いうちに microdnf に置き換わるのかもしれません。

解決策

上の画像にもありますが、 ベースイメージには、dnf の軽量版である microdnf が入っています。

execution-environment.yml に optionspackage_manager_pathmicrodnf を指定して追記することで解決できました。

追記後の execution-envoronment.yml

---
version: 3

images:
  base_image:
    name: quay.io/centos/centos:stream9
dependencies:
  galaxy:
    collections:
      - name: community.general
        version: 6.4.0
  python:
    - ansible-lint==5.4.0
  system:
    - git
options:
  package_manager_path: /usr/bin/microdnf # 追記
additional_build_files:
  - src: ./ansible.cfg
    dest: configs
additional_build_steps:
  prepend_base:
    - ADD _build/configs/ansible.cfg ~/.ansible.cfg
  prepend_final:
    - RUN whoami
    - RUN cat /etc/os-release
  append_final:
    - RUN echo This is a post-install command!
    - RUN ls -la /etc

実行結果

#34 [final 13/13] RUN rm -rf /output
#34 DONE 0.5s

#35 exporting to image
#35 exporting layers
#35 exporting layers 2.1s done
#35 writing image sha256:126e70fa982cc99b488f740f828282efe390249f1ee97e3592d35e29c0fa3b5c done
#35 naming to docker.io/nakayumc0278/ee001 done
#35 DONE 2.1s

Complete! The build context can be found at: /home/nakayumc/container/context