Dockerイメージを起動しようとしたらプラットフォームの不一致が原因でコンテナの起動に問題が発生した時の対処方法
この記事はプログラミング初心者が自分のメモ用として書いている記事です。
そのため、誤った情報が記述されている可能性があります。
自己判断で読み進めてください
やろうとしたこと:Dockerを使ってLinux環境をを構築する
OS:Mac(Apple M2チップ)
dockerのイメージ起動したら起動できず以下のようなエラーが発生した
(ポート番号「5901」を使用してVNC接続)
エラーメッセージ
% docker run -itd -p 5901:5901 --name ubuntu-desktop --hostname ubuntu:remote queeno/ubuntu-desktop
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
df181d710c8a2000b7439858e1ccc5144d22edc62865c17d81a2ca0b81af175e
原因分析
どうやら入力したコマンドのqueeno/ubuntu-desktop イメージは
linux/amd64 アーキテクチャ向けに作られているが使用しているCPUがlinux/arm64/v8 で動作しているから
不一致が原因でコンテナの起動に問題が発生しているみたい
1 対応するアーキテクチャのイメージを探す
queeno/ubuntu-desktop の arm64 対応版があるかどうか
% docker buildx imagetools inspect queeno/ubuntu-desktop
Name: docker.io/queeno/ubuntu-desktop:latest
MediaType: application/vnd.docker.distribution.manifest.v2+json
Digest: sha256:2415f147541df23b28f3ab59534aee304299025493539b7246443ef259855a95
どうやらサポートされていないみたい
参考にした記事ではなく別の記事を探す
参考にした記事
2 ubuntu公式イメージからとってきたイメージを試す
ubuntu公式イメージ
% docker pull ubuntu:22.04
22.04: Pulling from library/ubuntu
0d1c17d4e593: Pull complete
Digest: sha256:ed1544e454989078f5dec1bfdabd8c5cc9c48e0705d07b678ab6ae3fb61952d2
Status: Downloaded newer image for ubuntu:22.04
docker.io/library/ubuntu:22.04
3 Ubuntuコンテナの起動と利用
ダウンロードしたUbuntuイメージからコンテナを起動し、環境にログインする
% docker run -it -d --name ubuntu ubuntu:22.04
a45b5adeae5e01af39d3ac937ce30c91253605769406bdc3643cd332d3b68a99
4 コンテナへのログイン
% docker exec -it ubuntu /bin/bash
root@a45b5adeae5e:/#
5 コンテナの停止
root@a45b5adeae5e:/# exit
ステップアップ(Docker 上でスクリプトを作成する)
docker run -it --name password_manager_container ubuntu bash
※一度exitして再度作成したコンテナに入るには
docker start -ai password_manager_container
コンテナ内でスクリプトを作成
コンテナ内で nano などのテキストエディタを使用できるように apt update して nano をインストール
apt update && apt install -y nano
ただしこのままだと日本語が正しく入力されない
まず、コンテナ内で以下のコマンドを実行して日本語のロケールをインストール
apt update && apt install -y locales
次に、日本語ロケールを有効化
locale-gen ja_JP.UTF-8
環境変数を設定
echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrc
echo 'export LANGUAGE=ja_JP:ja' >> ~/.bashrc
echo 'export LC_ALL=ja_JP.UTF-8' >> ~/.bashrc
source ~/.bashrc
nano を使うときに文字コードを指定すると、文字化けを防げる
nano -E password_manager.sh
nano エディタでスクリプトを作成
nano password_manager.sh
スクリプトを入力
#!/bin/bash
# 保存先のファイル
db_file="passwords.txt"
# メッセージ表示
echo "パスワードマネージャーへようこそ!"
# ユーザー入力を取得
echo -n "サービス名を入力してください:"
read service
echo -n "ユーザー名を入力してください:"
read username
echo -n "パスワードを入力してください:"
read -s password
# 入力データをファイルに保存
echo "$service:$username:$password" >> "$db_file"
echo "データが保存されました。"
echo "\nThank you!"
実行権限を付与
root@be96f8ff3ea8:/# chmod +x password_manager.sh
root@be96f8ff3ea8:/#
スクリプトを実行するには、以下のコマンドをコンテナ内で実行
./password_manager.sh
実行結果
root@be96f8ff3ea8:/# ./password_manager.sh
もしコンテナの外(ホスト)からスクリプトを実行したい場合は、以下のコマンドを使用
docker exec -it password_manager_container bash -c "./password_manager.sh"