Windows環境で使用していたコンテナがMac環境では起動しなくなった時に試したこと

[以前の記事](https://qiita.com/dorayakin/items/76c47ea3f29761635df5)で使用していたRancherDesktopのコンテナをWindowsPCではなくMacOSで起動しようとしたところPermission deniedが発生。そのままでは起動できなかったので解決方法を今後のために記録する。


## 目的
Windows環境で起動していたRancherDesktopのコンテナをMacOS環境でも使用したいがMacOS環境で使用できなくなっていたためこれを解決する。

忙しい人は`最終的に採用した解決方法:RancherDesktopの設定を変更する`に進んでください。

## 環境
MacBookAir M4
Sequoia 15.4.1
RancherDesktop 1.18.2

## 前提条件
RancherDesktopをインストールしていること
(homebrew で導入しています)
## コンテナ起動状況(DockerfileのコマンドでPermission denied)
RancherDesktopを立ち上げ、`docker compose up -d`でコンテナを起動する。

![スクリーンショット 2025-05-10 10.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310625/7e71078d-4f56-451f-830d-55612eaa0dc9.png)
起動中のままになってしまっている。
原因を調べるために`compose.yml`のrestartのコマンドを次のようにコメントアウトする。
```yaml
#restart: always
```
その後、再度コンテナを起動する。
```terminal 
$ docker compose up -d  
[+] Running 3/3
 ✔ Network infra_default      Created                                                                                                                     0.1s 
 ✔ Volume "infra_db_store"    Created                                                                                                                     0.0s 
 ✔ Container mysql-container  Started                                                                                                                     0.2s 
$ docker compose ps -a  
NAME              IMAGE      COMMAND                   SERVICE   CREATED          STATUS                      PORTS
mysql-container   infra-db   "docker-entrypoint.s…"   db        28 seconds ago   Exited (1) 27 seconds ago   
$ docker compose logs   
mysql-container  | 2025-04-30 16:06:14+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.42-1.el9 started.
mysql-container  | chown: changing ownership of '/var/log/mysql': Permission denied
```
コンテナの起動自体は行なっているがExitedとなっており終了している。
一番最後の行によるとchownでの権限変更ができていないように見える。
Dockerfile内を確認するとメッセージ内容と一致するchownコマンドがある。

```dockerfile
RUN mkdir -p /var/log/mysql \
    && chown -hR mysql:mysql /var/log/mysql
```
::: note
今回使用するDockerfile
[Win環境で使用していたDockerfile](https://qiita.com/dorayakin/items/110ac080321bf010c58d#dockerfile作成)
:::

## 解決方法(Permission deniedについて)
Permission deniedを解決するには`compose.yml`にuserの行を追加してください。
以下は`compose.yml`の該当部分。
```diff_yaml
services:
  db:
    build: ./db
    container_name: mysql-container
+   user: mysql 
    ports:
      - "${FORWARD_DB_PORT:-3306}:3306"
```

再び`docker compose up -d`で再起動し、ログを確認する。
```terminal
$ docker compose logs
mysql-container  | 2025-05-02 08:35:31+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.42-1.el9 started.
mysql-container  | 2025-05-02 08:35:31+00:00 [Note] [Entrypoint]: Initializing database files
mysql-container  | 2025-05-02 08:35:33+00:00 [Note] [Entrypoint]: Database files initialized
mysql-container  | 2025-05-02 08:35:33+00:00 [Note] [Entrypoint]: Starting temporary server
mysql-container  | 2025-05-02 08:35:33+00:00 [Note] [Entrypoint]: Temporary server started.
mysql-container  | '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
mysql-container  | 2025-05-02 08:35:34+00:00 [Note] [Entrypoint]: Creating database mydatabase
mysql-container  | 2025-05-02 08:35:34+00:00 [Note] [Entrypoint]: Creating user myuser
mysql-container  | 2025-05-02 08:35:34+00:00 [Note] [Entrypoint]: Giving user myuser access to schema mydatabase
mysql-container  | 
mysql-container  | 2025-05-02 08:35:34+00:00 [Note] [Entrypoint]: Stopping temporary server
mysql-container  | mysqladmin: [ERROR] unknown variable 'local_infile=1'.
mysql-container  | 2025-05-02 08:35:34+00:00 [ERROR] [Entrypoint]: Unable to shut down server.
```
timezone設定の警告が出ていますがとりあえずPermission denied は解決。

## 解決方法(unknown variable 'local_infile=1'について)
`docker compose build`後の初回起動時にはメッセージが表示されるがビルドを挟まず再度コンテナを起動するとメッセージが表示されず無事にコンテナが起動した。
コンテナの起動に失敗した場合再起動をするようにしたいためcompose.ymlのrestartの項目のコメントアウトを外す。
```yaml
  db:
    build: ./db
    restart: always
    container_name: mysql-container
    user: mysql
    ports:
```
再ビルド後コンテナを起動するとコンテナを再起動し、コンテナは稼働中になっていることが確認できた。
```terminal
$ docker compose logs   
mysql-container  | 2025-05-10 02:52:02+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.42-1.el9 started.
mysql-container  | 2025-05-10 02:52:02+00:00 [Note] [Entrypoint]: Initializing database files
mysql-container  | 2025-05-10 02:52:05+00:00 [Note] [Entrypoint]: Database files initialized
mysql-container  | 2025-05-10 02:52:05+00:00 [Note] [Entrypoint]: Starting temporary server
mysql-container  | 2025-05-10 02:52:05+00:00 [Note] [Entrypoint]: Temporary server started.
mysql-container  | '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysql-container  | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
mysql-container  | 2025-05-10 02:52:06+00:00 [Note] [Entrypoint]: Creating database mydatabase
mysql-container  | 2025-05-10 02:52:06+00:00 [Note] [Entrypoint]: Creating user myuser
mysql-container  | 2025-05-10 02:52:06+00:00 [Note] [Entrypoint]: Giving user myuser access to schema mydatabase
mysql-container  | 
mysql-container  | 2025-05-10 02:52:06+00:00 [Note] [Entrypoint]: Stopping temporary server
mysql-container  | mysqladmin: [ERROR] unknown variable 'local_infile=1'.
mysql-container  | 2025-05-10 02:52:06+00:00 [ERROR] [Entrypoint]: Unable to shut down server.
mysql-container  | 2025-05-10 02:52:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.42-1.el9 started.
mysql-container  | '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'

```

![スクリーンショット 2025-05-10 11.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310625/c3bdd140-c464-4714-bbdf-2d8d3bd0c8a4.png)

## 補足(Permission deniedについて)
こちらの外部記事を参考に解決。

https://scrapbox.io/dojineko/MySQL%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92lima%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%A8Permission_Denied%E3%81%AB%E3%81%AA%E3%82%8B

[RancherDesktopの公式](https://rancherdesktop.io)のサイトの下の方を見ていくとMacの場合はlima,WindowsはWSL2を使用していることが分かる。

WSL2では問題なく起動できていたので参考元にあるようにlimaとWSL2の違いから来ているように見える。

## 最終的に採用した解決方法:RancherDesktopの設定を変更する
RancherDesktopの設定を変えて解決。
**この方法であればcompose.ymlの修正は不要なため採用。**

![スクリーンショット 2025-05-10 21.39.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310625/d527dd44-93d5-4e21-a0f6-cdd84b136e61.png)
Preferencesを選択。

![スクリーンショット 2025-05-10 22.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310625/272ac724-ab68-442a-8de6-234786dba0ce.png)
virtiofsを選択。
virtiofsは仮想マシンとホスト間のファイル共有をより高速化できるとのこと。

![スクリーンショット 2025-05-10 22.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310625/0547037d-cbf6-4580-95fe-48a157add81b.png)
VZを選択。
Macにあらかじめ実装されている[仮想マシン](https://developer.apple.com/documentation/virtualization)を使用。
[RancherDesktopのドキュメント](https://docs.rancherdesktop.io/ui/preferences/virtual-machine/emulation/)によるとまだ実験的なオプションとのこと。
RancherDesktopをこのように設定するとcompose.ymlを編集しなくとも起動することが確認できた。(この場合でも初回コンテナ起動は失敗するためcompose.ymlに`restart: always`は設定する必要がある。)

:::note warn
override.yamlを使用している場合は削除が必要な模様
:::

## 最終的に採用した解決方法について

こちらのissueで上がっている解決方法を採用。
(2024.11.21のコメント参照)

https://github.com/rancher-sandbox/rancher-desktop/issues/1209#issuecomment-2490791221