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だ。個人的にはcentosのyumのほうがなれているんだけどな。
次に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にリダイレクトされるようになる。