ちゃなべの備忘録

ほぼ備忘録です。

Dockerでpythonの環境を整えるまで【備忘録】

はじめに

表題の通りです。

pythonの環境をDockerで作るのにいろいろ準備が必要だったので、それを備忘録的にまとめました。

設定

docker周り

まずお決まりの2つのファイル

version: '3'
services:
  app:
    build:
      context: .
      args:
        - UID=${UID}
        - GID=${GID}
        - USERNAME=${USERNAME}
    container_name: 'vegetation_analysis_app'
    working_dir: /app
    tty: true
    volumes:
      - .:/app
    user: "${UID}:${GID}"
    command: /bin/bash -c "/app/startup.sh && tail -f /dev/null"
  • ${ } とすることで、envファイルの変数を読み込みます。
  • argsに入れることで、Dockerfileで指定した変数を使えます。
  • command はcontainerの起動方法に関わらず、実行したら終了するので、最後に無言実行する処理を起きます。
    • /dev/null は特別なデバイスファイルで、データを読むと何も出力されない一方、データを書き込むとそのデータは破棄されます。そのため、tail -f /dev/null を実行すると、実際には何も出力されず、コマンドは何も新しいデータが追加されることを待っています(実際には/dev/nullに新しいデータが追加されることはありません)
  • userstartup.sh を実行するために指定しています。実際にはlocalのuserと同じにしているため、localで作成したstartup.shを実行することができます。
FROM python:3

# USER setting
ARG USERNAME
ARG UID
ARG GID
RUN useradd -m -s /bin/bash -u $UID -g $GID $USERNAME

USER root

RUN apt-get update
RUN apt-get -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 pip install --upgrade pip
RUN pip install --upgrade setuptools

RUN python -m pip install jupyterlab
  • 公式のimageを利用
  • ARG xx とすることでcompose.yamlで定義した変数を定義できます
  • USER設定、i18n設定、pipの整備を行いました

ipynbファイルをgitで扱うために

ipynbファイルをgitで管理しようとすると、metaデータのせいで、diffが莫大になる問題は昔からあった。

Using IPython / Jupyter Notebooks Under Version Control

解決策として、gitのコミットするたびにmetaデータを消すスクリプトを設置することらしい。

やり方はここにあります。

IPython Notebook で書いたコードをGitで管理するには?

具体的には、以下の2つのファイルを作成し、コマンドを打つだけ。

*.ipynb    filter=dropoutput_ipynb
#! /usr/bin/python

import sys
from IPython.nbformat.current import read, write

json_in = read(sys.stdin, 'json')

for sheet in json_in.worksheets:
    for cell in sheet.cells:
        if "outputs" in cell:
            cell.outputs = []
        if "prompt_number" in cell:
            cell.prompt_number = ''

write(json_in, sys.stdout, 'json')

作ったらこのコマンド

$ chmod +x ./config/ipynb_on_git/ipynb_output_filter.py

$ git config --global core.attributesfile ./config/ipynb_on_git/.gitattributes
$ git config --global filter.dropoutput_ipynb.clean ./config/ipynb_on_git/ipynb_output_filter.py 
$ git config --global filter.dropoutput_ipynb.smudge cat

VSCode拡張機能

ipynbを実行するため(?)にこの拡張機能をいれとこう。

marketplace.visualstudio.com