【Docker】エラー対処法: Release file for http://deb.debian.org/debian/dists/buster-updates/InRelease is not valid yet. Updates for this repository will not be applied.

docker-prograshi(プロぐらし)-kv Docker
記事内に広告が含まれていることがあります。
[PR]

Macでは問題なく動いていたDocker上のプロジェクトをWindowsにgit clone して、dcoker-compose upでDockerコンテナを起動しようとしたときに次のようなエラーが発生。

Release file for <package> is not valid yet (invalid for another 9h 53min 7s). Updates for this repository will not be applied.

エラー例

[ 2/14] RUN apt-get update -qq && apt-get install -y nodejs postgresql-client curl apt-transport-https wget:

5 110.2 E: Release file for http://deb.debian.org/debian/dists/buster-updates/InRelease is not valid yet (invalid for another 9h 53min 7s). Updates for this repository will not be applied.

5 110.2 E: Release file for http://security.debian.org/debian-security/dists/buster/updates/InRelease is not valid yet (invalid for another 11h 15min 28s). Updates for this repository will not be applied.

エラーの内容は、対象のパッケージの有効期限が切れているので無視しますという内容。

この対処法について解説しています。

エラーの原因

Windowsのdocker-desktopはWSLという、Windows上でLinuxのディストリビューションを動かすサービスを使っているが、Windowsの時刻と、WSL上のOSの時刻がズレるために発生していることが原因とのこと。

ちなみに、WSLは Windows Subsystem for Linux の略。

エラーの発生タイミングはDcokerfileの RUN apt-get でパッケージをインストールしようとしたタイミング。


対処法

対処法は大きく2つあります。

  1. Dockerfileを編集して時刻の確認処理をしないようにする
  2. マシン(WSL2)の時刻を修正する

Dockerfileを編集して時刻の確認処理をしないようにする

先に、結論からいうと、Dockerfileの RUN apt-get と update の間に次のコードを挿入すれば、エラーを発生させることなくパッケージのインストールを行うことができます。

-o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false
point

RUN apt-get を複数実行している場合は、都度追記が必要です。

実例

# node.jsと必要なライブラリのインストトール
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client \
            curl apt-transport-https wget

# yarnのインストール
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
      echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
      apt-get update && apt-get install -y yarn

 ↓

# node.jsと必要なライブラリのインストトール
RUN apt-get -o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false \
            update -qq && apt-get install -y nodejs postgresql-client \
            curl apt-transport-https wget

# yarnのインストール
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
      echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
      apt-get -o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false \ 
      update && apt-get install -y yarn

Check-Valid-Until と Check-Dateはどちらも、DabianのAPT(パッケージマネージャ)のオプションです。

どちらも時刻に基づいたチェックを行うものです。

Check-Valid-Untilとは?

セキュリティのために時刻を確認するオプション。値をtrueにすると、指定した時間に新しいデータが提供されていない場合は期限切れになったとみなしエラーを返す。

このため、チェックをfalseにする。

Check-Valid-Until (check-valid-until) は、APT がリプレイ攻撃を検出するかどうかを制御する yes/no 値です。リポジトリの作成者は、リポジトリに提供されたデータが有効とみなされる時間を宣言することができます。そして、この時間に達しているが、新しいデータが提供されていない場合、データが期限切れになったとみなされ、エラーが発生します。セキュリティを高めることに加えて、新しいバージョンにアップグレードするユーザを守るために、悪意のある攻撃者が古いデータを永遠に送れないようにすることで、長期間更新されていないミラーをユーザが特定するのに役立ちます。しかしながら、歴史的アーカイブなど、いくつかのリポジトリは、設計によりこれ以上更新されないので、このオプションを no に設定することで、このチェックを無効にすることができます。設定オプション Acquire::Check-Valid-Until の値がデフォルトになり、そのデフォルトは yes です。

https://manpages.debian.org/unstable/apt/sources.list.5.ja.html


Check-Dateとは?

自分のマシンの時刻を正しい時刻とみなして、時刻に関連するファイルがあるかをチェックするオプション。値をfalseにすれば時刻チェックをオフにできます。

Check-Datecheck-date)は、APTがマシンの時刻を正しいと見なして、リリースファイルが将来のものではないことを確認するなど、時刻に関連するチェックを実行するかどうかを制御するyes / no値です。これを無効にすると、上記のCheck-Valid-Until オプションも無効になります。

https://manpages.debian.org/unstable/apt/sources.list.5.ja.html


マシン(WSL2)の時刻を修正する

もう一つの方法は、ズレているWSL2の時刻を修正する方法です。

Linxuディストリビューションを開いて、次のコマンドを実行します。

sudo hwclock -s
  • sudo: スーパーユーザーとしてコマンドを実行する。
  • hwclock:  マシンの時刻設定(ハードウェア・クロック)を行う
  • -s: –setオプション。 –dateオプションで指定した時刻に設定する

実例

$ sudo hwclock -s
[sudo] password for docker:

$ date
Fri Jul 23 10:21:41 JST 2021


sudo: command not foundの対処法

Linuxディストリビューションがインストールされていない場合、sudo: command not found というエラーが発生してコマンドを実行することができません。

これは、windowsがsudoコマンドを持っていないためです。

解消するには、WindowsにLinuxディストリビューションを追加する必要があります。導入自体は比較的簡単です。

前提条件

WLS2を使うためにはwindowsのバージョンが条件に沿っている必要があります。

  • x64 システムの場合:バージョン 1903 以降、ビルド 18362 以上。

Windowsバージョンの確認方法

自分のPCの状態を確認するには、コマンドラインにwinverと入力すれば、バージョン情報のウィンドウが表示されます。

$ winver

バージョンやビルドが古い場合

Windows メニューから 「設定」→「更新プログラムの確認」をクリックします。

検索まどに「更新」と入力すれば表示されます。

必要に応じて「ダウンロードとインストール」を行ってください。

(参考)Windows 10 用 Windows Subsystem for Linux のインストール ガイド


仮想マシン機能を有効にする

仮想マシンとして使うための機能を有効化します。WindowsメニューからPowerShellを検索して、管理者として開きます。

次のコマンドを実行します。

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

再起動すれば、WSLのインストールが完了します。

注意点

再起動は必須です。再起動しないとWSLコマンドがないというエラーがでます。


Linuxカーネル更新プログラム パッケージの実行

続いて、 Linuxカーネル更新プログラムの最新パッケージをダウンロードし、インストールを行います。

次のリンクをクリックすればダウンロードが始まります。ダウンロードが完了したらダブルクリックしてインストールを行います。


WSLのデフォルトバージョンを2に指定する。

$ wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください

正しく変更できると下に、「WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください」というメッセージが表示されます。


Linuxディストリビューションのインストール

Microsoft Store を開き、インストールしたいLinuxディストリビューションを選択します。

ディストリビューション内容
UbuntuDebian系。企業(Canonical社)が開発・運用。
Kali LinuxDebian系。ペネトレーションテストが主目的
Debian無料のLinuxディストリビューション。ボランティアで開発・運用。
Alpine WSL軽量。Debianベースのライブラリと互換性がない場合がある

選択するなら、UbuntuかDebianが無難です。ここではUbuntuをインストールします。

Ubuntuを選択して「入手」をクリックします。

インストールが完了したら、「起動」をクリックします。


すると、Ubuntuのコンソールが起動します。


Ubuntuのセットアップ

コマンドラインでUbuntuのセットアップをしていきます。

最初にユーザー名の入力を求められるので、好きな名前を入力します。(windowsのログイン情報を合わせる必要はありません)

Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:

続いてパスワードの入力を求められるので、好きなパスワードを入力します。(画面上に表示されませんが、打ち込まれています)

New password:
Retype new password:

設定が完了すると次のようなメッセージが表示されます。

passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Thu Jul 22 22:07:48 JST 2021

  System load:  0.07               Processes:             8
  Usage of /:   0.4% of 250.98GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for eth0: 172.25.88.154
  Swap usage:   0%

1 update can be installed immediately.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once a day. To disable it please create the
/home/docker/.hushlogin file.

以上でUbuntuのインストールは完了です。


Ubuntuのインストール確認

Ubuntuが正しくインストールされたか確認するために、Windows Terminalを開き、wsl -l -v を実行します。

$ wsl -l -v
  NAME                   STATE           VERSION
* docker-desktop-data    Running         2
  docker-desktop         Running         2
  Ubuntu                 Running         2

Ubuntuが表示され、VERSIONが2になっていればOKです。WSL2としてUbuntuが認識されています。

tips

wsl -l -v コマンドのオプションはそれぞれ次のようになっています。

オプション意味ロングオプション
-lディストリビューションの一覧を表示–list
-v詳細情報を表示。-l オプションでのみ使える(※–versionではない)–verbose

▼注意点

#-lのみの場合はバージョンや状態を表示しません。
$ wsl -l
Linux 用 Windows サブシステム ディストリビューション:
docker-desktop-data (既定)
docker-desktop


#-vというオプションはありません
$ wsl -v
コマンド ライン オプションが無効です: -v
Copyright (c) Microsoft Corporation. All rights reserved.

なお、Windows Terminal上部のタブをクリックすると、Ubuntuが追加されています

Ubuntuを選択すれば、Linux系コマンドを実行することができます。

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

docker@user:/mnt/c/Users$

コマンドの実行例

Linuxディストリビューションがインストールできたので、Linux特有のコマンドを実行してみます。

sudo hwclock -s

マシン(ここではWSL2)の時刻にPCの時刻をセットするコマンドです。WSL2ではPCがスリープするとWindows本体と時刻がズレる問題があり、これを解消するものです。

  • sudo: スーパーユーザーとしてコマンドを実行する。
  • hwclock:  マシンの時刻設定(ハードウェア・クロック)を行う
  • -s: –setオプション。 –dateオプションで指定した時刻に設定する
$ sudo hwclock -s
[sudo] password for docker:

$ date
Fri Jul 23 10:21:41 JST 2021

パスワードを求められ、入力するとコマンドが実行できました。(bash: sudo: command not foundが出ません)

以上でLinuxディストリビューションのインストールは完了です。

タイトルとURLをコピーしました