読者です 読者をやめる 読者になる 読者になる

座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

PowerShellをLinuxで普段使いする試み

PowerShell Docker

クロスプラットフォーム対応したPowerShellを, Linuxで普段使いしてみたい, という試みである.

PowerShellクロスプラットフォームで使えるようになっているけど, 現実的には世のLinuxディストリビューションPowerShellを公式サポートするのは, もう少し先の話になる.

それでも使ってみたくなるのが人情である. 今のところ方法は, MicrosoftGithubリポジトリで配布しているUbuntuCentOS向けパッケージを使うか, リポジトリで公開されているソースからビルドするかのどちらかしかない. archlinux向けにはその両方の手段をAURで実現することができるけど, 安心して使えるレベルではなかったというのが正直なところ.

Microsoftが配布しているDockerイメージをそのまま使うのが, いい感じかもしれないということで, その手順と設定について述べる.

PowerShellのDockerイメージを取得

とりあえず, PowerShellのDockerイメージを取得する.

$ docker pull microsoft/powershell:latest

PowerShellを起動してみる

起動するだけなら, docker run -it microsoft/powershell で良い. 試しに動かす程度であればこれでいいが, コンテナ内のファイルにしかアクセスできないため, 普段使いにはちょっと厳しい.

そこで次のように起動してみることにする.

$ docker run --rm -it \
    -e "HOME=$HOME" \
    -w $PWD \
    -v ${HOME/home/hosthome}:$HOME \
    microsoft/powershell

これで $HOME ディレクトリ配下のファイル/ディレクトリにアクセスできるPowerShellを起動できる. -v ${HOME/home/hosthome}:$HOME で現在のホームディレクトリをコンテナと共有させている. -e "HOME=$HOME"$HOME に, 現在のホームディレクトリを設定している. これを外すと, コンテナ内の $HOME/root である. -w $PWD で現在のディレクトリをカレントディレクトリとして起動するようにしている. --rm をつけておかないと, 実行するたびにコンテナが作られ続けてしまう.

エイリアスにしておくと, 普段使いのしやすさがもっと向上するかもしれない.

$ alias powershell='docker run --rm -it \
    -e "HOME=$HOME" \
    -w $PWD \
    -v ${HOME/home/hosthome}:$HOME \
    microsoft/powershell'

Linuxで動かすDocker Machine (VirtualBox) で共有フォルダを使う

Docker

WindowsのDocker Machine でホストとコンテナのデータを共有する場合, docker run コマンドなら -v オプションでホスト側のフォルダとして /c/Users を指定することになっている.

$ docker run -it -v /c/Users/sandbox/Projects/myapp:/myapp gcc

VirtualBoxの共有フォルダ機能で, ホストOSの C:\Users フォルダが Docker Machine (Dockerホスト) の /c/Users ディレクトリとして共有される形で, それが実現されている.

Linuxでは共有先ディレクトリのパスが異なる

Linux上で動かしている Docker Machine + VirtualBox の場合も同じだが, 共有先のディレクトリが異なるのでちょっと混乱する.

Docker Machineを動かしている環境の /home が, Dockerホストの /hosthome に対応するようになっている.

簡単に対応を整理するとこんな感じ?

Docker Machine 実行環境 Docker Machine 実行環境のフォルダ Docker ホストの共有先パス
Windows C:\Users /c/Users
Linux /home /hosthome

例えば, ソースが置いてある /home/sandbox/Projects/myapp ディレクトリを, コンテナと共有させたい場合は, 次のように実行することになる.

$ docker run -it -v /hosthome/sandbox/Projects/myapp:/code gcc

実はこのことをつい最近まで知らなくて, フォルダ共有が必要な場合にDocker Machineを使えなかった. まあ, LinuxデスクトップであえてDocker Machineを使う必要はないかもしれないけど, Docker Machineならroot権限が不要なので, 気楽に使えるんだよね.

Wayland環境でVirtualBoxのファイル選択ダイアログを出すとクラッシュする

archlinux

GNOME 3.22 (archlinux) 上で動かしているVirtualBoxで, ファイル選択ダイアログ (イメージの選択や, インポートなど) を開こうとすると, クラッシュするようになった.

ターミナルには, つぎのエラー/警告が表示されていた.

Qt WARNING: libpng warning: iCCP: known incorrect sRGB profile

(VirtualBox:4447): Gdk-WARNING **: gdkwindow-x11.c:5554 drawable is not a native X11 window
Segmentation fault

GNOME3では, ある時期から標準的にWaylandが使われるようになっている. しかし, 既存のソフトウェアが対応しきれていなくて問題になることがあるようで, VirtualBoxやQtがそれに含まれるらしい.

バックエンドをWaylandではなく, x11 とするようにするとそのたぐいの問題を回避できる.

VirtualBox の場合は, 次のように環境変数を指定して起動する.

GDK_BACKEND=x11 VirtualBox

いずれ解決する問題かとは思う.