Docker上でスクリプトを作成して実行するまで

# Dockerイメージを起動しようとしたらプラットフォームの不一致が原因でコンテナの起動に問題が発生した時の対処方法

:::note warn
この記事はプログラミング初心者が自分のメモ用として書いている記事です。
そのため、誤った情報が記述されている可能性があります。
自己判断で読み進めてください
:::


:::note info
やろうとしたこと：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

```
どうやらサポートされていないみたい
参考にした記事ではなく別の記事を探す
[参考にした記事](https://www.kyonakablog.com/linux/how-to-build-linux-environment-using-docker/)


2 ubuntu公式イメージからとってきたイメージを試す
[ubuntu公式イメージ](https://hub.docker.com/_/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

```
:::note warn
ただしこのままだと日本語が正しく入力されない
:::


まず、コンテナ内で以下のコマンドを実行して日本語のロケールをインストール
```
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
```
![スクリーンショット 2025-02-11 13.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554097/df02da43-bd7e-267b-4abf-8704b3565c28.png)

スクリプトを入力
```
#!/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

```

![スクリーンショット 2025-02-11 14.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554097/ac02b768-fe64-dad4-da4c-9b9732dbe937.png)

:::note info
もしコンテナの外（ホスト）からスクリプトを実行したい場合は、以下のコマンドを使用
```
docker exec -it password_manager_container bash -c "./password_manager.sh"

```
:::