macbook Air M1でのDockerの利用

・Docketを試す

Dockerをダウンロード、インストールします。

・Dockerfileを記述する

FROM python:3.11-slim

# 作業ディレクトリの設定
WORKDIR /app

# 必要なパッケージやライブラリをここでインストール
# 例: RUN pip install numpy pandas
RUN pip3 install \
requests \
beautifulsoup4 \
selenium \
openai \
docopt \
googletrans \
gTTS \
pydub \
mutagen \
librosa \
soundfile \
IPython \
scipy \
numpy

ターミナルでDockerfileファイルのあるディレクトリに移動して、以下のコマンドを実行します。

docker build -t my-python-image .

・VSCodeの拡張機能を使ってDockerコンテナ内での開発をセットアップ:

VSCodeの拡張機能で「Remote Development」を検索し、インストール。
VSCode左下の青アイコン 「リモートウィンドウを開きます」をクリック、「実行中のコンテナーにアタッチ…」を選択します。

上記で作成したmy-python-containerを選択します。

これでVSCodeはDockerコンテナ内のファイルやPythonインタープリタにアクセスできるようになります。

以下のコマンドでコンテナーを起動して、Visual Studio Codeの拡張機能を使ってプログラム作成までこぎつけました。

docker run -it --name my-python-container my-python-image zsh

プログラムファイルについて、コンテナーにそのまま置いておくのはコンテナーを削除すると消えてしまいます。

それ以外のファイルの保存にはDockerボリュームとバインドマウントがあり、Dockerボリュームは複雑らしいです。

そのためバインドマウントを使うことにしました。

・ディレクトリ移動

cd (Dockerfileのあるディレクトリ)

・イメージをビルド

docker build -t my-python-image .

・コンテナー起動

docker run -v (連携させたいプログラミングコードファイルのあるディレクトリ):/app -it my-python-image zsh

上記より、ローカルのディレクトリをDockerコンテナーに連動させることができました。

これでDockerで開発できる環境が整いました。しかし。。

・Dockerの環境でのエラー

root@269c1cf17b95:/app# /usr/bin/env /usr/local/bin/python /root/.vscode-server/extensions/ms-python.python-2023.18.0/pythonFiles/lib/python/debugpy/adapter/../../debugpy/launcher 53825 -- /app/kindle2text/test_mouseclick.py
Traceback (most recent call last):
File "/app/kindle2text/test_mouseclick.py", line 1, in <module>
import pyautogui
File "/usr/local/lib/python3.11/site-packages/pyautogui/__init__.py", line 246, in <module>
import mouseinfo
File "/usr/local/lib/python3.11/site-packages/mouseinfo/__init__.py", line 223, in <module>
_display = Display(os.environ['DISPLAY'])
~~~~~~~~~~^^^^^^^^^^^
File "<frozen os>", line 679, in __getitem__
KeyError: 'DISPLAY'

chatGPTの回答。

エラー内容から、Dockerコンテナ内でpyautoguiを実行しようとしているときに、DISPLAY環境変数がセットされていないことが原因として示唆されています。

pyautoguiは、GUI操作を自動化するためのライブラリで、X Window System(LinuxでのGUI表示システム)のDISPLAY環境変数に依存して動作します。DockerコンテナはデフォルトでGUI環境を持たないため、この環境変数がセットされていない状態でコンテナが起動します。

Dockerを実行するホストマシン上で以下のコマンドを実行し、X Serverが外部からの接続を受け付けるようにします。
xhost +local:root

Dockerコンテナを起動する際に、DISPLAY環境変数とX Serverのソケットをマウントします。
docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:ro [その他のオプション] [イメージ名]

これで、Dockerコンテナ内からもX Window Systemにアクセスできるようになります。pyautoguiも正常に動作するはずです。

注意:セキュリティの観点から、xhost +local:root は一時的な解決策としてのみ使用し、作業後は xhost -local:root でアクセスを再制限することをおすすめします。

pyautoguiは頻繁に使うライブラリなので、都度外部からの接続を受け入れる設定にはできません。

そのため、セキュリティに不安があるのでDockerを採用するのは止めました。

タイトルとURLをコピーしました