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.
エラーの内容は、対象のパッケージの有効期限が切れているので無視しますという内容。
この対処法について解説しています。
エラーの原因
Windowsのdocker-desktopはWSLという、Windows上でLinuxのディストリビューションを動かすサービスを使っているが、Windowsの時刻と、WSL上のOSの時刻がズレるために発生していることが原因とのこと。
ちなみに、WSLは Windows Subsystem for Linux の略。
エラーの発生タイミングはDcokerfileの RUN apt-get
でパッケージをインストールしようとしたタイミング。
対処法
対処法は大きく2つあります。
- Dockerfileを編集して時刻の確認処理をしないようにする
- マシン(WSL2)の時刻を修正する
Dockerfileを編集して時刻の確認処理をしないようにする
先に、結論からいうと、Dockerfileの RUN apt-get と update の間に次のコードを挿入すれば、エラーを発生させることなくパッケージのインストールを行うことができます。
-o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false
実例
# 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-Date(check-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のインストールが完了します。
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ディストリビューションを選択します。
ディストリビューション | 内容 |
---|---|
Ubuntu | Debian系。企業(Canonical社)が開発・運用。 |
Kali Linux | Debian系。ペネトレーションテストが主目的 |
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が認識されています。
なお、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ディストリビューションのインストールは完了です。