LoginSignup
7

More than 1 year has passed since last update.

Docker+WineでKindleアプリを立ち上げる

Last updated at Posted at 2023-01-08

概要

Linuxデスクトップ環境を使っていて困ることと言えば、Linux用のKindleアプリがないことです。
これに対する解決策としては

  • Kindle Cloud Reader(https://read.amazon.co.jp/ )を使う
  • LinuxにWineをインストールしてその上でWindows用のKindleアプリを動かす

のどちらかになります。
前者はブラウザさえあれば使えるものの、ページをめくるたびにダウンロードが発生するので反応が悪すぎます。後者に関しては、Wineのバージョン、Kindleアプリのバージョン、その他OS環境によって、動いたり動かなかったりします。

そこでWineの入ったDockerコンテナでKindleアプリを動かせば、ある程度は環境による影響を軽減できると考えました。

環境

OS: Fedora37
Dockerエンジン: moby-engine-20.10.21
Windows用Kindleアプリ: KindleForPC-installer-1.39.65383.exe

Kindleアプリは古いバージョンが入手しづらいので、うまくいったら保存しておく方がいいでしょう。
https://www.amazon.co.jp/kindle-dbs/fd/kcp

環境構築

今回使用するDockerイメージは、scottyhardy/docker-wine です。

公式の説明通り以下のようにします。

[host]$ wget https://raw.githubusercontent.com/scottyhardy/docker-wine/master/docker-wine
[host]$ chmod +x docker-wine

ダウンロードしたままだとエラーが多発していたので、下記のようにスクリプトの最後のほうにadd_run_arg --ipc=hostを追加します。

# Add Linux run args
add_run_arg --env="DISPLAY"
add_run_arg --volume="/tmp/.X11-unix:/tmp/.X11-unix:ro"
add_run_arg --ipc=host

コンテナを立ち上げます。タグの指定がなければlatestが使われますが、うまく動作したバージョンを明示的に指定します。

[host]$ ./docker-wine --tag=stable-7.0.1-20230115

コンテナが立ち上がるとbashのプロンプトが表示されるのでwineの設定を行います。

[wine]$ winecfg

Windows8.1を選んで、OKを押します(Windows10はダメでした)

image.png

以下のようにして、日本語フォントをインストールします。
sudoのパスワードはwineuserです。

[wine]$ sudo apt update -y
[wine]$ sudo apt install -y winetricks
[wine]$ winetricks -q cjkfonts vcrun2013

ここで別端末でDockerホスト側からKindleアプリをコンテナにコピーします。

[host]$ docker cp KindleForPC-installer-1.39.65383.exe wine:/home/wineuser

コンテナの端末でKindleのインストーラを起動します。ログイン画面が出るまで少し時間がかかります。

[wine]$ wine KindleForPC-installer-1.39.65383.exe

ログイン画面では、amazon.co.jpを選んでおいたほうがいいでしょう。

あとは指示通り進めれば、本棚が表示されるはずです。
ここでファイルメニューからKindleアプリを終了させてシェルに戻ります。

設定データの保存対策

このあとはコンテナの立ち上げと同時にKindleアプリを立ち上げるようにしたいのですが、画面サイズ変更や設定データの保存を行えるように少し細工をします。

エディタをインストールして起動用のスクリプトを作ります。

[wine]# sudo apt update
[wine]# sudo apt install -y vim
[wine]# cd
[wine]# vim execKindle.sh
[wine]# chmod +x execKindle.sh

起動用スクリプトは以下のようになります。

/home/wineuser/execKindle.sh
#!/bin/sh
wine '/home/wineuser/.wine/drive_c/Program Files (x86)/Amazon/Kindle/Kindle.exe'
sleep 5

Kindleアプリが正しく起動するか確認します。

[wine]# ./execKindle.sh

正しく起動できたらシェルからexitして、コンテナを終了します。

以降、ホスト側で以下のように入力すればKindleアプリが立ち上がります(シェルスクリプトなどにした方がいいでしょう)

[host]$ ./docker-wine --notty --tag=stable-7.0.1-20230115 /bin/sh /home/wineuser/execKindle.sh

※ 補足
Dockerは最初に起動したコマンドが終了すると、コテンナごと終了します。
一方で、Wineにexeを実行させた場合、exeが終了してからデータが保存されるまでに少し時間がかかるようです(おそらくwineserverがexeの終了後にデータを保存していると思われます。
なのでKindle.exeを起動コマンドに指定すると、データが保存される前に、コンテナがしてしまうので、execKindle.shではKindle.exeを終了後に少しsleepを入れています。

Kindleの設定

Kindleアプリの設定についてです。

日本語メニュー

日本語メニューも選べます。

image.png

自動更新の停止

新バージョンがリリースされると動かなくなってしまうので、自動更新は停止しておきます(いつかは更新しないといけないでしょうが)。

image.png

参考

登録デバイスの削除: https://www.amazon.co.jp/hz/mycd/digital-console/alldevices

余談:docker-wineのデータ保存

docker-wineでは、コンテナ自身はアプリの終了ととも削除されますが、設定データや書籍データは下記のボリュームに保存されます。
aptでインストールしたwinetricksも消えてしまいますが、インスールしたフォントもボリュームに保存されています。

[host]$ docker volume ls
DRIVER    VOLUME NAME
local     winehome

余談:docker-wineの中身

[wine]$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
[wine]$ dpkg-query -l | grep -i wine
ii  wine-stable                          7.0.1~focal-1                     amd64        WINE Is Not An Emulator - runs MS Windows programs
ii  wine-stable-amd64                    7.0.1~focal-1                     amd64        WINE Is Not An Emulator - runs MS Windows programs
ii  wine-stable-i386:i386                7.0.1~focal-1                     i386         WINE Is Not An Emulator - runs MS Windows programs
ii  winehq-stable                        7.0.1~focal-1                     amd64        WINE Is Not An Emulator - runs MS Windows programs

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7