Python3-Tkinter radiko player

pythonボタンでradiko playerを作成してみました。

pythonボタンメニューのプログラムは基本共通なのでラジコスクリプト(関連アプリケーション)とアイコン画像を用意するだけで簡単に作成することができます。

確認はRaspberryPi3とOrangePi3のubuntuコンテナにインストール、確認しています。メインはubuntu-X(vnc)で使用する予定です。

インストール

python環境(python3.5以降, python3-tkなど)はあるものとします。
ubuntuコンテナからはpulseaudioをインストールして再生します。
再生プレーヤーは mpv mplayer ffplay を試してみます。

# apt install pulseaudio
# apt install mpv mplayer swftools libxml2-utils rtmpdump ffmpeg

ラジコスクリプト

当サイトではほとんど再生オンリーなので以前から使用しているスクリプトをそのまま使っています。
radiko.sh (chmod 755)

ラジコスクリプトの再生プレーヤーは168行目前後のコメントを付け替えて切り替えます。
ファイルは~/binに置いています。
各スクリプトは実行権限を付けておきます。(chmod 755)


インストールなど準備が済んだらコマンドラインから実行できることを確認します。
スクリプトメニューは関東圏を記載していますが地域に応じた放送局IDを指定します。
最軽量のプレーヤーはffplayですが安定性、音質などから最良と思われるmpvにしました。
キャッシュ設定にもよりますが以前はmplayerのほうが再生開始は早かったのですが現在はmpvが早くなっています。大体2秒位で開始します。

pythonラジコ

radiko.py (chmod 755)
2重起動を抑止及び停止。使用する可能性のあるプレーヤーを記載
~/bin/killall.sh (chmod 755)

#!/bin/sh
killall -q mpv
killall -q mplayer
killall -q ffplay


アイコンは~/.icons/radioに置いています。


ボタンカラーは# Button colorの以下2行のコメントを外すことで変更可


再生中の放送局はON AIRボタンで確認
Exitボタンはメニューを終了
subprocess.run(“killall.sh”)のコメントを外せば再生を停止して終了
Pi1B,Zeroはpythonの起動、radiko.shに時間がかかると思います。
Pi2以降であればほぼ問題ないでしょう。

次回はサイマルラジオプレーヤーを作成してみたいと思います。

Orange Pi 3 docker tool menu

当サイトではdockerを少しでも使いやすくするためメニューを作成していますが今回鯨を少しだけ増やしてみました。pythonの勉強です。

青鯨、黒鯨は今までのとおりですが新たに赤鯨と緑鯨を追加してみました。
dockerの状態やコントロールするためにpythonのListboxを作成してみたいと思います。

参考

雛形はボタンでもお世話になっているこちらのサイトのものを参考にしています。
https://python.keicode.com/advanced/tkinter-widget-scrollbar.php

docker container ls

docker container ls(docker ps)は基本ですね。
以下のコマンドを実行するとNAMESの項だけを取り出すことができます。

$ docker container ls | grep -v NAMES | grep .$ | awk '{print $NF}'
$ docker container ls -a | grep -v NAMES | grep .$ | awk '{print $NF}'


1行目を除外して文字列を検索、awkで最後の文字列を取得します。
この値を変数に読み込ませてリストに出力、表示します。


赤鯨は現在実行中のコンテナを表示します。
緑鯨は作成済みの全コンテナを取得します。

黒鯨は全コンテナを停止してしまいますが赤鯨はリストから選択して特定のコンテナを停止、または再スタートすることができます。
緑鯨はリストに載っているコンテナを選択してスタートorストップします。緑鯨からのスタート及びストップは実行後緑鯨は終了します。赤鯨が起動していれば再起動してリストに反映します。
また不要なコンテナを選択して削除します。
赤鯨を起動後コマンドラインからスタートしたコンテナはRELOADすることでリストに反映されますがリストの内容だけを書き換えることは難しかったので赤鯨を再起動することでリストに反映しています。(緑鯨も同様)

alpineでssh接続の様子
今までのボタン操作で起動しています。
赤鯨が起動しているとアプリケーションの再起動によってdwmのウインドウ位置が入れ替わります。赤鯨は確認、及び必要があるときに起動するとdwm本来の動作になります。
ウインドウ位置が変わるだけなので使いやすい方でいいのですが…


dockerメニューのコンテナボタンをクリックするとコンテナがスタートします。
コンテナがスタートするとメッセージボックスが出現します。コンテナによって違いますが数秒もしくはもう少しかかる場合もあります。赤鯨を起動していればメッセージボックスとともに赤鯨が再起動してリストに反映されます。Yesで接続(sleep 1)にいきますが即接続できるのはalpinだけですね。X(vnc)コンテナは20〜30秒待ったほうが確実と思います。

Noではコンテナ起動のままダイアログを閉じます。(接続は再度ボタンをクリック)
ssh or vnc接続のタイミングはヒューマン感覚に任せることにします。

緑鯨からは不要なコンテナを削除できます。
buildで失敗したときなどは外人さんふうのコンテナが作成されているときがあります。
そんなコンテナを削除するには便利と思います。(コンテナはSTOP)


当サイトではできるだけ新コマンド形式を使うようにしています。旧コマンドに比べると長ったらしくなるのですがエイリアスにするとイメージしやすくなります。
それでもやっぱり忘れるのでテキストボタンからすぐ呼び出せるようにしています。
画像では.cshrcですが.bashrcも記述方法が少し違うだけで同じように利用できます。

リストからnameをコピーできるのでペーストして簡単な編集確認はすぐできます。
(注)Osのコマンドとバッティングしないようにします。dc(計算機)がある場合が多いと思います。

ボタンカラー

ボタンや文字の色についてはなかなか的確な情報を見つけられなかったのですがこのページがヒットしました。
https://www.geeksforgeeks.org/python-add-style-to-tkinter-button/
最初NameErrorが出てうまくいかなかったのですがよく見るとimportする専用モジュールがあるんですね。似たような名称なので見逃していました。

Traceback (most recent call last):
  File "docker_run.py.txt", line 85, in 
    style = Style()
NameError: name 'Style' is not defined

緑鯨を例にすると追加した項目は以下のようになりました。
‘TButton’がデフォルトで摘要されます。
‘W.TButton’で個別に設定します。

from tkinter.ttk import *

    # Butoon color
    style = Style()
    style.configure('TButton', font=('calibri', 9), background='#A4DCBF')
    style.configure('W.TButton', font=('calibri', 9), foreground='#FF0089')

    button4 = ttk.Button(frame2, text='REMOVE', style='W.TButton', command=button4_click)

参考 赤鯨 緑鯨 dockerメニュー

赤鯨、緑鯨はコマンドラインの補助ツールです。
当サイトの環境で動作確認していますが自己責任で!
dockerメニューは一部コンテナボタン割愛しています。
ファイルの保存場所は~/binにしています。パスを通すか明示的に~/bin/xxx.pyのように変更する必要があると思います。
赤鯨 docker_run.py
緑鯨 docker_container.py
メニュー docker.py


管理ツール portainer
比べるまでもなく作成したpython toolよりははるかに高機能ですがportainer自体がdockerコンテナであること、webブラウザ経由であることを考慮するとpython tool(赤鯨、緑鯨)もコマンドラインのサブツールとして意外と便利かもしれません。

Orange Pi 3 docker Ubuntu desktop

今回はubuntu IMAGEから前回のdebian同様に学習用desktopコンテナを作成してみたいと思います。

今回からは一般ユーザーを登録して通常のPC同様に作成したユーザーでログインすることにしました。取り扱い、設定の上でもこのほうが自然でいいと思います。

Orange Pi 3

$ uname -a
Linux orangepi3 5.1.16-sunxi64 #5.91.190708 SMP Tue Jul 9 00:38:37 CEST 2019 aarch64 GNU/Linux
$ docker -v
Docker version 19.03.0, build aeac949

armbianではこのところ更新が止まっていますね。190705busterベースのdebian ubuntuとも起動はするのですがハングアップしてしまいます。cpuクロック制御(?)に苦心していると睨んでいます。
このためstretchイメージをインストール/bootのsun50i-h6-orangepi-3.dtbを5.1.5.img(190601)のものと置き換えてアップグレードしています。(apt-mark hold sun50i-h6-orangepi-3.dtbしておく)
stretchは安定していてコンテナを起動してもアイドル時はcpu 480MHz Load averageは0.0n台に治まっています。(デバイスのサポートはまだまだですが)

ubuntu openssh server

ubuntuもdebianベースなので前回debianの手法でインストールしていきます。
Dockerfile

$ docker build -t ubuntu-sshserver ./

rootとuser(pi)のパスワードは適当に。user idは1000番から割り当てられます。
ホストのuserと合わせるときは useradd -u 1001 username のように!

FROM ubuntu:latest
RUN apt-get update && apt-get -y upgrade && \
apt-get -y install apt-utils openssh-server locales tzdata vim sudo language-pack-ja
RUN mkdir /var/run/sshd
RUN echo "root:xxxxxxxx" | chpasswd
RUN useradd pi -p raspberry
RUN sed -i "33i PermitRootLogin yes" /etc/ssh/sshd_config
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
update-locale LANG=ja_JP.UTF-8 && update-locale LANGUAGE=ja_JP.UTF-8 && update-locale LC_ALL=ja_JP.UTF-8
CMD ["/usr/sbin/sshd", "-D"]

ubuntu-sshserverをsystemdでrun

$ docker container run -it --name ubuntu_sshserver --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro ubuntu-sshserver /bin/systemd

[  OK  ] Started Update UTMP about System Runlevel Changes.

上記のところで止まるのでコンテナリスタートsshで確認(systemd有効)

$ docker container restart ubuntu_sshserver
$ ssh root@172.17.0.2

登録したユーザーのホームディレクトリは特にDockerfileのuseraddで指定していませんが後から簡単にコピーできるので次に進みます。
コミット

$ docker container commit ubuntu_sshserver ubuntu/openssh-server

Tigervnc server

ubuntuのイメージではTigervnc 1.7.0系がインストールされます。debianの1.9.0は動きませんが1.7.0は動きます。

$ docker build -t ubuntu-tiger ./

Dockerfile
WMはdwmとopenboxで動作確認しています。

FROM ubuntu/openssh-server:latest

RUN apt-get update && apt-get -y upgrade && \
apt-get -y install xserver-xorg x11-xserver-utils xterm dwm \
tigervnc-standalone-server tigervnc-common

CMD ["/bin/systemd"]

run

$ docker container run -it --name ubuntu-X --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro ubuntu-tiger /bin/systemd
[  OK  ] Started Update UTMP about System Runlevel Changes.

$ docker container restart ubuntu-X

ホストでユーザー用のディレクトリを作成して使いやすい設定ファイル(.bashrc vncbootなど)を用意してコピーします。vncserverの設定があればコピー可

$ docker cp pi ubuntu-X:/home

sshでログインして必要な設定をします。最低必要なものはユーザーディレクトリとvncserverの設定です。

$ ssh root@172.17.0.2

Dockerfileでuser shellの指定を忘れたのでここで変更します。

# chsh -s /bin/bash pi

vncの設定がない場合はここで設定します。(ユーザーpiで)

$ vncpasswd

パスワードを設定したら起動、当サイトではポート:2(5902)以降

$ vncserver :2 && vncserver -kill :2

ホームディレクトリには~/.vncができます。
vnc.confの作成(geometryは適当にlocalhost=no”必須)
~/.vnc/vnc.conf

$geometry     = "900x520";
$depth        = 24;
$desktopName  = "Ubuntu";
$localhost    = "no";

vncbootの設定、変更箇所(ポート番号は5に設定) 参考 vncboot

USER=pi
HOME=/home/pi
su $USER -c '/usr/bin/vncserver :5'
su $USER -c '/usr/bin/vncserver -kill :5'

編集が済んだら

# chown root:root vncboot
# chmod 755 vncboot
# cp vncboot /etc/init.d
# systemctl enable vncboot

vncserverを起動

$ vncserver :5

vncviewerで確認(ホストから実行)vnc client

$ vncviewer 172.17.0.2:5

その他

# visudo
pi      ALL=(ALL) NOPASSWD:ALL

いつものフォント設定

# sh font_set.sh

コミットしてIPを振って運用するコンテナを新規作成

$ docker container commit ubuntu-X ubuntu/tigervnc
$ docker container run -it --net=orangepi3-network --ip=172.18.0.35 --name ubuntu_dwm --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro ubuntu/tigervnc /bin/systemd
$ docker container restart ubuntu_dwm

パスワードをコピーして接続してみます。(~/.vncは作成)

$ docker cp ubuntu_dwm:/home/pi/.vnc/passwd ~/.vnc
$ vncviewer -SecurityTypes VncAuth,TLSVnc -passwd ~/.vnc/passwd 172.18.0.35:5 &


設定ファイルは一度作成すればホームディレクトリごとdocker cpでコピーできるので再利用できます。
dwmはコンパイルしたものを利用しています。当サイトの特殊要件としてdwmからdwmを読んでいるのでキーボードからのウインドウ操作ができません。
最低限のメニューとopenboxをインストールして切り替えてみたいと思います。

# apt install openbox python3-tk leafpad psmisc w3m-img less highlight

ubuntuにはpython3.6が含まれています。

# cd /usr/bin && ln -s python3.6 python


ファイラーにはrangerを入れました。以前のとおりインストールはしないで展開してるだけです。テキストビューはroot権限ではできないようです。一般ユーザーでは問題ありません。
左右の境界線はdwmのコンパイル(config.h)で設定できます。


ウインドウマネージャーをopenboxに切り替えるとこんな感じ、普通に使えます。
切り替えは瞬時に可能ですがdwmに戻るときはメニューが左側の大きいウインドウに移動します。
exitボタンは実行中のxtermを終了します。再度xtermを起動するとメニューは右側に追い払われていきます。通常のdwmの使い方では問題は無いのですが!

現在の~/.vnc/xstartup

#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid Black
vncconfig nowin=1 &
~/bin/app.sh &
dwm &

~/bin/app.sh 起動時のアプリケーション設定

#!/bin/sh
~/bin/app.py &
sleep 3
cd && xterm &

app.py 参考 メニュー ~/bin/app.py

w3m-imgをインストールするとrangerで画像のビューが可能になります。


タイトルバーのmoodeをクリックするとフロートに切り替えます。
タイル型のWMは隙間なく埋めてくれるので小さい画面(ウインドウ)でも見やすくなります。dwmの中のdwmはかなり制限がありますがなんとか簡単な作業はできそうです。


cpu状態表示はホスト側と同じです。
メモリ使用量は若干増えますが特に重い作業でもしない限り問題なく使用できそうです。
armbianのbusterも早期に解決するといいのですが!

Orange Pi 3 docker (debian buster systemd)

やはりdebian busterではsystemdは有効にならないようです。
セキュリティーの観点、運用からもdockerの1プロセス1コンテナ原則のようです。
但しローカル内での学習目的やちょっとした遊びにはsystemdが使えたほうが便利なこともあると思います。
docker hubにはdebian buster systemdのコンテナもあるのですが初心者(当サイト)には使い方がわかりませんでした。
systemdを有効にするためにここのくだりを参考にしました。
https://serverfault.com/questions/607769/running-systemd-inside-a-docker-container-arch-linux

debianの公式イメージには直接適用されないようなので一旦ssh serverコンテナを作成してみます。

openssh server

適当なディレクトリを作成してその中でDockerfileを実行します。

$ docker build -t buster-ssh ./

Dockerfile

FROM debian:latest
RUN apt-get update && apt-get -y upgrade && apt-get -y install openssh-server locales tzdata
RUN mkdir /var/run/sshd
RUN echo "root:xxxxxxxx" | chpasswd
RUN sed -i "33i PermitRootLogin yes" /etc/ssh/sshd_config
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
CMD ["/usr/sbin/sshd", "-D"]

イメージbuster-sshができるのでこれをsystemdでrunします。

$ docker container run -it --name openssh-server --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster-ssh /bin/systemd


起動したままになるので別ターミナルからstop
docker container ls -aからopenssh-serverを確認して再度start
sshで接続

& docker container stop openssh-server
$ docker container start openssh-server
$ ssh root@172.17.0.2


systemdが有効になっていますね。
ロケールとタイムゾーンは設定されているはずです。
ほかに追加したい項目があればここで設定してcommitしておきます。
buster/openssh-server

& docker container stop openssh-server
$ docker container commit openssh-server buster/openssh-server

xorg

作成したbuster/openssh-serverを基にX関連を追加します。
vncはtightvncserver WMはdwmをインストール

$ docker build -t buster-xorg ./

Dockerfile

$ FROM buster/openssh-server:latest
RUN apt-get update && apt-get -y upgrade && \
apt-get -y install xserver-xorg xterm tightvncserver autocutsel dwm vim

CMD ["/bin/systemd"]

上記と同じくsystemdでrun

$ docker container run -it --name buster-X --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster-xorg /bin/systemd

コンテナをリスタートdocker container execかsshから環境を設定します。

$ docker container stop buster-X
$ docker container start buster-X
$ ssh root@172.17.0.2
# vncpasswd
# vncserver -geometry 600x450 :2

当サイトはvnc接続したOrangePi3に構築しているのでポート番号は2以降を指定しています。

$ vncviewer 172.17.0.2:2


日本語フォントをインストール、fontconfigを設定.Xresourcesなど追加
/root/.vnc/xstartupを設定して最低限の起動画面を作成
ウインドウマネージャーは変更してもいいし後からいつでも変えられます。
設定が済んだらコミットします。

$ docker container commit buster-X buster/xorg

コミットしたbuster/xorgからnetworkを指定して運用するコンテナを作成

$ docker container run -it --net=orangepi3-network --ip=172.18.0.23 --name buster_dwm --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster/xorg /bin/systemd

作成したコンテナが正常に起動できたらbuster/openssh-server buster/xorg以外の不要なコンテナ、イメージを削除

vncboot

vncbootを有効にしないとコンテナをスタート、ログインしてvncserverを起動しなければvncviewerから接続できません。docker cpでコピーするのが簡単と思います。
パーミッションはroot 実行権限を付けておきます。

$ docker cp vncboot /etc/init.d

ログインしてenable

# systemctl enable vncboot

vncbootにはポート番号が記載されています。2以降の任意の番号に変更するのがいいでしょう。vncviewerからその番号を指定します。

vncserverはtightvncserverをインストールしています。
tigervncserverはbuster(ARM64?)では起動しません。これはdebian系のbugのようです。
https://github.com/TigerVNC/tigervnc/issues/800
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=923962
現package versionも変更が無いことからまだ解決には至ってないようです。

buster_dwm


dwmをコンパイルしたdwm6.2に変更しています。
dwmは実行ファイル(59Kb)も小さく依存するファイルも必要ないことから/usr/local/binに放り込んでおくだけで問題なく使えます。dmenuは追加でインストールできます。
Xの確認また操作にある程度慣れていればそのまま十分実用になります。
但し今回はホストのOrangePi3でdwmを使っているためキーバインドは全てホスト側に摂られています。実質xstartup,xtermからのみコントロールすることになります。

buster_openbox

$ docker container run -it --net=orangepi3-network --ip=172.18.0.24 --name buster_openbox --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster/xorg /bin/systemd


起動時メモリ消費量はdwm 30MB openbox+lxpanelで45MB位になるようです。
起動するアプリケーショやデーモンがあるとどんどん増えていきます。
pcmanfmからはドライブが見えなくなっています。


buster_dwmにsurfをインストール、xstartupから起動してmoode player,radikoを表示させてみました。
動作としては問題ないのですがraspbianに比べてメモリ消費量が大きくなるようです。
Xコンテナも用途によって使い分けたり新しくしたほうがいいようです。

buster_openssh

今回作成したコンテナはssh接続も可能ですがrunするとXも起動するためメモリ消費が多くなります。cliでssh接続するためbuster_opensshからコンテナを作成します。

$ docker container run -it --net=orangepi3-network --ip=172.18.0.22 --name buster_ssh --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster/openssh /bin/systemd


各コンテナの起動タイミングはメモリの状況やOSなどの条件で接続はそれぞれ違ってきます。一つのボタンでコンテナをrunそして接続することは無理があります。
alpineだけはsleepに3秒入れておけば繋がるのですがほかのOSは初回起動時と以降の差が大きいのでsleepに1を入れて1回失敗させ(runだけしといて)再度間合いをおいて接続するようにしています。
この辺はもう少しスマートな方法がないか考えてみたいと思います。

docker kill(stop)ボタン
起動中の全コンテナを安全にストップします。

subprocess.run("docker container stop $(docker ps -q)", shell=True)

docker restart ボタン
作業中時折agettyを握って一つのcpuが100%に張り付いてしまうことがあります。
dockerをrestartしても直らないのですがagettyをkillするついでにdockerもrestartしています。

subprocess.run("sudo killall agetty", shell=True)
subprocess.run("sudo systemctl restart docker", shell=True)

コンテナの停止時間を充分見ていれば大丈夫かな(?)

Orange Pi 3 docker (debian stretch desktop)

docker debian stretchでdocker desktopを作成してみました。

現在docker hubにはdebian busterが登録されていますが当サイトの環境(OrangePi3 armbian stretch)ではbusterをうまく動作させることができませんでした。
最新のarmbianもbusterがリリースされていますがOSは起動はするもののtigervncserverがこけてしまいます。この現象はdockerのbusterも同じです。
またdocker busterはsystemdを有効にしてrunしても直後は正常にデーモンが起動しますがコンテナを再スタートするとsystemdが有効になっていないようです。(なにか変わった?)
この辺はOrangePi3を含めて少し様子をみたいと思います。

IMAGE ID 0b6ef40e3f79 (debian_version 9.9)を使いました。(現在入手方法は?)

流れとしてはdebian(stretch)からコンテナdebian2を作成、必要なパッケージをインストール、イメージdebian2をコミット、イメージdebian2からsystemdを有効にしてコンテナdebian3を作成、設定して最後に保存したいイメージstretch、コンテナstretchを作成します。(nameは適当です)

debian2

OrangePi3からはtigervncserverに接続します。tightvncのウインドウサイズ固定に対してtigervncはある程度dwmのウインドウに自動で合わせてくれます。
WMはopenboxにあとlxpanelを追加しました。

$ docker container run --name debian2 -it 0b6ef40e3f79 /bin/bash

# apt update && apt -y upgrade
# apt -y install tcsh lv vim less procps \
xserver-xorg xterm \
tigervnc-standalone-server tigervnc-common \
openbox lxpanel leafpad \
locales dialog systemd-sysv

日本語入力 (uim-anthy) — 必要なら
/root/font_set/font_set.sh

#!/bin/sh
apt install -y fonts-ipafont fonts-ricty-diminished
apt install -y uim uim-anthy
cp /root/font_set/*conf /etc/fonts/conf.avail
cd /etc/fonts/conf.d
ln -s ../conf.avail/65-fonts-ipa-mincho.conf
ln -s ../conf.avail/65-fonts-ipa-pgothic.conf
ln -s ../conf.avail/65-fonts-monospace.conf

実行

# sh font_set.sh


65xxxconfは過去記事のどこかにあります。(検索可)
予めホスト側で作成してdocker cpでコピーするのが簡単だと思います。
漢字を有効にするには.bashrcに追記しても有効にすることはできませんでした。
当サイトではtcshをインストール、~/.cshrcに記載しています。

デフォルトのshellはbashでOK
tigervncserverではxstartupもsh.cshどちらでもOKのようです。
/root/.cshrc

setenv  LANG   ja_JP.UTF-8
setenv  XMODIFIERS @im=uim
setenv  GTK_IM_MODULE uim
setenv  QT_IM_MODULE uim

vncboot
このファイルも用意しておきます。vncboot

# chmod 755 vncboot
# cp /etc/init.d

作業が終わったら # exit してコミットします。
最初のcommitはファイルが大きくなっているので少し時間がかかります。

$ docker container commit debian2 debian2

コンテナdebian3作成

$ docker container run --privileged -d -p 5902:5902 --name debian3 debian2 /bin/systemd

debian3

$ docker container exec -it debian3 /bin/bash

ロケールの設定

# dpkg-reconfigure locales


raspbianでは馴染みのあるダイアログですね。
最初の画面でja_JP.UTF-8を選択して次にこの画面でja_JP.UTF-8を有効にします。

タイムゾーンの設定

# timedatectl set-timezone Asia/Tokyo

 

vncserver

コンテナ起動時vncserverを有効にします。

# systemctl daemon-reload
# systemctl enable vncboot
# systemctl start vncboot
# systemctl status vncboot

vncserverが起動していたらkillしてパスワード設定

# vncserver -kill :2
# vncpasswd

/root/.vnc/vnc.conf
tigervncserverはlocalhost=noを指定しないと外部から接続できません。

$geometry     = "846x502";
$depth        = 24;
$desktopName  = "debian";
$localhost    = "no";

/root/.vnc/xstartup

#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid gray15
vncconfig nowin=1 &
uim-xim &
lxpanel &
sleep 1
cd && xterm -geometry 80x24+180+110 &
openbox &
sleep 5
uim-toolbar-gtk &

xtermを使う場合は~/.Xresourcesを適切に設定しておきます。
準備ができたらvncserver起動

# vncserver :2

クライアントから接続

$ vncviewer -SecurityTypes VncAuth,TLSVnc -passwd ~/.vnc/passwd 172.17.0.2:2


クライアント(OrangePi3)にはtigervncviewerをインストールしています。
OrangePi3もtigervncserverのホストとして稼働しています。同じパスワードを設定していいれば自身のパスワードを-passwdスイッチとして使用できます。
ここでコンテナをリスタートして問題なく接続できることを確認。debian busterではリスタート後ここで接続できませんでした。


lxpanelの体裁を好みのスタイルに合わせてここでコミットします。

$ docker container commit debian3 stretch

docker networkを作成

$ docker network create orangepi3-network
$ docker network inspect orangepi3-network
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"

コミットしたイメージからnetworkを付加して新たにコンテナを作成

$ docker container run --net=orangepi3-network --ip=172.18.0.9 --privileged -d -p 5902:5902 --name stretch stretch /bin/systemd

問題なく起動するようであれば不要なコンテナを削除

$ docker container rm debian3
$ docker container rm debian2


作成したイメージ(stretch)は940MBになりました。起動は約10秒位かかります。
stretchは先に作成したdebian3の差し分けになっているはずなのでイメージdebian3をrmするとタグが外れています。(削除はできません)
パッケージはpcmanfmとlxappearanceを追加しています。
pcmanfmからはホストのドライブが全部見えています。rootでログインしているので扱い注意です。

ボタン(OrangePi3から実行)

# Button debian
def debian():
    subprocess.run("docker container start stretch", shell=True)
    time.sleep(10)
    subprocess.run("vncviewer -SecurityTypes VncAuth,TLSVnc -passwd ~/.vnc/passwd 172.18.0.9:2 &", shell=True)
    root.quit()
icon3 = PhotoImage(file='~/.icons/64x64/debian.png')
button3 = ttk.Button(
    frame1,
    image=icon3,
    command=debian)
button3.grid(row=2,column=1)

lxpanelはpulseaudioを依存でインストールします。mplayerなどをインストールするとコンテナからホストを通してpulseaudio serverに接続可能になります。
smtubeのコンパイルやあまり重くない動画の再生もOKです。
終了はターミナルからpoweroffでコンテナstopします。
ホストにインストールする前のテストやコンテナで処理しても問題ないような用途に使っていきたいと思います。

Top