tag:crieit.net,2005:https://crieit.net/tags/GPG%E7%BD%B2%E5%90%8D/feed 「GPG署名」の記事 - Crieit Crieitでタグ「GPG署名」に投稿された最近の記事 2022-02-23T00:12:52+09:00 https://crieit.net/tags/GPG%E7%BD%B2%E5%90%8D/feed tag:crieit.net,2005:PublicArticle/18121 2022-02-23T00:12:52+09:00 2022-02-23T00:12:52+09:00 https://crieit.net/posts/error-at-install-mysql-community-server-import-rpm-pgp-key-20220223 Docker で MySQL の community版をインストールしようとした際に Failing package is: ... エラー <p>Docker の MySQL コンテナを構築する Dockerfile を走らせようとしたところ、</p> <blockquote> <p>The GPG keys listed for the "MySQL 8.0 Community Server" repository are already installed but they are not correct for this package.</p> </blockquote> <p>や</p> <blockquote> <p>Public key for mysql-community-client-8.0.28-1.el8.x86_64.rpm is not installed. Failing package is: mysql-community-client-8.0.28-1.el8.x86_64</p> </blockquote> <p>というエラーが発生してしまったので対処。</p> <h3 id="改修前の Dockerfile"><a href="#%E6%94%B9%E4%BF%AE%E5%89%8D%E3%81%AE+Dockerfile">改修前の Dockerfile</a></h3> <pre><code class="dockerfile">RUN dnf -y localinstall https://dev.mysql.com/get/mysql80-community-release-el8-2.noarch.rpm </code></pre> <p>コミュニティ版の MySQL8 をインストールしようとしています。</p> <h3 id="改修後の Dockerfile"><a href="#%E6%94%B9%E4%BF%AE%E5%BE%8C%E3%81%AE+Dockerfile">改修後の Dockerfile</a></h3> <pre><code class="dockerfile">RUN rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 && dnf -y localinstall https://dev.mysql.com/get/mysql80-community-release-el8-2.noarch.rpm </code></pre> <p>エラー文で検索したところ、</p> <pre><code class="bash">rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 </code></pre> <p>を追加すると良い、という記事を見かけたので追加したところ、エラーが発生しなくなったのでこれで対処。</p> <h3 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://support.cpanel.net/hc/en-us/articles/4419382481815-MySQL-GPG-keys-expired-preventing-installation-upgrade-of-MySQL-packages-from-the-official-repository-">MySQL GPG keys expired, preventing installation\/upgrade of MySQL packages from the official repository. – cPanel</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://support.cpanel.net/hc/en-us/articles/4419382481815-Installer-fails-due-to-The-GPG-keys-listed-for-the-MySQL-repository-are-already-installed-but-they-are-not-correct-for-this-package-">MySQL GPG keys expired, preventing installation\/upgrade of MySQL packages from the official repository. – cPanel</a></li> </ul> <p>URLは異なりますがどちらも同じ内容の模様。</p> arm-band tag:crieit.net,2005:PublicArticle/17932 2022-01-12T00:06:20+09:00 2022-01-12T00:06:20+09:00 https://crieit.net/posts/centos-onelinear-ternary-and-compoare-operator-20220112 CentOS の bash で比較演算と三項演算子的な処理を使って変数に代入する値を分岐するワンライナー <p><a href="https://crieit.net/posts/diverting-date-as-args-in-dockerfile-20211230">Dockerfile 内でコンテナの時刻を変数として流用し、年に対応した rpmパッケージ の GPG署名 をインストールする</a>で試験した内容の続きとなります。</p> <ul> <li><code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021</code>: OK</li> <li><code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi2022</code>: Not Found.</li> </ul> <p>remiリポジトリのGPG署名が2022年版が存在しないので、条件分岐で2021を最大値とするように処理を書いてみました。</p> <h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2> <pre><code class="bash"># date 2022年 1月 11日 火曜日 20:42:53 JST </code></pre> <p>今回の検証環境はこのような表示がされる CentOS の日本語版の環境。</p> <pre><code class="bash"># NOWYEAR=$(sudo date | sudo awk 'END{print $1}' | sudo sed -e 's/年//g') && [ ${NOWYEAR} -gt 2021 ] && ALTERYEAR=2021 || ALTERYEAR=${NOWYEAR} && echo ${ALTERYEAR} 2021 </code></pre> <p>早速完成したワンライナーですが、このようになりました。</p> <h2 id="説明"><a href="#%E8%AA%AC%E6%98%8E">説明</a></h2> <p>わりと複雑になってしまったので順番に読んでいきます。</p> <pre><code class="bash">NOWYEAR=$(sudo date | sudo awk 'END{print $1}' | sudo sed -e 's/年//g') \ # date コマンドの結果から、 awk でスペース区切り1つ目の値(2022年) を抽出し、 `sed -e` で`年`を落とす。結果、`2022`が得られる && [ ${NOWYEAR} -gt 2021 ] && ALTERYEAR=2021 || ALTERYEAR=${NOWYEAR} \ # 三項演算子的な処理。 {コマンドとして実行可能な式} && {前述式が true の場合の処理} || {前述式が false の場合の処理} 。今回は得られた現在の年が2021年以降ならば2021を変数に代入、そうでなければ現在の年を変数代入 && echo ${ALTERYEAR} # 上の三項演算子的な処理で代入された変数の値を echo </code></pre> <p>こんな感じです。</p> <pre><code class="dockerfile">RUN MELUSINE=$(sudo date | sudo awk 'END{print $6}') \ && [ ${NOWYEAR} -gt 2021 ] && ALTERYEAR=2021 || ALTERYEAR=${NOWYEAR} \ && rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm \ && rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi${ALTERYEAR} </code></pre> <p>今回はこんな感じで <code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021</code> か、 <code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi{2020以下}</code> かを読み込む分岐に。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.pmi-sfbac.org/arithmetic-comparison/">【Shellスクリプト】演算子「算術演算子」「比較演算子」について! | Beエンジニア</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://eng-entrance.com/linux-shellscript-replacement">【Linux】シェルスクリプトによる文字列処理:置換や削除をする方法</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17901 2021-12-30T01:05:47+09:00 2021-12-30T01:07:46+09:00 https://crieit.net/posts/diverting-date-as-args-in-dockerfile-20211230 Dockerfile 内でコンテナの時刻を変数として流用し、年に対応した rpmパッケージ の GPG署名 をインストールする <p>Dockerコンテナ をビルドする際にコンテナ内の時刻(年)を他のコマンドに流用したくなりました。その方法をいくつか試したのでメモしておきます。</p> <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>AlmaLinux で PHP7.4系 をインストールする際に Remiリポジトリ からインストールしようとしました。</p> <pre><code class="dockerfile">RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm && \ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 # disable default module RUN dnf module reset -y php # install php 7.4 RUN dnf module install -y php:remi-7.4 </code></pre> <p><code>rpm</code> を使用して Remiリポジトリ をインストールしています。</p> <p><code>rpm</code> ではパッケージインストールではパッケージが破損していないか、改ざんされていないかをチェックするために GPG署名 を用いています。</p> <p>その公開鍵の取得も、 Remiリポジトリ のインストールと同時に行っています。</p> <pre><code class="dockerfile">RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm && \ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 </code></pre> <p>ここでふと思ったのは、URLに年が入っていること。2022年になったら</p> <pre><code class="dockerfile">RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm && \ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2022 </code></pre> <p>に変えたい。かといってそれを毎年手動で更新するのは面倒なので、自動化したい。</p> <p>であれば、 <code>date</code> コマンドの値を <code>awk</code> に通すなどして年だけ取り出し、それを上述コマンドに流用できないか、と。</p> <h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2> <p>まずは AlmaLinux のコンテナをビルド・起動します。</p> <pre><code class="bash">docker run --name yeartest -it almalinux:8 /bin/bash </code></pre> <pre><code class="bash"># \cp -pf /usr/share/zoneinfo/Japan /etc/localtime ## タイムゾーン変更 # dnf -y update && yum -y install sudo epel-release ## 略 </code></pre> <p>パッケージを入れたり前準備。</p> <h3 id="date から年のみ取り出す"><a href="#date+%E3%81%8B%E3%82%89%E5%B9%B4%E3%81%AE%E3%81%BF%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99">date から年のみ取り出す</a></h3> <pre><code class="bash"># date Wed Dec 29 22:28:18 JST 2021 </code></pre> <p>普通に <code>date</code> を叩きます。ふむ、6番目ですね……。</p> <pre><code class="bash"># sudo date | sudo awk '{print $6}' 2021 </code></pre> <p>そこでパイプで繋いで <code>awk</code> に渡します。無事、年のみを取り出せました。</p> <h3 id="rpm の GPG署名 について"><a href="#rpm+%E3%81%AE+GPG%E7%BD%B2%E5%90%8D+%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">rpm の GPG署名 について</a></h3> <p>一応インポートされている GPG署名 について確認しておきます。</p> <pre><code class="bash"># rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e </code></pre> <p>まずデフォルトの状態。1つのみインポートされていますね。</p> <pre><code class="bash"># rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 # rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 </code></pre> <p>次に <code>RPM-GPG-KEY-remi2021</code> をインポートします。増えました。</p> <pre><code class="bash"># rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi # rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 gpg-pubkey-00f97f56-467e318a </code></pre> <p>さらに <code>RPM-GPG-KEY-remi</code> をインポートすると増えました。</p> <h2 id="検証2"><a href="#%E6%A4%9C%E8%A8%BC2">検証2</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/test-docker-tychedight">Tychedight</a></li> </ul> <p>以上を踏まえて、 Docker Compose からの Dockerfile ビルドで試験。</p> <pre><code class="dockerfile">FROM almalinux:8 RUN \cp -pf /usr/share/zoneinfo/Japan /etc/localtime RUN dnf -y update && yum -y install \ sudo \ epel-release RUN mkdir /home/temp/ # パターン1 RUN GEOFFROY=$(sudo date | sudo awk 'END{print $6}') \ && sudo echo ${GEOFFROY} >> /home/temp/geoffroy.txt # パターン2 RUN FROMONT=$(sudo date | sudo awk 'END{print $6}') RUN sudo echo ${FROMONT} >> /home/temp/fromont.txt # パターン3 RUN sudo echo \ | sudo date \ | sudo awk 'END{print $6}' \ >> /home/temp/carillon.txt </code></pre> <p>一応3つパターンを試してみます。さあ、それぞれのファイルには何が出力されるのか……。</p> <pre><code class="dockerfile"># パターン1 RUN GEOFFROY=$(sudo date | sudo awk 'END{print $6}') \ && sudo echo ${GEOFFROY} >> /home/temp/geoffroy.txt # 2021 # パターン2 RUN FROMONT=$(sudo date | sudo awk 'END{print $6}') RUN sudo echo ${FROMONT} >> /home/temp/fromont.txt # # パターン3 RUN sudo echo \ | sudo date \ | sudo awk 'END{print $6}' \ >> /home/temp/carillon.txt # 2021 </code></pre> <p>結果、意図した出力になったのは1つ目と3つ目のパターンでした。 <code>RUN</code> ごとにコンテナが変わるとのことなので2は望み薄だと思っていましたが……。</p> <p>そこで、パターン1を使って次のように組んでみます。</p> <pre><code class="dockerfile">FROM almalinux:8 RUN \cp -pf /usr/share/zoneinfo/Japan /etc/localtime RUN dnf -y update && yum -y install \ sudo \ epel-release RUN mkdir /home/temp/ # args RUN MELUSINE=$(sudo date | sudo awk 'END{print $6}') \ && rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm \ && rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi${MELUSINE} </code></pre> <p>これでビルド・起動したコンテナに bash で入って確認。</p> <pre><code class="bash"># rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 </code></pre> <p>内容的にデフォルトと2021の公開鍵が入っているように見えます。</p> <pre><code class="bash"># rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi # rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 gpg-pubkey-00f97f56-467e318a </code></pre> <p>手動で <code>RPM-GPG-KEY-remi</code> を入れると増えました。</p> <pre><code class="bash"># rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 # rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 gpg-pubkey-00f97f56-467e318a </code></pre> <p>ついでに手動で <code>RPM-GPG-KEY-remi2021</code> を入れようとしましたが、数は増えませんでした。先のコードで <code>RPM-GPG-KEY-remi2021</code> がインストールできていることが確認できました。OKです。</p> <h2 id="余談"><a href="#%E4%BD%99%E8%AB%87">余談</a></h2> <p>実は上述の通り年指定のない <code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi</code> があるので、それを入れてしまえば終わりのような気もするのですが……折角なのでチャレンジしてみた次第です。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="PHP インストール"><a href="#PHP+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">PHP インストール</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.tsuda1.com/%E6%9C%AA%E5%88%86%E9%A1%9E/php%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/">PHPインストール PHP7.4 CentOS8 | AlmaLinux 自宅サーバ</a></li> </ul> <p>もしかして、そもそもいらない……?</p> <h3 id="rpm と GPG署名"><a href="#rpm+%E3%81%A8+GPG%E7%BD%B2%E5%90%8D">rpm と GPG署名</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s1-check-rpm-sig">B.3. パッケージの署名確認 Red Hat Enterprise Linux 6 | Red Hat Customer Portal</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/aosho235/items/9ba95b6b8fb1ce8ac580">CentOS 7 インストールされている全パッケージのrpmをダウンロードする - Qiita</a> <ul> <li>インポートされた公開鍵の確認</li> </ul></li> <li>参考: <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.kakiro-web.com/linux/centos6-remi-install.html">CentOS6.7 64bitのyumリポジトリにRemiを追加 - Kakiro-Web カキローウェブ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://pentan.info/server/linux/yum/remi.html">Remi 基本リポジトリで提供されていないパッケージのyumインストール - [yum/Linux [Red Hat/CentOSなど]] ぺんたん info</a></li> </ul></li> </ul> arm-band