kuroの覚え書き

96の個人的覚え書き

Docker-composeでpython3環境をJetson Nanoに作る。

Jetson NanoにDocker-composeを入れるところまではやったので、その先の実際の運用例としてpython環境を構築してみる。

Jetson Nanoにも素の状態のpython3はインストールされているのだが、この素のpython環境にごちゃごちゃライブラリをインストールしようとすると案外うまく入ってくれない。Jetsonに固有の事情があるようだ。なのでdockerコンテナとしてpythonやそれを使ったWebアプリの環境をまとめて構築しておこうと思う。

まずはディレクトリを作り、いくつかファイルを準備。

mkdir -p ~/docker/python
cd ~/docker/python
touch Dockerfile
touch docker-compose.yml

Dockerfileの内容は

FROM python:3
USER root

RUN apt update
RUN apt -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt install -y nano less

たとえばこんな感じ。
1行目:FROM python3
でDockerが公式に用意しているpythonのコンテナイメージをダウンロードしてきて読み込むようだ。
2行目:コンテナの中でユーザはrootとして振る舞う。これを一般ユーザにすることはできるのか?>要調査
基本的にこのコンテナはデフォルトではlinux/debianの上に構築されるらしい。故にコンテナを作ったあとには一通りのアップデートやロケールなど環境設定を自動でやっておくコマンドが続く。
最後の行でnanoとlessコマンドをインストールしている。
debianなのでaptだ。個人的にはcentosyumのほうがなれているんだけどな。

次にdocker-compose.ymlの中身を見てみよう。

version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./opt:/root/opt

versionはdocker-compose.ymlのバージョンで、最新は3。2で書いているのものまだまだ見られるが、バージョンごとに書式が変わっている点があるらしい。>要調査
serviceというのがdocker-composeで複数のコンテナを連携させるときのそれぞれのコンテナを表していると考えて良さそうだ。
ここではpython3というサービスを定義している。
restart:実行時に再起動するか。
build:buildするときのディレクト
working_dir:コンテナに入ったときに入るディレクト
volumes:のところで - ./opt:/root/opt となっているのは現在のディレクトリ(Dockerfileやdocker−compose.ymlをおいたところ)に作成したoptというディレクトリをコンテナ内で/root/optにマウントしますよという意味になっている。
そのほか
ports:ポートをどうつなげるか
depends_on:Service同士の依存関係。ここで指定したサービスを先に起動する。
など。詳細はまだ調査がいるな。


さて、ここまで準備ができたら

$ docker-compose up -d --build
Creating network "python_default" with the default driver
Building python3
Sending build context to Docker daemon  5.632kB
Step 1/13 : FROM python:3
3: Pulling from library/python
6476cb406b24: Pull complete 
96565d527970: Pull complete 
aa8c15f93136: Pull complete 
ee42e24e52cb: Pull complete 
3ac9532df0bb: Pull complete 
3685c02ef2f5: Pull complete 
a9b3e03b8516: Pull complete 
22051255765a: Pull complete 
ebe16c245b5a: Pull complete 
Digest: sha256:7537c2092cdd042405001f8534b417bb276fa44303b7d1736769941907f2a19e
Status: Downloaded newer image for python:3
 ---> 9d506afcb923
Step 2/13 : USER root
 ---> Running in f59d011d672f
Removing intermediate container f59d011d672f
 ---> 7df717859527
Step 3/13 : RUN apt-get update
 ---> Running in 6c39af17c5cb

・・・・・・

Removing intermediate container 3000d9db4298
 ---> d6f5b13966d0
Successfully built d6f5b13966d0
Successfully tagged python_python3:latest
Creating python3 ... done

こんな感じで無事コンテナが出来上がる。
早速出来上がったpython3環境に入ってみる。

$ docker-compose exec python3 bash
root@00140c230b15:~# 

無事入れた。
これでJetsonの素の環境に依存しないpython(およびdebian)が使えるということだ。

何も設定せずデフォルトのまま構築してみたところ、pythonのバージョンは3.10が入った。しかしどうもこのバージョンはこれまでに作ったFlaskアプリと相性が悪いみたいなので、一旦downしてDockerfileを編集。

FROM Python:3.9.9

ついでにdocker-compose.ymlのポートも

ports:
- "5000:5000"

こうしておくとホストに5000でアクセスしたら自動的にDockerの5000にリダイレクトされるようになる。