Docker入門

Docker入門

目次

1 概要

  • 環境構築ツール
  • 基本Linuxベース
  • Windowsバージョンは互換性が低い?

3 インストール

3.1 Ubuntu

sudo apt install docker.io
  • 以下のコマンドで、dockerを使いたいユーザーをdockerグループに追加し、マシンを再起動
sudo adduser ユーザー名 docker

3.2 Windows

  • 公式サイト配布のものもある(互換性に問題あり?)
  • 公式サイトのものも結局エミュレーター等でLinuxを動作させているので、より互換性の高い仮想マシンにLinuxをインストールし、その環境でDocker使った方が良いかも
  • Qemuを利用しUbuntuをインストールする動画アップしてます。この環境にdocker.ioをインストールしても良いかも

4 カスタマイズしたDocker imageを作成(nginx)

  • 結構問題あるimageもあるらしいので、独自のimageを比較的信用できる配布元が配布しているimageを利用して作成
  • 今回はUbuntuのbase imageを利用

4.1 以下の操作を行っている動画


4.2 Dockerfileを作成

  • 以下の内容のファイルを、作業ディレクトリを用意して作成
  • FROM でベースとなるイメージを指定
  • RUNでimegeを作成するのに必用なコマンドを記述
  • ENVで環境変数を設定
  • EXPOSE で公開するポート番号指定
  • ENTRYPOINT でimageを起動した時に実行する命令を記述
FROM ubuntu:18.04 
RUN apt -y update \
    && apt -y upgrade \
    && apt -y install locales \
    && apt -y install nginx \    
    && locale-gen ja_JP.UTF-8 
ENV LC_ALL ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE LANGUAGE=ja_JP:ja
EXPOSE 80 
ENTRYPOINT /etc/init.d/nginx start && bash

4.3 image作成

  • 以下のコマンドで mynginx という名前でDocker imageを作成
docker build -t mynginx . 

4.4 Docker image一覧確認

  • 以下の内容のファイルを、作業ディレクトリを用意して作成
docker images

4.5 作成したimageを動かす

  • 以下のコマンドで8000番ポートとDockerコンテナの80番ポートをつなげる
docker run -it -p 8000:80 mynginx

5 作成されたコンテナの削除

docker rm $(docker ps -a -q)

5.1 関係しそうなコマンド

  • すべてのコンテナ一覧表示
docker ps -a
  • すべてのコンテナ一覧のID表示
docker ps -a -q

6 作成したイメージ全部消す

docker rmi $(docker images -q)

7 django向けにカスタマイズしたDocker imageを作成(django+mysql+nginx+uwsgi)

  • 今回もUbuntuのbase imageを利用

7.1 以下の操作を行っている動画


7.2 Dockerfileを作成

  • 以下の内容のファイルを、作業ディレクトリを用意して作成
  • 1000は現在利用してるuserのuidにしてください。( grep ユーザー名 /etc/passwd や id コマンド等で調べれます)
FROM ubuntu:18.04
MAINTAINER NM Max
RUN apt -y update \
    && apt -y upgrade \
    && apt -y install mysql-client mysql-server libmysqlclient-dev libssl-dev \
    && apt -y install python3-pip python3 ipython3 \
    && apt -y install vim w3m wget diffutils sqlite3 nkf less diffutils patch sudo \
    && apt -y install nginx uwsgi-plugin-python3 \
    && apt -y install locales \
    && locale-gen ja_JP.UTF-8 \
    && pip3 install Django \
    && pip3 install mysqlclient
ENV LC_ALL ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE LANGUAGE=ja_JP:ja
RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
WORKDIR /work
COPY ./myinit.sh /work/myinit.sh
RUN chmod +x /work/myinit.sh
# RUN useradd -m --uid 1000 django -p1234 -s/bin/bash  
RUN echo "\n\n\n\n\n\n\n" | adduser --uid 1000 --disabled-password django 
RUN echo "django ALL=NOPASSWD: ALL" >> /etc/sudoers && chown django.django /work
RUN mkdir -p /home/django/C && chown  django.django /home/django/C 
# VOLUME /work /home/django/C 
EXPOSE 22 80 8000 8001
ENTRYPOINT /work/myinit.sh
  • バージョン指定したい場合は以下のようにpip3の部分にバージョン指定のオプションを追加
  • djangoのバージョン(3.0)と、mysqlclinent(1.4.6)のバージョンを指定
.... 省略
    && pip3 install Django==3.0 \
    && pip3 install mysqlclient==1.4.6
.... 省略

7.3 myinit.shを準備

  • 以下の内容にする。nginxとmysqlのサーバーを起動し、bashを動かす内容にしておく
  • 作成したdjangoのプロジェクトを含める場合は、それを起動するスクリプトも追加
#!/bin/sh
/etc/init.d/nginx start
/etc/init.d/mysql start
# /bin/bash
su - django

7.4 image作成

  • 以下のコマンドで mydjango という名前でDocker imageを作成
docker build -t mydjango . 

7.5 共有ディレクトリの作成

  • /workのディレクトリの所有権をuser.userにする場合
  • 利用しているユーザー名にuserは変更してください。(例えば、xxxなら chownxxx.xxx /work)
  • 共有ディレクトリを別にしたい場合は、/work をそのディレクトリ名に(例えば /home/user/C 等)
sudo mkdir /work
chown user.user /work

7.6 作成したimageを動かす

  • 以下のコマンドで80,8000,8001番ポートとDockerコンテナの80,8000,8001番ポートをつなげる
  • /workディレクトリを、コンテナの/home/django/Cと共有
  • ‘-i’オプションで、入力を流し込み
  • ‘-t’オプションで、ttyの出力をホスト側に流す
  • ‘–rm’オプションで、終了時にコンテナ削除
  • ‘-p’オプションで、ホストのポート番号とコンテナのポート番号を結合
  • ‘-v’オプションで、ホストのディレクトリとコンテナ内のディレクトリ共有
docker run -it --rm -p 80:80 -p 8000:8000 -p 8001:8001 -v /work:/home/django/C mydjango

7.7 テスト

  • 以下を行いdjangoユーザーになり、/home/django/Cディレクトリに移動しプロジェクト作成し、サーバー起動
su - django
cd C/
django-admin startproject mytest000
cd mytest000
python3 manage.py runserver 0:8000
  • ホスト側http://localhost:8000にて接続確認
  • ホスト側http://localhostにてnginxの接続も確認
  • ホスト側で以下のコマンドを実行し/workディレクトリが共有されファイル群が作成されていることを確認
tree /work

7.8 この章のまとめ

  • djangoを動かすとか、本番環境テストに必用なパッケージをパックしたDockerイメージを作成してみた。
  • ディレクトリ共有も行ってみた。

8 Docker imageのsave load

8.1 以下の操作を行っている動画


8.2 Docker imageのsave

docker save saveしたいimage名 > 保存したいファイル名
あるいは
docker save saveしたいimage名 -o 保存したいファイル名
docker save mydjango > mydjango.tar

8.3 Docker imageのload

docker load < 保存したファイル名
あるいは
docker load -i 保存したファイル名
docker load > mydjango.tar
docker load -o mydjango.tar
docker load -i mydjango.tar

9 django向けDocker composeを作成(django+mysql)

9.1 以下の操作を行っている動画


9.2 準備作業

9.2.1 作業用ディレクトリ生成

mkdir myDjango3.0_MySQL
cd myDjango3.0_MySQL

9.2.2 共有ディレクトリ生成

  • mkdir 命令で作成していますが、別のツールでディレクトリ作成してもOK
mkdir -p docker/mysql-docker-entrypoint-initdb.d/
mkdir -p docker/postgres-docker-entrypoint-initdb.d/
mkdir -p docker/mysql_data/
mkdir -p docker/postgres_data/
  • 作成したディレクトリツリーは以下に
.
└── docker
    ├── mysql-docker-entrypoint-initdb.d
    ├── mysql_data
    ├── postgres-docker-entrypoint-initdb.d
    └── postgres_data

9.2.3 Docker関係のファイルを準備

  1. Python(web)用
    • 以下の内容でDockerfile作成
    FROM python:3.8.1
    ENV PYTHONUNBUFFERED 1
    RUN mkdir /code
    RUN apt -y update \
        && apt -y upgrade \
        && apt -y install locales \
        && apt -y clean \
        && echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen \
        && locale-gen \
        && locale-gen ja_JP.UTF-8 
    ENV LC_ALL ja_JP.UTF-8
    ENV LANG ja_JP.UTF-8
    ENV LANGUAGE ja_JP:ja
    RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
    WORKDIR /code
    ADD requirements.txt /code/
    RUN pip install -r requirements.txt
    ADD . /code/
    
    • 以下の内容でrequirements.txtを作成
    • ==以下はバージョン指定
    • ==以下をけずると、最新バージョンがインストールされます。
    • mysqlclientはMySQL用
    • psycopg2はPostgreSQL用
    Django==3.0
    psycopg2==2.8.4
    mysqlclient==1.4.6
    
  2. MySQL(db)用
    • 以下の内容でDockerfile.mysqljp を作成
    • Docker公式mysqlパッケージに日本語関係の設定を行う内容
    FROM mysql:8.0.18
    MAINTAINER NM Max
    RUN apt -y update \
        && apt -y upgrade \
        && apt -y install locales \
        && apt -y clean \
        && echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen \
        && locale-gen \
        && locale-gen ja_JP.UTF-8 
    ENV LC_ALL ja_JP.UTF-8
    ENV LANG ja_JP.UTF-8
    ENV LANGUAGE ja_JP:ja
    RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
    
  3. docker-compose用ファイル作成
    • 以下の内容で docker-compose.yml を作成
    version: '3'
    services:
      db:
        image: mysqljp
        build:
          context: ./
          dockerfile: Dockerfile.mysqljp
        ports:
          - 3306:3306
        container_name: mysql_container
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: djangodb
          MYSQL_USER: django
          MYSQL_PASSWORD: django
          TZ: 'Asia/Tokyo'
        command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
        volumes:
          - ./docker/mysql_data:/var/lib/mysql
          - ./docker/mysql-docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
        restart: always
      web:
        image: mydjango3.0
        build:
          context: ./
          dockerfile: Dockerfile
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    

9.3 Docker image 作成(mysqljp, mydjango3.0)

  • docker/mysql_data/ docker/postgres_data/ ディレクトリ以下のファイルが存在してるとエラーになることあるので、エラーになったら消すか、移動
  • 以下のコマンドで、mysqljpとmydjango3.0 イメージが作成されます。
docker-compose build
  • 以下のコマンドで成功してるかみれます。
  • 以下のコマンドでmysqljpとmydjango3.0が作成されてたら成功
docker images

9.4 ファイルのバックアップ作成

  • 以下の手順だと、上のファイルやディレクトリを含んだmyDjango3.0_mysql.000.tgz が作成されます。
  • 好みのツールでzip圧縮でもOK
  • 次に行うテストプロジェクトで汚染される前の状態をどこか他のディレクトリにコピーでもOK
  • 後でこれらのファイルやディレクトリ群をコピーしやすくしておく
tar cvzf myDjango3.0_mysql.000.tgz *

9.5 テスト

9.5.1 テスト用のプロジェクト作成

  • 以下のコマンドを実行すると、dockertest001ディレクトリが作成され、内部に必用ファイルが作成されます。
  • docker-compose down で今起動したものを停止しておく
docker-compose run web django-admin startproject dockertest001
docker-compose down

9.5.2 作成されたファイル群の所有者を変更(Linuxの場合必用、windowsは不要かも)

  • Linuxの場合、作成されたものの所有者がroot.rootになっている場合、今作業しているユーザーに所有者を変更
sudo chown ユーザー名.ユーザー名 -R dockertest001
  • 例)現在作業しているユーザー名がuserなら以下
sudo chown user.user -R dockertest001
  • 以下のコマンドで今のユーザー名を確認可能
whoami

9.5.3 プロジェクト内に必用ファイル、ディレクトリをコピー

  • 先の手順で myDjango3.0_mysql.000.tgz を作成していたら、以下の手順でOK
  • zip圧縮や他の場所にコピーしてあれば、それをコピーしてくる
cd  dockertest001
tar xvzf ../myDjango3.0_mysql.000.tgz
docker-compose build

9.5.4 プロジェクト内のsetting.pyを修正

  • mysqlを利用するように設定変更
  • dockertest001/settings.pyをDATABASESのところを修正
... 省略
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangodb',
        'USER': 'django',
        'PASSWORD': 'django',
        'HOST': 'db',
        'PORT': 3306,
    }
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
}
... 省略

9.5.5 makemigrations の実行

  • エラーが出ずに以下を実行出来たら成功(サーバーが立ち上がるまで時間がかかるので、何度かトライする方が良い)
docker-compose up db &
docker-compose run web python manage.py makemigrations

9.5.6 migrate の実行

docker-compose run web python manage.py migrate
  • エラーが出ずに以下の様な出力が出て、データベースの内容の変更が出来たら成功
Starting mysql_container ... done
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

9.5.7 mysqldumpによるデータベースのバックアップ

  • 以下のコマンドで現状のデータベースをバックアップ
docker-compose run db mysqldump -udjango -pdjango djangodb --host db > backup.sql
  • 1行目にゴミがはいるので、エディタで1行目を消すか、sedが使えるなら以下で1行目を削除したbackup.sqlを作成出来る。
docker-compose run db mysqldump -udjango -pdjango djangodb --host db |sed '1d' > backup.sql

9.5.8 サービスの起動

  • 以下のコマンドで mydjango3.0 イメージが起動し、http://localhost:8000/をブラウザで確認すると、djangoの招待ページが表示されます。
docker-compose up

9.5.9 サービスの停止

  • 画面に出ている停止方法にしたがって、止めます。
  • Linuxなら Ctrl と C ボタンの同時押し
  • その後以下のコマンドを入力して、動いているdockerを停止
docker-compose down

9.6 この章のまとめ

  • 以前はUbuntuベースでdjango用のDocker imageを作成しましたが、今回は公式のpythonと、mysqlイメージと、docker-composeを利用して作ってみました。

10 django向けDocker composeを作成(django+postgresql)

10.1 以下の操作を行っている動画


10.2 準備作業

10.2.1 作業用ディレクトリ生成

mkdir myDjango3.0_PostgreSQL
cd myDjango3.0_PostgreSQL

10.2.2 共有ディレクトリ生成

  • mkdir 命令で作成していますが、別のツールでディレクトリ作成してもOK
mkdir -p docker/mysql-docker-entrypoint-initdb.d/
mkdir -p docker/postgres-docker-entrypoint-initdb.d/
mkdir -p docker/mysql_data/
mkdir -p docker/postgres_data/
  • 作成したディレクトリツリーは以下に
.
└── docker
    ├── mysql-docker-entrypoint-initdb.d
    ├── mysql_data
    ├── postgres-docker-entrypoint-initdb.d
    └── postgres_data

10.2.3 Docker関係のファイルを準備

  1. Python(web)用
    • 以下の内容でDockerfile作成
    FROM python:3.8.1
    ENV PYTHONUNBUFFERED 1
    RUN mkdir /code
    RUN apt -y update \
        && apt -y upgrade \
        && apt -y install locales \
        && apt -y clean \
        && echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen \
        && locale-gen \
        && locale-gen ja_JP.UTF-8 
    ENV LC_ALL ja_JP.UTF-8
    ENV LANG ja_JP.UTF-8
    ENV LANGUAGE ja_JP:ja
    RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
    WORKDIR /code
    ADD requirements.txt /code/
    RUN pip install -r requirements.txt
    ADD . /code/
    
    • 以下の内容でrequirements.txtを作成
    • ==以下はバージョン指定
    • ==以下をけずると、最新バージョンがインストールされます。
    • mysqlclientはMySQL用
    • psycopg2はPostgreSQL用
    Django==3.0
    psycopg2==2.8.4
    mysqlclient==1.4.6
    
  2. PostgreSQL(db)用
    • 以下の内容でDockerfile.postgresql作成
    FROM postgres:12.1
    MAINTAINER NM Max
    RUN apt -y update \
        && apt -y upgrade \
        && apt -y install locales \
        && apt -y clean \
        && echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen \
        && locale-gen \
        && locale-gen ja_JP.UTF-8 
    ENV LC_ALL ja_JP.UTF-8
    ENV LANG ja_JP.UTF-8
    ENV LANGUAGE ja_JP:ja
    RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
    
  3. docker-compose用ファイル作成
    • 以下の内容で docker-compose.yml を作成
    version: '3'
    services:
      db:
        image: postgresjp
        build:
          context: ./
          dockerfile: Dockerfile.postgresql
        container_name: postgres_container
        environment:
          POSTGRES_DB: djangodb
          POSTGRES_USER: django
          POSTGRES_PASSWORD: django
          TZ: 'Asia/Tokyo'
          POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=ja_JP.UTF-8"
          LC_ALL: ja_JP.UTF-8
          LANG: ja_JP.UTF-8
          LANGUAGE: ja_JP:ja
        restart: always
        volumes:
          - ./docker/postgres_data/:/var/lib/postgresql/data/
          - ./docker/postgres-docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
      web:
        image: mydjango3.0
        build:
          context: ./
          dockerfile: Dockerfile
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    

10.3 Docker image 作成(postgresjp, mydjango3.0)

  • docker/mysql_data/ docker/postgres_data/ ディレクトリ以下のファイルが存在してるとエラーになることあるので、エラーになったら消すか、移動
  • 以下のコマンドで、postgresjpとmydjango3.0 イメージが作成されます。
docker-compose build
  • 以下のコマンドで成功してるかみれます。
  • 以下のコマンドでmydjango3.0が作成されてたら成功
docker images

10.4 ファイルのバックアップ作成

  • 以下の手順だと、上のファイルやディレクトリを含んだmyDjango3.0_postgresql.000.tgz が作成されます。
  • 好みのツールでzip圧縮でもOK
  • 次に行うテストプロジェクトで汚染される前の状態をどこか他のディレクトリにコピーでもOK
  • 後でこれらのファイルやディレクトリ群をコピーしやすくしておく
tar cvzf myDjango3.0_postgresql.000.tgz *

10.5 テスト

10.5.1 テスト用のプロジェクト作成

  • 以下のコマンドを実行すると、dockertest002ディレクトリが作成され、内部に必用ファイルが作成されます。
  • docker-compose down で今起動したものを停止しておく
docker-compose run web django-admin startproject dockertest002
docker-compose down

10.5.2 作成されたファイル群の所有者を変更(Linuxの場合必用、windowsは不要かも)

  • Linuxの場合、作成されたものの所有者がroot.rootになっている場合、今作業しているユーザーに所有者を変更
sudo chown ユーザー名.ユーザー名 -R dockertest002
  • 例)現在作業しているユーザー名がuserなら以下
sudo chown user.user -R dockertest002
  • 以下のコマンドで今のユーザー名を確認可能
whoami

10.5.3 プロジェクト内に必用ファイル、ディレクトリをコピー

  • 先の手順で myDjango3.0_postgresql.000.tgz を作成していたら、以下の手順でOK
  • zip圧縮や他の場所にコピーしてあれば、それをコピーしてくる
cd  dockertest002
tar xvzf ../myDjango3.0_postgresql.000.tgz
docker-compose build

10.5.4 プロジェクト内のsetting.pyを修正

  • mysqlを利用するように設定変更
  • dockertest002/settings.pyをDATABASESのところを修正
... 省略
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'djangodb',
        'USER': 'django',
        'PASSWORD': 'django',
        'HOST': 'db',
        'PORT': 5432,
    }
#    'default': {
#        'ENGINE': 'django.db.backends.mysql',
#        'NAME': 'djangodb',
#        'USER': 'django',
#        'PASSWORD': 'django',
#        'HOST': 'db',
#        'PORT': 3306,
#    }
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
}
... 省略

10.5.5 makemigrations の実行

  • エラーが出ずに以下を実行出来たら成功(サーバーが立ち上がるまで時間がかかるので、何度かトライする方が良い)
docker-compose up db &
docker-compose run web python manage.py makemigrations

10.5.6 migrate の実行

docker-compose run web python manage.py migrate
  • エラーが出ずに以下の様な出力が出て、データベースの内容の変更が出来たら成功
Starting mysql_container ... done
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

10.5.7 サービスの起動

  • 以下のコマンドで mydjango3.0 イメージが起動し、http://localhost:8000/をブラウザで確認すると、djangoの招待ページが表示されます。
docker-compose up

10.5.8 サービスの停止

  • 画面に出ている停止方法にしたがって、止めます。
  • Linuxなら Ctrl と C ボタンの同時押し
  • その後以下のコマンドを入力して、動いているdockerを停止
docker-compose down

10.6 この章のまとめ

  • 公式のpythonと、postgresqlイメージと、docker-composeを利用してdjango向け環境を作ってみました。

11 django向けDocker composeを作成(django+sqlite3)

11.1 以下の操作を行っている動画


11.2 準備作業

11.2.1 Docker関係のファイルを準備

  • 作業用ディレクトリ作成し、その中にはいる
  • 好きなツールを使ってOK
mkdir myDjango3.0_Sqlite3
cd myDjango3.0_Sqlite3/

11.2.2 Docker関係のファイルを準備

  1. Python(web)用
    • 以下の内容でDockerfile作成
    FROM python:3.8.1
    ENV PYTHONUNBUFFERED 1
    RUN mkdir /code
    RUN apt -y update \
        && apt -y upgrade \
        && apt -y install locales \
        && apt -y clean \
        && echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen \
        && locale-gen \
        && locale-gen ja_JP.UTF-8 
    ENV LC_ALL ja_JP.UTF-8
    ENV LANG ja_JP.UTF-8
    ENV LANGUAGE ja_JP:ja
    RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
    WORKDIR /code
    ADD requirements.txt /code/
    RUN pip install -r requirements.txt
    ADD . /code/
    
    • 以下の内容でrequirements.txtを作成
    • ==以下はバージョン指定
    • ==以下をけずると、最新バージョンがインストールされます。
    • mysqlclientはMySQL用
    • psycopg2はPostgreSQL用
    Django==3.0
    psycopg2==2.8.4
    mysqlclient==1.4.6
    
  2. docker-compose用ファイル作成
    • 以下の内容で docker-compose.yml を作成
    version: '3'
    services:
      web:
        image: mydjango3.0
        build:
          context: ./
          dockerfile: Dockerfile
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
    

11.3 Docker image 作成( mydjango3.0)

  • docker/mysql_data/ docker/postgres_data/ ディレクトリ以下のファイルが存在してるとエラーになることあるので、エラーになったら消すか、移動
  • 以下のコマンドで、mysqljpとmydjango3.0 イメージが作成されます。
docker-compose build
  • 以下のコマンドで成功してるかみれます。
  • 以下のコマンドでmydjango3.0が作成されてたら成功
docker images

11.4 ファイルのバックアップ作成

  • 以下の手順だと、上のファイルやディレクトリを含んだmyDjango3.0_postgresql.000.tgz が作成されます。
  • 好みのツールでzip圧縮でもOK
  • 次に行うテストプロジェクトで汚染される前の状態をどこか他のディレクトリにコピーでもOK
  • 後でこれらのファイルやディレクトリ群をコピーしやすくしておく
tar cvzf myDjango3.0_sqlite3.000.tgz *

11.5 テスト

11.5.1 テスト用のプロジェクト作成

  • 以下のコマンドを実行すると、dockertest003ディレクトリが作成され、内部に必用ファイルが作成されます。
  • docker-compose down で今起動したものを停止しておく
docker-compose run web django-admin startproject dockertest003
docker-compose down

11.5.2 作成されたファイル群の所有者を変更(Linuxの場合必用、windowsは不要かも)

  • Linuxの場合、作成されたものの所有者がroot.rootになっている場合、今作業しているユーザーに所有者を変更
sudo chown ユーザー名.ユーザー名 -R dockertest003
  • 例)現在作業しているユーザー名がuserなら以下
sudo chown user.user -R dockertest003
  • 以下のコマンドで今のユーザー名を確認可能
whoami

11.5.3 プロジェクト内に必用ファイル、ディレクトリをコピー

  • 先の手順で myDjango3.0_sqlite3.000.tgz を作成していたら、以下の手順でOK
  • zip圧縮や他の場所にコピーしてあれば、それをコピーしてくる
cd  dockertest003
tar xvzf ../myDjango3.0_sqlite3.000.tgz
docker-compose build

11.5.4 makemigrations の実行

  • エラーが出ずに以下を実行出来たら成功(サーバーが立ち上がるまで時間がかかるので、何度かトライする方が良い)
docker-compose run web python manage.py makemigrations

11.5.5 migrate の実行

docker-compose run web python manage.py migrate
  • エラーが出ずに以下の様な出力が出て、データベースの内容の変更が出来たら成功
Starting mysql_container ... done
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

11.5.6 サービスの起動

  • 以下のコマンドで mydjango3.0 イメージが起動し、http://localhost:8000/をブラウザで確認すると、djangoの招待ページが表示されます。
docker-compose up

11.5.7 サービスの停止

  • 画面に出ている停止方法にしたがって、止めます。
  • Linuxなら Ctrl と C ボタンの同時押し
  • その後以下のコマンドを入力して、動いているdockerを停止
docker-compose down

11.6 この章のまとめ

  • 公式のpythonlイメージを利用してdjango向け環境を作ってみました。

12 docker cp (コンテナ←→ホスト間でのファイルのコピー

12.1 以下の操作を行っている動画


12.2

12.2.1 Ubuntuのイメージをプル

docker pull ubuntu

12.2.2 Ubuntuのイメージを起動

docker run  -it --rm  ubuntu

12.2.3 内部で適当にファイルを作成

  • /test.txtにの”docker cp test”を入れる
echo "docker cp test" > /test.txt
  • 以下のコマンドで内容確認
cat /test.txt

12.2.4 docker cpコマンドで /test.txt をホスト側にコピー

  1. コンテナのidを確認
    docker ps -a
    
  2. ファイルのコピー(コンテナからホストへ)
    • 確認したidを利用して以下のコマンドでコピー
    docker cp 確認したコテナのID:/test.txt ./test.txt
    
    • あるいは
    docker cp 確認したコテナのID:/test.txt .
    
    • 取り出したファイルの中身の確認
    • cat コマンドで行うなら以下のコマンド、好きなテキストエディタで確認でもOK
    cat ./test.txt
    

12.2.5 docker cpコマンドで ホスト側のファイルをコンテナ側にコピー

  1. 転送するファイルの作成
    • cat コマンドで行うなら以下、適当な内容で test2.txt ファイルを作成してください
    echo "docker cp test2" > ./test2.txt
    
  2. コンテナのidを確認
    docker ps -a
    
  3. ファイルのコピー(ホストからコンテナへ)
    docker cp ./test2.txt 確認したコテナのID:/
    
  4. コンテナ側で確認
    cat test2.txt
    

12.3 この章のまとめ

  • docker cp コマンドを利用して、ホストとコンテナ間でファイルの転送を行ってみました。

13 一般ユーザー追加したUbuntuベースのPython用パッケージ作成

  • dockercomposeで利用したdjango向けのDockerfileをPython向けにし、一般ユーザーを追加
  • djangoも必用ならdjangoもインストールするように改造してください。

13.1 このイメージ作成の目的

  • tensorflowの最新バージョンはCPUにAVX命令が必用になってて、私の安物PCはAVX命令の無いCPUのため動かず、これをAVX無しのコンパイル用に使おうとしている
  • Ubuntu 19.10ベースで色々やったけど、回避が大変なエラーが出た為( 1.15ベース、最新ベース両方 回避が大変そうなエラーで断念)、Ubuntu 18.04ベースで今コンパイル中
  • 2020/01/13 20時時点でtensorflowをコンパイル中、まだ成功してない。成功したらコンパイル手順をアップします。
  • tensorflow 1.5 だとavx命令無しでも動く、しかしPython2系のものしかpipで簡単にインストール出来ない
  • tensorflowのDockerイメージがDocker hubにあるので、avx命令が使えるCPUを持っておられる方は、それをpullするのがお勧め
  • 私も今回のコンパイルに大変時間がかかるので、avxが使える現状使ってるPCに使えるCPUを購入しました。

13.2 以下の操作を行っている動画


13.3 Dockerfileの作成

FROM ubuntu:18.04
MAINTAINER NM Max
RUN apt -y update \
    && apt -y upgrade \
    && apt -y install python3-pip python3 ipython3 python3-dev \
    && apt -y install python-pip python ipython python-dev  \
    && apt -y install vim w3m wget diffutils sqlite3 nkf less diffutils patch sudo git clang curl pkg-config zip g++ zlib1g-dev unzip \ 
    && apt -y install openssh-client openssh-server \
    && apt -y install locales \
    && locale-gen ja_JP.UTF-8 
# RUN pip install tensorflow 
# RUN pip install tensorflow==1.5 
# RUN pip3 install tensorflow 
# RUN pip3 install Django==3.0 psycopg2==2.8.4 mysqlclient==1.4.6
# RUN pip3 install Django psycopg2 mysqlclient
ENV LC_ALL ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE LANGUAGE=ja_JP:ja
RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
WORKDIR /work
COPY ./myinit.sh /work/myinit.sh
RUN chmod +x /work/myinit.sh
RUN echo "\n\n\n\n\n\n\n" | adduser --uid 1000 --disabled-password user 
RUN echo "user ALL=NOPASSWD: ALL" >> /etc/sudoers && chown user.user /work
RUN mkdir -p /home/user/C && chown  user.user /home/user/C 
EXPOSE 22 80 8000 8001
ENTRYPOINT /work/myinit.sh

13.4 myinit.shの作成

#!/bin/sh
su - user

13.5 makeDocker.shの作成

- これを実行するか、中のdocker命令を実行するとimageを作成できます。
#!/bin/sh
docker build -t mypython . 
  • 実行権限を与える
chmod +x ./makeDocker.sh

13.6 Start.shの作成

  • 起動には下のdockerから始まる命令を実行すると開始できます。
  • コンテナの/home/user/Cを、ホストの/work/mypythonに共有してます。共有ディレクトリを変更する場合は、/work/mypythonをそれに変更してください。
#!/bin/sh
docker run --rm -it -p 22:22 -p 8000:8000 -p 8001:8001 -v /work/mypython:/home/user/C mypython
  • 実行権限を与える
chmod +x ./Start.sh

13.7 囲碁用でtensorflowを利用するものを実行してみる

13.7.1 手順

  • 先程作成したイメージ起動
  • 先程作成したStart.shを動かすか、あるいは以下のコマンド実行
  • 以下のコマンドでは/work/mypythonに共有ディレクトリをリンクしてますので、他の場所を希望の場合、そこを変更してください。
docker run --rm -it -p 22:22 -p 8000:8000 -p 8001:8001 -v /work/mypython:/home/user/C mypython
  1. tensorflow インストール
    • avx命令が使えない方は以下でversion1.5(古いバージョンインストール)
    pip install tensorflow==1.5
    
    • avx命令が使えるCPUの方は以下で比較的新しいバージョンインストール
    pip install tensorflow
    
  2. Pyaq ソースゲット
    
    
  3. 用意されてるモデルを利用
    cp Pyaq/pre_train/model.ckpt Pyaq/
    
  4. 起動
    cd Pyaq
    ./pyaq.py --self --random
    

13.8 この章では

  • djangoをdockercomposeで動かす用のDockerに一般ユーザーを追加するコードを追加し修正したDockerfileを作成
  • tensorflowを利用して動く囲碁ソフトをそのイメージ内で動かしてみた

14 tensorflowをavx無しモードでコンパイル(v1.15.0-rc3)

14.1 関係リンク等、色々

--cxxopt=-std=c++11

14.2 以下の操作を行っている動画


14.3 実際に行った手順をhistoryからまとめたもの

cd C
sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python
wget https://github.com/bazelbuild/bazel/releases/download/0.26.1/bazel-0.26.1-installer-linux-x86_64.sh
chmod +x bazel-0.26.1-installer-linux-x86_64.sh
./bazel-0.26.1-installer-linux-x86_64.sh --user
source /home/user/.bazel/bin/bazel-complete.bash
export PATH=$PATH:$HOME/bin
vi ~/.bashrc
git clone https://github.com/tensorflow/tensorflow.git -b v1.15.0-rc3
cd tensorflow/
pip3 install pip six numpy wheel setuptools mock future  keras_applications keras_preprocessing
./configure
date ; bazel build --cxxopt=-std=c++11 --config=opt //tensorflow/tools/pip_package:build_pip_package ; date
sudo tar cvzf /home_user.tgz /home/user/
sudo mv -i /home_user.tgz C/
cd tensorflow/
./bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/C/tensorflow_pkg
sudo python3 -m pip install  tensorflow_pkg/tensorflow-1.15.0rc3-cp36-cp36m-linux_x86_64.whl
python3 -m pip list | grep tensor

14.4 手順解説

14.4.1 dokcerイメージ起動

  • 前章で作ったmypythonを利用,mypythonイメージの作成方法は前章を参照してください。
docker run --rm -it -p 22:22 -p 8000:8000 -p 8001:8001 -v /work/mypython:/home/user/C mypython
  • 起動したら、ホストと共有しているディレクトリに移動
cd C

14.4.2 bazelのインストール

  • 最後の vi ~/.bashrc では ~/.bashrc に source home/user.bazel/bin/bazel-complete.bash を追加
sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python
wget https://github.com/bazelbuild/bazel/releases/download/0.26.1/bazel-0.26.1-installer-linux-x86_64.sh
chmod +x bazel-0.26.1-installer-linux-x86_64.sh
./bazel-0.26.1-installer-linux-x86_64.sh --user
source /home/user/.bazel/bin/bazel-complete.bash
export PATH=$PATH:$HOME/bin
vi ~/.bashrc

14.4.3 tensorflow v1.15.0-rc3 のソースをダウンロードしてtensorflowディレクトリにはいる

git clone https://github.com/tensorflow/tensorflow.git -b v1.15.0-rc3
cd tensorflow/

14.4.4 必用パッケージインストール

pip3 install pip six numpy wheel setuptools mock future  keras_applications keras_preprocessing

14.4.5 ./configure 実行

./configure
  • 以下のように設定した
./configure
Extracting Bazel installation...
WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown".
You have bazel 1.2.1 installed.
Please specify the location of python. [Default is /usr/bin/python]: /usr/bin/python3


Found possible Python library paths:
  /usr/local/lib/python3.7/dist-packages
  /usr/lib/python3/dist-packages
Please input the desired Python library path to use.  Default is [/usr/local/lib/python3.7/dist-packages]

Do you wish to build TensorFlow with XLA JIT support? [Y/n]:
XLA JIT support will be enabled for TensorFlow.

Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]:
No OpenCL SYCL support will be enabled for TensorFlow.

Do you wish to build TensorFlow with ROCm support? [y/N]:
No ROCm support will be enabled for TensorFlow.

Do you wish to build TensorFlow with CUDA support? [y/N]:
No CUDA support will be enabled for TensorFlow.

Do you wish to download a fresh release of clang? (Experimental) [y/N]:
Clang will not be downloaded.

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native -Wno-sign-compare]:


Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]:
Not configuring the WORKSPACE for Android builds.

Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details.
  --config=mkl          # Build with MKL support.
  --config=monolithic   # Config for mostly static monolithic build.
  --config=ngraph       # Build with Intel nGraph support.
  --config=numa         # Build with NUMA support.
  --config=dynamic_kernels  # (Experimental) Build kernels into separate shared objects.
  --config=v2           # Build TensorFlow 2.x instead of 1.x.
Preconfigured Bazel build configs to DISABLE default on features:
  --config=noaws        # Disable AWS S3 filesystem support.
  --config=nogcp        # Disable GCP support.
  --config=nohdfs       # Disable HDFS support.
  --config=nonccl       # Disable NVIDIA NCCL support.
Configuration finished

14.4.6 コンパイル

date ; bazel build --cxxopt=-std=c++11 --config=opt //tensorflow/tools/pip_package:build_pip_package ; date
  • 開始時のdateの出力が以下
2020年  1月 13日 月曜日 00:49:21 UTC
  • コンパイル成功した直後の出力が以下(ほぼほぼ24時間かかってる)
..... 省略
s: 1 operators, 3 arrays (0 quantized)
2020-01-13 23:46:35.875563: I tensorflow/lite/toco/allocate_transient_arrays.cc:345] Total transient array allocated size: 0 bytes, theoretical optimal value: 0 bytes.
2020-01-13 23:46:35.875595: I tensorflow/lite/toco/toco_tooling.cc:439] Estimated count of arithmetic ops: 0 ops, equivalently 0 MACs
2020-01-13 23:46:35.875616: I tensorflow/lite/toco/toco_tooling.cc:454] Number of parameters: 0
INFO: From ProtoCompile tensorflow/contrib/rpc/python/kernel_tests/test_example.pb.h:
bazel-out/k8-opt/bin/external/com_google_protobuf/src: warning: directory does not exist.
Target //tensorflow/tools/pip_package:build_pip_package up-to-date:
  bazel-bin/tensorflow/tools/pip_package/build_pip_package
INFO: Elapsed time: 82738.966s, Critical Path: 363.36s
INFO: 19514 processes: 19514 local.
INFO: Build completed successfully, 20531 total actions
2020年  1月 13日 月曜日 23:48:21 UTC

14.4.7 バックアップ

  • コンパイルに鬼のように時間かかるので現状をバックアップ
sudo tar cvzf /home_user.tgz /home/user/
sudo mv -i /home_user.tgz ~/C/

14.4.8 pip向けパッケージ作成

cd ~/C/tensorflow/
./bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/C/tensorflow_pkg

14.4.9 作成したpip向けパッケージをインストール

sudo python3 -m pip install  tensorflow_pkg/tensorflow-1.15.0rc3-cp36-cp36m-linux_x86_64.whl

14.4.10 インストール確認

python3 -m pip list | grep tensor

14.4.11 インポートしてもcore dumpしないか確認

  • ipython3を起動
ipython3
  • 以下でtensorflowをimport
import tensorflow

14.5 この章でのまとめ

  • tensorflow v1.15.0-rc3 を cpuがavx拡張命令セットが使えないものでも動作するようにコンパイル
  • コンパイルに24時間程度必用になるため、ハードをavx対応にした方が良い
  • 公式文書のとうりではUbuntu 19.10ベースだとコンパイル中に色々エラーが発生、bazel関係のエラーが出たため断念し、Ubuntu 18.04ベースでコンパイル
  • tensorflow v1.15.0-rc3 では成功したが、gitoの最新masterや、v1.14.0-rc1はまだ成功出来てない、コンパイルに時間がかかりすぎるため、購入している交換cpuが届くまでこれで行く予定
  • 現状tensorflowを多用するなら、cpuはavx拡張命令対応のハードを使った方が良さげ

15 話題のAI関係のライブラリTensorflowをDockerで提供されているイメージを使って動かしてみる

15.1 以下の操作を行っている動画


15.2 イメージのゲット

docker pull tensorflow/tensorflow

15.3 Jupyter notebook serverをうごかしてみる

  • ディレクトリを掘る(ほってなくても自動で生成されるようだ、ただしroot権限で)
mkdir -p ~/notebooks
  • 以下のコマンドで起動
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter
  • 表示されるlocalhostのurlにアクセス

15.4 tensorflowのバージョン確認

  • 新しいノートを作成して以下のコマンドを実行
import tensorflow as tf
tf.__version__

15.5 この章のまとめ

  • Docker hubで提供されているtensorflow/tensorflowイメージを利用して、tensorflowを試してみた
  • Jupyter notebook使い勝手良いかも

16 Docker Hubのtensorflow/tensorflowを拡張、その1

  • 関係文書 https://hub.docker.com/r/tensorflow/tensorflow/
  • CPUがavx命令サポートしてないと動かないバイナリです。(avx拡張命令のないCPUの場合、コンパイルしなおす必用あり)
  • その2の予定はまだないけど、多分また拡張したくなりそうなので、拡張その1としてます。

16.1 以下の操作を行っている動画


16.2 mytensorflowイメージの作成手順

16.2.1 Docker ファイルを用意

  • 一般ユーザー(user,uidを1000)を追加
  • Python パッケージで使いそうなのを追加, tensorflow_hub,pillow,dlib等
  • その他色々てんこもりで追加(python-opencvや、tensorflow-model-server等)
FROM tensorflow/tensorflow:latest-py3-jupyter 
MAINTAINER NM Max
RUN apt -y update \
    && apt -y upgrade \
    && apt -y install python3-pip python3 ipython3 python3-dev \
    && apt -y install python-pip python ipython python-dev  \
    && apt -y install vim w3m wget diffutils sqlite3 nkf less diffutils patch sudo git clang curl pkg-config zip g++ zlib1g-dev unzip \ 
    && apt -y install openssh-client openssh-server \
    && apt -y install build-essential cmake pkg-config \
    && apt -y install libatlas-base-dev  libboost-python-dev  \
    && apt -y install python3-dev python3-pip \
    && pip3 install --upgrade pip \
    && pip3 install tensorflow_hub \
    && pip3 install pillow \
    && pip3 install dlib --verbose \
    && apt install fonts-liberation \
    && apt -y install locales \
    && locale-gen ja_JP.UTF-8 
ENV LC_ALL ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE LANGUAGE=ja_JP:ja
ENV TZ=Asia/Tokyo
RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
RUN echo "\n\n\n\n\n\n\n" | adduser --uid 1000 --disabled-password user 
RUN echo "user ALL=NOPASSWD: ALL" >> /etc/sudoers
RUN mkdir -p /home/user/C && chown  user.user /home/user/C 
ENV DEBIAN_FRONTEND=noninteractive
RUN apt -y install tzdata \
    && apt -y install python3-opencv python3-willow python3-skimage
RUN echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | tee /etc/apt/sources.list.d/tensorflow-serving.list \
    && curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add - \
    && apt-get update && apt-get install tensorflow-model-server

16.2.2 Start.shファイルを用意

  • 起動用のファイルを作成
#!/bin/sh
#docker run --rm -it -p 22:22 -p 8000:8000 -p 8001:8001 -v /work/mypython:/home/user/C mypython
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 mytensorflow
  • 以下のコマンドで実行権限を与える(Linuxの場合)
chmod +x Start.sh
  • スクリプトファイルを利用出来ない環境の場合は以下で、直接起動スクリプトが実行している命令を実行してください。
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 mytensorflow

16.2.3 makeDocker.shファイルを用意

  • Dockerファイルを利用して、Dockerのイメージを作成する用のスクリプトファイルを作成。
#!/bin/sh
docker build -t mytensorflow . 
  • 実行権限を与える
chmod +x makeDocker.sh

16.2.4 イメージの作成

  • スクリプトファイルを利用できる環境の場合、上で作成したmakeDocker.shスクリプトを実行
./makeDocker.sh
  • スクリプトファイルを利用出来ない環境の場合は、以下
docker build -t mytensorflow . 

16.3 mytensorflowイメージの利用手順

16.3.1 mytensorflow起動1

  • スクリプトファイルを利用できる環境の場合、上で作成したStart.shスクリプトを実行
./Start.sh
  • スクリプトファイルを利用出来ない環境の場合は、以下
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 mytensorflow

16.3.2 mytensorflow起動2

  • 起動したら、メッセージが表示されます。最後の http://127.0.0.1/.. 省略 の部分をコピーして、ブラウザでそのURLを開く
  • ブラウザでterminalを起動したら、最初にbashを実行するとより使いやすくなる。

16.4 この章のまとめ

  • 既存のTensorflow Hubにあるイメージの拡張を行いました。
  • まだまだ、色々よく使うパッケージやソフトがあると思うので、拡張その2も作るかも。
  • 一般ユーザーを追加したので、より使いやすい。
  • 今のところ便利にこのイメージ利用してます。ベースがUbuntu 18.04なので、TensorFlow以外の用途にも使ってます。自分の環境を汚さずに色々試せて良い感じ。

17 Docker Hubのtensorflow/tensorflowを拡張、その2

  • 前章のDocker Hubのtensorflow/tensorflowをさらに拡張
  • ソースを読みやすくするGNU Globalを追加(pygmentを追加してpythonのソースにも対応させる)

17.1 以下の操作を行っている動画


17.2 mytensorflowイメージの作成手順

17.2.1 Docker ファイルを用意

  • GNU Globalを追加
FROM tensorflow/tensorflow:latest-py3-jupyter 
MAINTAINER NM Max
RUN apt -y update \
    && apt -y upgrade \
    && apt -y install python3-pip python3 ipython3 python3-dev \
    && apt -y install python-pip python ipython python-dev  \
    && apt -y install vim w3m wget diffutils sqlite3 nkf less diffutils patch sudo git clang curl pkg-config zip g++ zlib1g-dev unzip \ 
    && apt -y install openssh-client openssh-server \
    && apt -y install build-essential cmake pkg-config \
    && apt -y install libatlas-base-dev  libboost-python-dev  \
    && apt -y install python3-dev python3-pip \
    && pip3 install --upgrade pip \
    && pip3 install tensorflow_hub \
    && pip3 install pillow \
    && pip3 install dlib --verbose \
    && apt install fonts-liberation \
    && apt -y install locales \
    && locale-gen ja_JP.UTF-8 
ENV LC_ALL ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE LANGUAGE=ja_JP:ja
ENV TZ=Asia/Tokyo
RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
RUN echo "\n\n\n\n\n\n\n" | adduser --uid 1000 --disabled-password user 
RUN echo "user ALL=NOPASSWD: ALL" >> /etc/sudoers
RUN mkdir -p /home/user/C && chown  user.user /home/user/C 
ENV DEBIAN_FRONTEND=noninteractive
RUN apt -y install tzdata \
    && apt -y install python3-opencv python3-willow python3-skimage
RUN echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | tee /etc/apt/sources.list.d/tensorflow-serving.list \
    && curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add - \
    && apt-get update && apt-get install tensorflow-model-server \
    && apt -y install global id-utils python-pygments exuberant-ctags python-pygments python3-pygments
COPY gtags.conf /etc/gtags.conf

17.2.2 gtags.confファイルを用意

#
# Copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2010, 2011, 2013,
#       2015, 2016, 2017
#       Tama Communications Corporation
#
# This file is part of GNU GLOBAL.
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# *
# Configuration file for GNU GLOBAL source code tagging system.
#
# Basically, GLOBAL doesn't need this configuration file ('gtags.conf'),
# because it has default values in itself. If you have this file as
# '/etc/gtags.conf' or "$HOME/.globalrc" then GLOBAL overwrite the default
# values with values in the file.
# Configuration file is also necessary to use plug-in parsers.
#
# The format is similar to termcap(5). You can specify a target with
# GTAGSLABEL environment variable. Default target is 'default'.
#
# If you want to have default values for yourself, it is recommended to
# use the following method:
#
# default:\
#       :tc=default@~/.globalrc:\       <= includes default values from ~/.globalrc.
#       :tc=native:
#
# Please refer to gtags.conf(5) for details.
#
default:\
        :tc=native:
native:\
        :tc=gtags:tc=htags:
user:\
        :tc=user-custom:tc=htags:
ctags:\
        :tc=exuberant-ctags:tc=htags:
new-ctags:\
        :tc=universal-ctags:tc=htags:
pygments:\
        :tc=pygments-parser:tc=htags:
#
# [How to merge two or more parsers?]
#
# Rule: The first matched langmap is adopted.
#
# ":tc=builtin-parser:tc=pygments-parser:" means:
#       If built-in parser exists for the target, it is used.
#       Else if pygments parser exists it is used.
#
native-pygments:\
        :tc=builtin-parser:tc=pygments-parser:tc=htags:
#---------------------------------------------------------------------
# Configuration for gtags(1)
# See gtags(1).
#---------------------------------------------------------------------
common:\
        :skip=HTML/,HTML.pub/,tags,TAGS,ID,y.tab.c,y.tab.h,gtags.files,cscope.files,cscope.out,cscope.po.out,cscope.in.out,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,autom4te.cache/,*.orig,*.rej,*.bak,*~,#*#,*.swp,*.tmp,*_flymake.*,*_flymake,*.o,*.a,*.so,*.lo,*.zip,*.gz,*.bz2,*.xz,*.lzh,*.Z,*.tgz,*.min.js,*min.css:
#
# Built-in parsers.
#
gtags:\
        :tc=common:\
        :tc=builtin-parser:
builtin-parser:\
        :langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.hh.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
#
# skeleton for user's custom parser.
#
user-custom|User custom plugin parser:\
        :tc=common:\
        :langmap=c\:.c.h:\
        :gtags_parser=c\:$libdir/gtags/user-custom.la:
#
# Plug-in parser to use Exuberant Ctags.
#
# Most of the following definitions were automatically generated by this command line:
# $ perl maps2conf.pl /user/local/bin/ctags '$libdir/gtags/exuberant-ctags.la'
# ('/user/local/bin/ctags' should be replaced with the path of Exuberant Ctags.)
#
exuberant-ctags|plugin-example|setting to use Exuberant Ctags plug-in parser:\
        :tc=common:\
        :ctagscom=/usr/bin/ctags:\
        :ctagslib=$libdir/gtags/exuberant-ctags.la:\
        :langmap=Ant\:(*.build.xml):\
        :langmap=Asm\:.asm.ASM.s.S.A51(*.29[kK])(*.[68][68][kKsSxX])(*.[xX][68][68]):\
        :langmap=Asp\:.asp.asa:\
        :langmap=Awk\:.awk.gawk.mawk:\
        :langmap=Basic\:.bas.bi.bb.pb:\
        :langmap=BETA\:.bet:\
        :langmap=C\:.c:\
        :langmap=C++\:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.C.H:\
        :langmap=C#\:.cs:\
        :langmap=Cobol\:.cbl.cob.CBL.COB:\
        :langmap=DosBatch\:.bat.cmd:\
        :langmap=Eiffel\:.e:\
        :langmap=Erlang\:.erl.ERL.hrl.HRL:\
        :langmap=Flex\:.as.mxml:\
        :langmap=Fortran\:.f.for.ftn.f77.f90.f95.F.FOR.FTN.F77.F90.F95:\
        :langmap=HTML\:.htm.html:\
        :langmap=Java\:.java:\
        :langmap=JavaScript\:.js:\
        :langmap=Lisp\:.cl.clisp.el.l.lisp.lsp:\
        :langmap=Lua\:.lua:\
        :langmap=Make\:.mak.mk([Mm]akefile)(GNUmakefile):\
        :langmap=MatLab\:.m:\
        :langmap=OCaml\:.ml.mli:\
        :langmap=Pascal\:.p.pas:\
        :langmap=Perl\:.pl.pm.plx.perl:\
        :langmap=PHP\:.php.php3.phtml:\
        :langmap=Python\:.py.pyx.pxd.pxi.scons:\
        :langmap=REXX\:.cmd.rexx.rx:\
        :langmap=Ruby\:.rb.ruby:\
        :langmap=Scheme\:.SCM.SM.sch.scheme.scm.sm:\
        :langmap=Sh\:.sh.SH.bsh.bash.ksh.zsh:\
        :langmap=SLang\:.sl:\
        :langmap=SML\:.sml.sig:\
        :langmap=SQL\:.sql:\
        :langmap=Tcl\:.tcl.tk.wish.itcl:\
        :langmap=Tex\:.tex:\
        :langmap=Vera\:.vr.vri.vrh:\
        :langmap=Verilog\:.v:\
        :langmap=VHDL\:.vhdl.vhd:\
        :langmap=Vim\:.vim:\
        :langmap=YACC\:.y:\
        :gtags_parser=Ant\:$ctagslib:\
        :gtags_parser=Asm\:$ctagslib:\
        :gtags_parser=Asp\:$ctagslib:\
        :gtags_parser=Awk\:$ctagslib:\
        :gtags_parser=Basic\:$ctagslib:\
        :gtags_parser=BETA\:$ctagslib:\
        :gtags_parser=C\:$ctagslib:\
        :gtags_parser=C++\:$ctagslib:\
        :gtags_parser=C#\:$ctagslib:\
        :gtags_parser=Cobol\:$ctagslib:\
        :gtags_parser=DosBatch\:$ctagslib:\
        :gtags_parser=Eiffel\:$ctagslib:\
        :gtags_parser=Erlang\:$ctagslib:\
        :gtags_parser=Flex\:$ctagslib:\
        :gtags_parser=Fortran\:$ctagslib:\
        :gtags_parser=HTML\:$ctagslib:\
        :gtags_parser=Java\:$ctagslib:\
        :gtags_parser=JavaScript\:$ctagslib:\
        :gtags_parser=Lisp\:$ctagslib:\
        :gtags_parser=Lua\:$ctagslib:\
        :gtags_parser=Make\:$ctagslib:\
        :gtags_parser=MatLab\:$ctagslib:\
        :gtags_parser=OCaml\:$ctagslib:\
        :gtags_parser=Pascal\:$ctagslib:\
        :gtags_parser=Perl\:$ctagslib:\
        :gtags_parser=PHP\:$ctagslib:\
        :gtags_parser=Python\:$ctagslib:\
        :gtags_parser=REXX\:$ctagslib:\
        :gtags_parser=Ruby\:$ctagslib:\
        :gtags_parser=Scheme\:$ctagslib:\
        :gtags_parser=Sh\:$ctagslib:\
        :gtags_parser=SLang\:$ctagslib:\
        :gtags_parser=SML\:$ctagslib:\
        :gtags_parser=SQL\:$ctagslib:\
        :gtags_parser=Tcl\:$ctagslib:\
        :gtags_parser=Tex\:$ctagslib:\
        :gtags_parser=Vera\:$ctagslib:\
        :gtags_parser=Verilog\:$ctagslib:\
        :gtags_parser=VHDL\:$ctagslib:\
        :gtags_parser=Vim\:$ctagslib:\
        :gtags_parser=YACC\:$ctagslib:
#
# Plug-in parser to use Universal Ctags.
#
# Most of the following definitions were automatically generated by this command line:
# $ perl maps2conf.pl /usr/local/bin/ctags '$libdir/gtags/universal-ctags.la'
# ('/user/local/bin/ctags' should be replaced with the path of Universal Ctags.)
#
universal-ctags|setting to use Universal Ctags plug-in parser:\
        :tc=common:\
        :ctagscom=:\
        :ctagslib=$libdir/gtags/universal-ctags.la:\
        :langmap=Ada\:.adb.ads.Ada:\
        :langmap=Ant\:(build.xml)(*.build.xml).ant.xml:\
        :langmap=Asm\:.A51(*.29[kK])(*.[68][68][kKsSxX])(*.[xX][68][68]).asm.ASM.s.S:\
        :langmap=Asp\:.asp.asa:\
        :langmap=Autoconf\:(configure.in).ac:\
        :langmap=Automake\:(Makefile.am).am:\
        :langmap=Awk\:.awk.gawk.mawk:\
        :langmap=Basic\:.bas.bi.bb.pb:\
        :langmap=BETA\:.bet:\
        :langmap=Clojure\:.clj.cljs.cljc:\
        :langmap=C\:.c:\
        :langmap=C++\:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.inl:\
        :langmap=CSS\:.css:\
        :langmap=C#\:.cs:\
        :langmap=ctags\:.ctags:\
        :langmap=Cobol\:.cbl.cob.CBL.COB:\
        :langmap=CUDA\:.cu.cuh:\
        :langmap=D\:.d.di:\
        :langmap=Diff\:.diff.patch:\
        :langmap=DTD\:.dtd.mod:\
        :langmap=DTS\:.dts.dtsi:\
        :langmap=DosBatch\:.bat.cmd:\
        :langmap=Eiffel\:.e:\
        :langmap=elm\:.elm:\
        :langmap=Erlang\:.erl.ERL.hrl.HRL:\
        :langmap=Falcon\:.fal.ftd:\
        :langmap=Flex\:.as.mxml:\
        :langmap=Fortran\:.f.for.ftn.f77.f90.f95.f03.f08.f15:\
        :langmap=gdbinit\:(.gdbinit).gdb:\
        :langmap=Go\:.go:\
        :langmap=HTML\:.htm.html:\
        :langmap=Iniconf\:.ini.conf:\
        :langmap=ITcl\:.itcl:\
        :langmap=Java\:.java:\
        :langmap=JavaProperties\:.properties:\
        :langmap=JavaScript\:.js.jsx:\
        :langmap=JSON\:.json:\
        :langmap=LdScript\:(*.lds.S)(ld.*).lds.scr.ld:\
        :langmap=Lisp\:.cl.clisp.el.l.lisp.lsp:\
        :langmap=Lua\:.lua:\
        :langmap=M4\:.m4.spt:\
        :langmap=man\:.1.2.3.4.5.6.7.8.9:\
        :langmap=Make\:([Mm]akefile)(GNUmakefile).mak.mk:\
        :langmap=MatLab\:.m:\
        :langmap=Myrddin\:.myr:\
        :langmap=ObjectiveC\:.mm.m.h:\
        :langmap=OldC++\:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.inl:\
        :langmap=OldC\:.c:\
        :langmap=OCaml\:.ml.mli.aug:\
        :langmap=passwd\:(passwd):\
        :langmap=Pascal\:.p.pas:\
        :langmap=Perl\:.pl.pm.ph.plx.perl:\
        :langmap=Perl6\:.p6.pm6.pm.pl6:\
        :langmap=PHP\:.php.php3.php4.php5.php7.phtml:\
        :langmap=pod\:.pod:\
        :langmap=Protobuf\:.proto:\
        :langmap=puppetManifest\:.pp:\
        :langmap=Python\:.py.pyx.pxd.pxi.scons:\
        :langmap=QemuHX\:.hx:\
        :langmap=R\:.r.R.s.q:\
        :langmap=REXX\:.cmd.rexx.rx:\
        :langmap=Robot\:.robot:\
        :langmap=RpmSpec\:.spec:\
        :langmap=reStructuredText\:.rest.reST.rst:\
        :langmap=Ruby\:.rb.ruby:\
        :langmap=Rust\:.rs:\
        :langmap=Scheme\:.SCM.SM.sch.scheme.scm.sm:\
        :langmap=Sh\:.sh.SH.bsh.bash.ksh.zsh.ash:\
        :langmap=SLang\:.sl:\
        :langmap=SML\:.sml.sig:\
        :langmap=SQL\:.sql:\
        :langmap=SystemdUnit\:.unit.service.socket.device.mount.automount.swap.target.path.timer.snapshot.scope.slice.time:\
        :langmap=Tcl\:.tcl.tk.wish.exp:\
        :langmap=Tex\:.tex:\
        :langmap=TTCN\:.ttcn.ttcn3:\
        :langmap=Vera\:.vr.vri.vrh:\
        :langmap=Verilog\:.v:\
        :langmap=SystemVerilog\:.sv.svh.svi:\
        :langmap=VHDL\:.vhdl.vhd:\
        :langmap=Vim\:(vimrc)([._]vimrc)(gvimrc)([._]gvimrc).vim.vba:\
        :langmap=WindRes\:.rc:\
        :langmap=YACC\:.y:\
        :langmap=YumRepo\:.repo:\
        :langmap=Zephir\:.zep:\
        :langmap=DBusIntrospect\:.xml:\
        :langmap=Glade\:.glade:\
        :langmap=Maven2\:(pom.xml).pom.xml:\
        :langmap=PlistXML\:.plist:\
        :langmap=RelaxNG\:.rng:\
        :langmap=SVG\:.svg:\
        :langmap=XSLT\:.xsl.xslt:\
        :gtags_parser=Ada\:$ctagslib:\
        :gtags_parser=Ant\:$ctagslib:\
        :gtags_parser=Asm\:$ctagslib:\
        :gtags_parser=Asp\:$ctagslib:\
        :gtags_parser=Autoconf\:$ctagslib:\
        :gtags_parser=Automake\:$ctagslib:\
        :gtags_parser=Awk\:$ctagslib:\
        :gtags_parser=Basic\:$ctagslib:\
        :gtags_parser=BETA\:$ctagslib:\
        :gtags_parser=Clojure\:$ctagslib:\
        :gtags_parser=C\:$ctagslib:\
        :gtags_parser=C++\:$ctagslib:\
        :gtags_parser=CSS\:$ctagslib:\
        :gtags_parser=C#\:$ctagslib:\
        :gtags_parser=ctags\:$ctagslib:\
        :gtags_parser=Cobol\:$ctagslib:\
        :gtags_parser=CUDA\:$ctagslib:\
        :gtags_parser=D\:$ctagslib:\
        :gtags_parser=Diff\:$ctagslib:\
        :gtags_parser=DTD\:$ctagslib:\
        :gtags_parser=DTS\:$ctagslib:\
        :gtags_parser=DosBatch\:$ctagslib:\
        :gtags_parser=Eiffel\:$ctagslib:\
        :gtags_parser=elm\:$ctagslib:\
        :gtags_parser=Erlang\:$ctagslib:\
        :gtags_parser=Falcon\:$ctagslib:\
        :gtags_parser=Flex\:$ctagslib:\
        :gtags_parser=Fortran\:$ctagslib:\
        :gtags_parser=gdbinit\:$ctagslib:\
        :gtags_parser=Go\:$ctagslib:\
        :gtags_parser=HTML\:$ctagslib:\
        :gtags_parser=Iniconf\:$ctagslib:\
        :gtags_parser=ITcl\:$ctagslib:\
        :gtags_parser=Java\:$ctagslib:\
        :gtags_parser=JavaProperties\:$ctagslib:\
        :gtags_parser=JavaScript\:$ctagslib:\
        :gtags_parser=JSON\:$ctagslib:\
        :gtags_parser=LdScript\:$ctagslib:\
        :gtags_parser=Lisp\:$ctagslib:\
        :gtags_parser=Lua\:$ctagslib:\
        :gtags_parser=M4\:$ctagslib:\
        :gtags_parser=man\:$ctagslib:\
        :gtags_parser=Make\:$ctagslib:\
        :gtags_parser=MatLab\:$ctagslib:\
        :gtags_parser=Myrddin\:$ctagslib:\
        :gtags_parser=ObjectiveC\:$ctagslib:\
        :gtags_parser=OldC++\:$ctagslib:\
        :gtags_parser=OldC\:$ctagslib:\
        :gtags_parser=OCaml\:$ctagslib:\
        :gtags_parser=passwd\:$ctagslib:\
        :gtags_parser=Pascal\:$ctagslib:\
        :gtags_parser=Perl\:$ctagslib:\
        :gtags_parser=Perl6\:$ctagslib:\
        :gtags_parser=PHP\:$ctagslib:\
        :gtags_parser=pod\:$ctagslib:\
        :gtags_parser=Protobuf\:$ctagslib:\
        :gtags_parser=puppetManifest\:$ctagslib:\
        :gtags_parser=Python\:$ctagslib:\
        :gtags_parser=QemuHX\:$ctagslib:\
        :gtags_parser=R\:$ctagslib:\
        :gtags_parser=REXX\:$ctagslib:\
        :gtags_parser=Robot\:$ctagslib:\
        :gtags_parser=RpmSpec\:$ctagslib:\
        :gtags_parser=reStructuredText\:$ctagslib:\
        :gtags_parser=Ruby\:$ctagslib:\
        :gtags_parser=Rust\:$ctagslib:\
        :gtags_parser=Scheme\:$ctagslib:\
        :gtags_parser=Sh\:$ctagslib:\
        :gtags_parser=SLang\:$ctagslib:\
        :gtags_parser=SML\:$ctagslib:\
        :gtags_parser=SQL\:$ctagslib:\
        :gtags_parser=SystemdUnit\:$ctagslib:\
        :gtags_parser=Tcl\:$ctagslib:\
        :gtags_parser=Tex\:$ctagslib:\
        :gtags_parser=TTCN\:$ctagslib:\
        :gtags_parser=Vera\:$ctagslib:\
        :gtags_parser=Verilog\:$ctagslib:\
        :gtags_parser=SystemVerilog\:$ctagslib:\
        :gtags_parser=VHDL\:$ctagslib:\
        :gtags_parser=Vim\:$ctagslib:\
        :gtags_parser=WindRes\:$ctagslib:\
        :gtags_parser=YACC\:$ctagslib:\
        :gtags_parser=YumRepo\:$ctagslib:\
        :gtags_parser=Zephir\:$ctagslib:\
        :gtags_parser=DBusIntrospect\:$ctagslib:\
        :gtags_parser=Glade\:$ctagslib:\
        :gtags_parser=Maven2\:$ctagslib:\
        :gtags_parser=PlistXML\:$ctagslib:\
        :gtags_parser=RelaxNG\:$ctagslib:\
        :gtags_parser=SVG\:$ctagslib:\
        :gtags_parser=XSLT\:$ctagslib:
#
# Plug-in parser to use Pygments.
#
pygments-parser|Pygments plug-in parser:\
        :tc=common:\
        :ctagscom=/usr/bin/ctags:\
        :pygmentslib=$libdir/gtags/pygments-parser.la:\
        :langmap=ABAP\:.abap:\
        :langmap=ANTLR\:.G.g:\
        :langmap=ActionScript3\:.as:\
        :langmap=Ada\:.adb.ads.ada:\
        :langmap=AppleScript\:.applescript:\
        :langmap=AspectJ\:.aj:\
        :langmap=Aspx-cs\:.aspx.asax.ascx.ashx.asmx.axd:\
        :langmap=Asymptote\:.asy:\
        :langmap=AutoIt\:.au3:\
        :langmap=Awk\:.awk.gawk.mawk:\
        :langmap=BUGS\:.bug:\
        :langmap=Bash\:.sh.ksh.bash.ebuild.eclass:\
        :langmap=Bat\:.bat.cmd:\
        :langmap=BlitzMax\:.bmx:\
        :langmap=Boo\:.boo:\
        :langmap=Bro\:.bro:\
        :langmap=C#\:.cs:\
        :langmap=C++\:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.C.H:\
        :langmap=COBOLFree\:.cbl.CBL:\
        :langmap=COBOL\:.cob.COB.cpy.CPY:\
        :langmap=CUDA\:.cu.cuh:\
        :langmap=C\:.c.h:\
        :langmap=Ceylon\:.ceylon:\
        :langmap=Cfm\:.cfm.cfml.cfc:\
        :langmap=Clojure\:.clj:\
        :langmap=CoffeeScript\:.coffee:\
        :langmap=Common-Lisp\:.cl.lisp.el:\
        :langmap=Coq\:.v:\
        :langmap=Croc\:.croc:\
        :langmap=Csh\:.tcsh.csh:\
        :langmap=Cython\:.pyx.pxd.pxi:\
        :langmap=Dart\:.dart:\
        :langmap=Dg\:.dg:\
        :langmap=Duel\:.duel.jbst:\
        :langmap=Dylan\:.dylan.dyl.intr:\
        :langmap=ECL\:.ecl:\
        :langmap=EC\:.ec.eh:\
        :langmap=ERB\:.erb:\
        :langmap=Elixir\:.ex.exs:\
        :langmap=Erlang\:.erl.hrl.es.escript:\
        :langmap=Evoque\:.evoque:\
        :langmap=FSharp\:.fs.fsi:\
        :langmap=Factor\:.factor:\
        :langmap=Fancy\:.fy.fancypack:\
        :langmap=Fantom\:.fan:\
        :langmap=Felix\:.flx.flxh:\
        :langmap=Fortran\:.f.f90.F.F90:\
        :langmap=GAS\:.s.S:\
        :langmap=GLSL\:.vert.frag.geo:\
        :langmap=Genshi\:.kid:\
        :langmap=Gherkin\:.feature:\
        :langmap=Gnuplot\:.plot.plt:\
        :langmap=Go\:.go:\
        :langmap=GoodData-CL\:.gdc:\
        :langmap=Gosu\:.gs.gsx.gsp.vark:\
        :langmap=Groovy\:.groovy:\
        :langmap=Gst\:.gst:\
        :langmap=HaXe\:.hx:\
        :langmap=Haml\:.haml:\
        :langmap=Haskell\:.hs:\
        :langmap=Hxml\:.hxml:\
        :langmap=Hybris\:.hy.hyb:\
        :langmap=IDL\:.pro:\
        :langmap=Io\:.io:\
        :langmap=Ioke\:.ik:\
        :langmap=JAGS\:.jag.bug:\
        :langmap=Jade\:.jade:\
        :langmap=JavaScript\:.js:\
        :langmap=Java\:.java:\
        :langmap=Jsp\:.jsp:\
        :langmap=Julia\:.jl:\
        :langmap=Koka\:.kk.kki:\
        :langmap=Kotlin\:.kt:\
        :langmap=LLVM\:.ll:\
        :langmap=Lasso\:.lasso:\
        :langmap=Literate-Haskell\:.lhs:\
        :langmap=LiveScript\:.ls:\
        :langmap=Logos\:.x.xi.xm.xmi:\
        :langmap=Logtalk\:.lgt:\
        :langmap=Lua\:.lua.wlua:\
        :langmap=MOOCode\:.moo:\
        :langmap=MXML\:.mxml:\
        :langmap=Mako\:.mao:\
        :langmap=Mason\:.m.mhtml.mc.mi:\
        :langmap=Matlab\:.m:\
        :langmap=Modelica\:.mo:\
        :langmap=Modula2\:.mod:\
        :langmap=Monkey\:.monkey:\
        :langmap=MoonScript\:.moon:\
        :langmap=MuPAD\:.mu:\
        :langmap=Myghty\:.myt:\
        :langmap=NASM\:.asm.ASM:\
        :langmap=NSIS\:.nsi.nsh:\
        :langmap=Nemerle\:.n:\
        :langmap=NewLisp\:.lsp.nl:\
        :langmap=Newspeak\:.ns2:\
        :langmap=Nimrod\:.nim.nimrod:\
        :langmap=OCaml\:.ml.mli.mll.mly:\
        :langmap=Objective-C++\:.mm.hh:\
        :langmap=Objective-C\:.m.h:\
        :langmap=Objective-J\:.j:\
        :langmap=Octave\:.m:\
        :langmap=Ooc\:.ooc:\
        :langmap=Opa\:.opa:\
        :langmap=OpenEdge\:.p.cls:\
        :langmap=PHP\:.php.php3.phtml:\
        :langmap=Pascal\:.pas:\
        :langmap=Perl\:.pl.pm:\
        :langmap=PostScript\:.ps.eps:\
        :langmap=PowerShell\:.ps1:\
        :langmap=Prolog\:.prolog.pro.pl:\
        :langmap=Python\:.py.pyw.sc.tac.sage:\
        :langmap=QML\:.qml:\
        :langmap=REBOL\:.r.r3:\
        :langmap=RHTML\:.rhtml:\
        :langmap=Racket\:.rkt.rktl:\
        :langmap=Ragel\:.rl:\
        :langmap=Redcode\:.cw:\
        :langmap=RobotFramework\:.robot:\
        :langmap=Ruby\:.rb.rbw.rake.gemspec.rbx.duby:\
        :langmap=Rust\:.rs.rc:\
        :langmap=S\:.S.R:\
        :langmap=Scala\:.scala:\
        :langmap=Scaml\:.scaml:\
        :langmap=Scheme\:.scm.ss:\
        :langmap=Scilab\:.sci.sce.tst:\
        :langmap=Smalltalk\:.st:\
        :langmap=Smarty\:.tpl:\
        :langmap=Sml\:.sml.sig.fun:\
        :langmap=Snobol\:.snobol:\
        :langmap=SourcePawn\:.sp:\
        :langmap=Spitfire\:.spt:\
        :langmap=Ssp\:.ssp:\
        :langmap=Stan\:.stan:\
        :langmap=SystemVerilog\:.sv.svh:\
        :langmap=Tcl\:.tcl:\
        :langmap=TeX\:.tex.aux.toc:\
        :langmap=Tea\:.tea:\
        :langmap=Treetop\:.treetop.tt:\
        :langmap=TypeScript\:.ts:\
        :langmap=UrbiScript\:.u:\
        :langmap=VB.net\:.vb.bas:\
        :langmap=VGL\:.rpf:\
        :langmap=Vala\:.vala.vapi:\
        :langmap=Velocity\:.vm.fhtml:\
        :langmap=Verilog\:.v:\
        :langmap=Vhdl\:.vhdl.vhd:\
        :langmap=Vim\:.vim:\
        :langmap=XBase\:.PRG.prg:\
        :langmap=XQuery\:.xqy.xquery.xq.xql.xqm:\
        :langmap=XSLT\:.xsl.xslt.xpl:\
        :langmap=Xtend\:.xtend:\
        :gtags_parser=ABAP\:$pygmentslib:\
        :gtags_parser=ANTLR\:$pygmentslib:\
        :gtags_parser=ActionScript3\:$pygmentslib:\
        :gtags_parser=Ada\:$pygmentslib:\
        :gtags_parser=AppleScript\:$pygmentslib:\
        :gtags_parser=AspectJ\:$pygmentslib:\
        :gtags_parser=Aspx-cs\:$pygmentslib:\
        :gtags_parser=Asymptote\:$pygmentslib:\
        :gtags_parser=AutoIt\:$pygmentslib:\
        :gtags_parser=Awk\:$pygmentslib:\
        :gtags_parser=BUGS\:$pygmentslib:\
        :gtags_parser=Bash\:$pygmentslib:\
        :gtags_parser=Bat\:$pygmentslib:\
        :gtags_parser=BlitzMax\:$pygmentslib:\
        :gtags_parser=Boo\:$pygmentslib:\
        :gtags_parser=Bro\:$pygmentslib:\
        :gtags_parser=C#\:$pygmentslib:\
        :gtags_parser=C++\:$pygmentslib:\
        :gtags_parser=COBOLFree\:$pygmentslib:\
        :gtags_parser=COBOL\:$pygmentslib:\
        :gtags_parser=CUDA\:$pygmentslib:\
        :gtags_parser=C\:$pygmentslib:\
        :gtags_parser=Ceylon\:$pygmentslib:\
        :gtags_parser=Cfm\:$pygmentslib:\
        :gtags_parser=Clojure\:$pygmentslib:\
        :gtags_parser=CoffeeScript\:$pygmentslib:\
        :gtags_parser=Common-Lisp\:$pygmentslib:\
        :gtags_parser=Coq\:$pygmentslib:\
        :gtags_parser=Croc\:$pygmentslib:\
        :gtags_parser=Csh\:$pygmentslib:\
        :gtags_parser=Cython\:$pygmentslib:\
        :gtags_parser=Dart\:$pygmentslib:\
        :gtags_parser=Dg\:$pygmentslib:\
        :gtags_parser=Duel\:$pygmentslib:\
        :gtags_parser=Dylan\:$pygmentslib:\
        :gtags_parser=ECL\:$pygmentslib:\
        :gtags_parser=EC\:$pygmentslib:\
        :gtags_parser=ERB\:$pygmentslib:\
        :gtags_parser=Elixir\:$pygmentslib:\
        :gtags_parser=Erlang\:$pygmentslib:\
        :gtags_parser=Evoque\:$pygmentslib:\
        :gtags_parser=FSharp\:$pygmentslib:\
        :gtags_parser=Factor\:$pygmentslib:\
        :gtags_parser=Fancy\:$pygmentslib:\
        :gtags_parser=Fantom\:$pygmentslib:\
        :gtags_parser=Felix\:$pygmentslib:\
        :gtags_parser=Fortran\:$pygmentslib:\
        :gtags_parser=GAS\:$pygmentslib:\
        :gtags_parser=GLSL\:$pygmentslib:\
        :gtags_parser=Genshi\:$pygmentslib:\
        :gtags_parser=Gherkin\:$pygmentslib:\
        :gtags_parser=Gnuplot\:$pygmentslib:\
        :gtags_parser=Go\:$pygmentslib:\
        :gtags_parser=GoodData-CL\:$pygmentslib:\
        :gtags_parser=Gosu\:$pygmentslib:\
        :gtags_parser=Groovy\:$pygmentslib:\
        :gtags_parser=Gst\:$pygmentslib:\
        :gtags_parser=HaXe\:$pygmentslib:\
        :gtags_parser=Haml\:$pygmentslib:\
        :gtags_parser=Haskell\:$pygmentslib:\
        :gtags_parser=Hxml\:$pygmentslib:\
        :gtags_parser=Hybris\:$pygmentslib:\
        :gtags_parser=IDL\:$pygmentslib:\
        :gtags_parser=Io\:$pygmentslib:\
        :gtags_parser=Ioke\:$pygmentslib:\
        :gtags_parser=JAGS\:$pygmentslib:\
        :gtags_parser=Jade\:$pygmentslib:\
        :gtags_parser=JavaScript\:$pygmentslib:\
        :gtags_parser=Java\:$pygmentslib:\
        :gtags_parser=Jsp\:$pygmentslib:\
        :gtags_parser=Julia\:$pygmentslib:\
        :gtags_parser=Koka\:$pygmentslib:\
        :gtags_parser=Kotlin\:$pygmentslib:\
        :gtags_parser=LLVM\:$pygmentslib:\
        :gtags_parser=Lasso\:$pygmentslib:\
        :gtags_parser=Literate-Haskell\:$pygmentslib:\
        :gtags_parser=LiveScript\:$pygmentslib:\
        :gtags_parser=Logos\:$pygmentslib:\
        :gtags_parser=Logtalk\:$pygmentslib:\
        :gtags_parser=Lua\:$pygmentslib:\
        :gtags_parser=MAQL\:$pygmentslib:\
        :gtags_parser=MOOCode\:$pygmentslib:\
        :gtags_parser=MXML\:$pygmentslib:\
        :gtags_parser=Mako\:$pygmentslib:\
        :gtags_parser=Mason\:$pygmentslib:\
        :gtags_parser=Matlab\:$pygmentslib:\
        :gtags_parser=MiniD\:$pygmentslib:\
        :gtags_parser=Modelica\:$pygmentslib:\
        :gtags_parser=Modula2\:$pygmentslib:\
        :gtags_parser=Monkey\:$pygmentslib:\
        :gtags_parser=MoonScript\:$pygmentslib:\
        :gtags_parser=MuPAD\:$pygmentslib:\
        :gtags_parser=Myghty\:$pygmentslib:\
        :gtags_parser=NASM\:$pygmentslib:\
        :gtags_parser=NSIS\:$pygmentslib:\
        :gtags_parser=Nemerle\:$pygmentslib:\
        :gtags_parser=NewLisp\:$pygmentslib:\
        :gtags_parser=Newspeak\:$pygmentslib:\
        :gtags_parser=Nimrod\:$pygmentslib:\
        :gtags_parser=OCaml\:$pygmentslib:\
        :gtags_parser=Objective-C++\:$pygmentslib:\
        :gtags_parser=Objective-C\:$pygmentslib:\
        :gtags_parser=Objective-J\:$pygmentslib:\
        :gtags_parser=Octave\:$pygmentslib:\
        :gtags_parser=Ooc\:$pygmentslib:\
        :gtags_parser=Opa\:$pygmentslib:\
        :gtags_parser=OpenEdge\:$pygmentslib:\
        :gtags_parser=PHP\:$pygmentslib:\
        :gtags_parser=Pascal\:$pygmentslib:\
        :gtags_parser=Perl\:$pygmentslib:\
        :gtags_parser=PostScript\:$pygmentslib:\
        :gtags_parser=PowerShell\:$pygmentslib:\
        :gtags_parser=Prolog\:$pygmentslib:\
        :gtags_parser=Python\:$pygmentslib:\
        :gtags_parser=QML\:$pygmentslib:\
        :gtags_parser=REBOL\:$pygmentslib:\
        :gtags_parser=RHTML\:$pygmentslib:\
        :gtags_parser=Racket\:$pygmentslib:\
        :gtags_parser=Ragel\:$pygmentslib:\
        :gtags_parser=Redcode\:$pygmentslib:\
        :gtags_parser=RobotFramework\:$pygmentslib:\
        :gtags_parser=Ruby\:$pygmentslib:\
        :gtags_parser=Rust\:$pygmentslib:\
        :gtags_parser=S\:$pygmentslib:\
        :gtags_parser=Scala\:$pygmentslib:\
        :gtags_parser=Scaml\:$pygmentslib:\
        :gtags_parser=Scheme\:$pygmentslib:\
        :gtags_parser=Scilab\:$pygmentslib:\
        :gtags_parser=Smalltalk\:$pygmentslib:\
        :gtags_parser=Smarty\:$pygmentslib:\
        :gtags_parser=Sml\:$pygmentslib:\
        :gtags_parser=Snobol\:$pygmentslib:\
        :gtags_parser=SourcePawn\:$pygmentslib:\
        :gtags_parser=Spitfire\:$pygmentslib:\
        :gtags_parser=Ssp\:$pygmentslib:\
        :gtags_parser=Stan\:$pygmentslib:\
        :gtags_parser=SystemVerilog\:$pygmentslib:\
        :gtags_parser=Tcl\:$pygmentslib:\
        :gtags_parser=TeX\:$pygmentslib:\
        :gtags_parser=Tea\:$pygmentslib:\
        :gtags_parser=Treetop\:$pygmentslib:\
        :gtags_parser=TypeScript\:$pygmentslib:\
        :gtags_parser=UrbiScript\:$pygmentslib:\
        :gtags_parser=VB.net\:$pygmentslib:\
        :gtags_parser=VGL\:$pygmentslib:\
        :gtags_parser=Vala\:$pygmentslib:\
        :gtags_parser=Velocity\:$pygmentslib:\
        :gtags_parser=Verilog\:$pygmentslib:\
        :gtags_parser=Vhdl\:$pygmentslib:\
        :gtags_parser=Vim\:$pygmentslib:\
        :gtags_parser=XBase\:$pygmentslib:\
        :gtags_parser=XQuery\:$pygmentslib:\
        :gtags_parser=XSLT\:$pygmentslib:\
        :gtags_parser=Xtend\:$pygmentslib:
#
# Drupal configuration.
#
drupal|Drupal content management platform:\
        :tc=common:\
        :langmap=php\:.php.module.inc.profile.install.test:
#---------------------------------------------------------------------
# Configuration for htags(1)
#---------------------------------------------------------------------
htags:\
        ::

17.2.3 Start.shファイルを用意

  • 起動用のファイルを作成
#!/bin/sh
#docker run --rm -it -p 22:22 -p 8000:8000 -p 8001:8001 -v /work/mypython:/home/user/C mypython
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 mytensorflow
  • 以下のコマンドで実行権限を与える(Linuxの場合)
chmod +x Start.sh
  • スクリプトファイルを利用出来ない環境の場合は以下で、直接起動スクリプトが実行している命令を実行してください。
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 mytensorflow

17.2.4 makeDocker.shファイルを用意

  • Dockerファイルを利用して、Dockerのイメージを作成する用のスクリプトファイルを作成。
#!/bin/sh
docker build -t mytensorflow . 
  • 実行権限を与える
chmod +x makeDocker.sh

17.2.5 イメージの作成

  • スクリプトファイルを利用できる環境の場合、上で作成したmakeDocker.shスクリプトを実行
./makeDocker.sh
  • スクリプトファイルを利用出来ない環境の場合は、以下
docker build -t mytensorflow . 

17.3 mytensorflowイメージの利用手順

17.3.1 mytensorflow起動1

  • スクリプトファイルを利用できる環境の場合、上で作成したStart.shスクリプトを実行
./Start.sh
  • スクリプトファイルを利用出来ない環境の場合は、以下
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 mytensorflow

17.3.2 mytensorflow起動2

  • 起動したら、メッセージが表示されます。最後の http://127.0.0.1/.. 省略 の部分をコピーして、ブラウザでそのURLを開く
  • ブラウザでterminalを起動したら、最初にbashを実行するとより使いやすくなる。

17.4 この章のまとめ

  • 既存のTensorflow Hubにあるイメージの拡張その2を行いました。(GNU GlobalでPythonにも対応できるものを追加)

18 Rails6向けDockerイメージの作成

18.1 以下の操作を行っている動画


18.2 手順

18.2.1 Dockerfileを作成

  • rubyのバージョンはDocker Hubのrubyのimageのバージョンで指定
  • rails, ユーザーネーム, ユーザーID, nodejsのメジャーバージョン, PostgreSQLのクライアントのメジャーバージョン, yarnのバージョンの設定を可能としてます。
  • 起動後は一般ユーザーで起動するようにしてある
FROM ruby:2.6.5
MAINTAINER NM Max
ENV rails_v=6.0.2.1
ENV user_n=user
ENV user_id=1000
ENV node_v=12
ENV postgresql_v=11
ENV yarn_v=1.21.1-1
RUN apt -y update \
    && apt -y upgrade \
    && apt -y install vim w3m wget diffutils sqlite3 nkf less diffutils patch sudo git clang curl pkg-config zip g++ zlib1g-dev unzip \ 
    && apt -y install openssh-client openssh-server \
    && apt -y install locales locales-all\
    && apt -y install -y gcc g++ make clang \
    && apt -y install -y libssl-dev libreadline-dev zlib1g-dev 
RUN echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen && \
    update-locale
ENV LC_ALL ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE LANGUAGE=ja_JP:ja
RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
RUN echo "\n\n\n\n\n\n\n" | adduser --uid ${user_id} --disabled-password ${user_n}
RUN echo "${user_n} ALL=NOPASSWD: ALL" >> /etc/sudoers
RUN mkdir -p /home/${user_n}/C && chown  ${user_n}.${user_n} /home/${user_n}/C 
ENV DEBIAN_FRONTEND=noninteractive
RUN apt -y install libsqlite3-dev && apt -y install tzdata 
RUN gem install rails -v ${rails_v} 
RUN curl -sL https://deb.nodesource.com/setup_${node_v}.x | bash -
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main '${postgresql_v} >> /etc/apt/sources.list.d/pgdg.list && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list 
RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get -y dist-upgrade \
  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    build-essential \
    postgresql-client-${postgresql_v} \
    nodejs \
    yarn=${yarn_v} \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 
EXPOSE 22 80 3000 8000 8001
RUN echo 'export GEM_HOME=/usr/local/bundle' >> /root/.bashrc ; echo 'export BUNDLE_SILENCE_ROOT_WARNING=1' >> /root/.bashrc ; echo 'export BUNDLE_APP_CONFIG="$GEM_HOME"' >>  /root/.bashrc ; echo 'export PATH="$GEM_HOME/bin:$PATH"' >>  /root/.bashrc
RUN echo 'export GEM_HOME=/usr/local/bundle' >> /home/${user_n}/.bashrc ; echo 'export BUNDLE_SILENCE_ROOT_WARNING=1' >> /home/${user_n}/.bashrc ; echo 'export BUNDLE_APP_CONFIG="$GEM_HOME"' >>  /home/${user_n}/.bashrc ; echo 'export PATH="$GEM_HOME/bin:$PATH"' >>  /home/${user_n}/.bashrc
ENTRYPOINT sudo su - ${user_n}

18.2.2 makeDocker.sh を作成

#!/bin/sh
docker build -t myrails . 
  • 以下で実行権限を与える
chmod +x ./makeDocker.sh
  • makeDockerを実行してイメージ作成、スクリプトファイルが使えない環境なら以下を実行
docker build -t myrails . 

18.2.3 Start.shを作成

#!/bin/sh
docker run -it --rm -p 22:22 -p 3000:3000 -v /work/myrails:/home/user/C myrails
  • 以下で実行権限を与える
chmod +x ./Start.sh
  • スクリプトファイルが使えない環境なら以下を実行
docker run -it --rm -p 22:22 -p 3000:3000 -v /work/myrails:/home/user/C myrails

18.2.4 起動後

  • 一般ユーザーのuserで起動します
  • プロジェクトを作成して、作ったプロジェクトを起動
rails new testapp 
cd testapp
rails s -b 0.0.0.0

18.3 この章のまとめ

  • 最新のRails6を動かす、Dockerイメージを作成し、動かしてみた
  • 一般ユーザーも追加し、日本語ロケール設定も行った

19 Rails6向けDockerイメージの作成2(改良バージョン)

  • 前章のイメージの改良バージョン
  • プロジェクト作成に必用になるgemをバージョン指定で入れてある
  • ホームディレクトリにtest000というプロジェクトファイルを生成済みで含めてある

19.1 以下の操作を行っている動画


19.2 手順

19.2.1 Dockerfileを作成

  • rubyのバージョンはDocker Hubのrubyのimageのバージョンで指定
  • rails, ユーザーネーム, ユーザーID, nodejsのメジャーバージョン, PostgreSQLのクライアントのメジャーバージョン, yarnのバージョンの設定を可能としてます。
  • 起動後は一般ユーザーで起動するようにしてある
FROM ruby:2.6.5
MAINTAINER NM Max
ENV rails_v=6.0.2.1
ENV user_n=user
ENV user_id=1000
ENV node_v=12
ENV postgresql_v=11
ENV yarn_v=1.22.0-1
RUN apt -y update \
    && apt -y upgrade \
    && apt -y install vim w3m wget diffutils sqlite3 nkf less diffutils patch sudo git clang curl pkg-config zip g++ zlib1g-dev unzip nmap tree \ 
    && apt -y install openssh-client openssh-server \
    && apt -y install locales locales-all\
    && apt -y install -y gcc g++ make clang \
    && apt -y install -y libssl-dev libreadline-dev zlib1g-dev 
RUN echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen && \
    update-locale
ENV LC_ALL ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE LANGUAGE=ja_JP:ja
RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
RUN echo "\n\n\n\n\n\n\n" | adduser --uid ${user_id} --disabled-password ${user_n}
RUN echo "${user_n} ALL=NOPASSWD: ALL" >> /etc/sudoers
RUN mkdir -p /home/${user_n}/C && chown  ${user_n}.${user_n} /home/${user_n}/C 
ENV DEBIAN_FRONTEND=noninteractive
RUN apt -y install libsqlite3-dev && apt -y install tzdata 
RUN gem install rails -v ${rails_v} 
RUN curl -sL https://deb.nodesource.com/setup_${node_v}.x | bash -
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main '${postgresql_v} >> /etc/apt/sources.list.d/pgdg.list && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list 
RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get -y dist-upgrade \
  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    build-essential \
    postgresql-client-${postgresql_v} \
    postgresql-${postgresql_v} \
    nodejs \
    yarn=${yarn_v} \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 
EXPOSE 22 80 3000 8000 8001
RUN echo 'export GEM_HOME=/usr/local/bundle' >> /root/.bashrc ; echo 'export BUNDLE_SILENCE_ROOT_WARNING=1' >> /root/.bashrc ; echo 'export BUNDLE_APP_CONFIG="$GEM_HOME"' >>  /root/.bashrc ; echo 'export PATH="$GEM_HOME/bin:$PATH"' >>  /root/.bashrc
RUN echo 'export GEM_HOME=/usr/local/bundle' >> /home/${user_n}/.bashrc ; echo 'export BUNDLE_SILENCE_ROOT_WARNING=1' >> /home/${user_n}/.bashrc ; echo 'export BUNDLE_APP_CONFIG="$GEM_HOME"' >>  /home/${user_n}/.bashrc ; echo 'export PATH="$GEM_HOME/bin:$PATH"' >>  /home/${user_n}/.bashrc
RUN gem install rake -v "13.0.1" && \
    gem install minitest -v "5.14.0" && \
    gem install public_suffix -v "4.0.3" && \
    gem install addressable -v "2.7.0" && \
    gem install bindex -v "0.8.1" && \
    gem install msgpack -v "1.3.3" && \
    gem install bootsnap -v "1.4.6" && \
    gem install byebug -v "11.1.1" && \
    gem install regexp_parser -v "1.7.0" && \
    gem install xpath -v "3.2.0" && \
    gem install capybara -v "3.31.0" && \
    gem install childprocess -v "3.0.0" && \
    gem install ffi -v "1.12.2" && \
    gem install jbuilder -v "2.10.0" && \
    gem install rb-fsevent -v "0.10.3" && \
    gem install rb-inotify -v "0.10.1" && \
    gem install ruby_dep -v "1.5.0" && \
    gem install listen -v "3.1.5" && \
    gem install puma -v "4.3.3" && \
    gem install rack-proxy -v "0.6.5" && \
    gem install rubyzip -v "2.2.0" && \
    gem install sassc -v "2.2.1" && \
    gem install tilt -v "2.0.10" && \
    gem install sassc-rails -v "2.1.2" && \
    gem install sass-rails -v "6.0.0" && \
    gem install selenium-webdriver -v "3.142.7" && \
    gem install spring -v "2.1.0" && \
    gem install spring-watcher-listen -v "2.0.1" && \
    gem install sqlite3 -v "1.4.2" && \
    gem install turbolinks-source -v "5.2.0" && \
    gem install turbolinks -v "5.2.1" && \
    gem install web-console -v "4.0.1" && \
    gem install webdrivers -v "4.2.0" && \
    gem install webpacker -v "4.2.2" 
# RUN apt purge -y libmariadb-dev libmariadb-dev-compat libmariadb3 mariadb-common
RUN echo ' export GEM_HOME=/usr/local/bundle ; export BUNDLE_SILENCE_ROOT_WARNING=1 ; export BUNDLE_APP_CONFIG="$GEM_HOME" ; export PATH="$GEM_HOME/bin:$PATH" ; rails new test000 --webpack=vue && cd test000 && rails action_text:install && rails db:migrate ' | sudo su - ${user_n}
ENTRYPOINT sudo su - ${user_n}

19.2.2 makeDocker.sh を作成

#!/bin/sh
docker build -t myrails3 . 
  • 以下で実行権限を与える
chmod +x ./makeDocker.sh
  • makeDockerを実行してイメージ作成、スクリプトファイルが使えない環境なら以下を実行
docker build -t myrails3 . 

19.2.3 Start.shを作成

#!/bin/sh
docker run -it --rm -p 22:22 -p 3000:3000 -v /work/myrails:/home/user/C myrails3
  • 以下で実行権限を与える
chmod +x ./Start.sh
  • スクリプトファイルが使えない環境なら以下を実行
docker run -it --rm -p 22:22 -p 3000:3000 -v /work/myrails:/home/user/C myrails3

19.2.4 起動後

  • 一般ユーザーのuserで起動します
  • プロジェクトを作成して、作ったプロジェクトを起動
cd test000 
rails s -b 0.0.0.0

19.3 後でGemfileを変更して必用なパッケージが増えた時

  • Gemfileを変更(例えば以下を追加)
gem "devise"
  • bundle install をして必用なパッケージをインストール
bundle install
  • 以下をDockerイメージ内で実行して追加されたパッケージを確認
ls -lFtr /usr/local/bundle/gems/ 
  • こんな感じになる。時間がずれてるところで、最後の方が追加されたパッケージ
....省略
drwxr-xr-x 7 root root 4096  3月  1 13:37 webpacker-4.2.2/
drwxr-xr-x 5 root root 4096  3月  1 14:16 bcrypt-3.1.13/
drwxr-xr-x 5 root root 4096  3月  1 14:16 orm_adapter-0.5.0/
drwxr-xr-x 3 root root 4096  3月  1 14:16 responders-3.0.0/
drwxr-xr-x 3 root root 4096  3月  1 14:16 warden-1.2.8/
drwxr-xr-x 5 root root 4096  3月  1 14:16 devise-4.7.1/
  • 新しく追加されたパッケージの部分をコピペ。今回だと以下に
drwxr-xr-x 5 root root 4096  3月  1 14:16 bcrypt-3.1.13/
drwxr-xr-x 5 root root 4096  3月  1 14:16 orm_adapter-0.5.0/
drwxr-xr-x 3 root root 4096  3月  1 14:16 responders-3.0.0/
drwxr-xr-x 3 root root 4096  3月  1 14:16 warden-1.2.8/
drwxr-xr-x 5 root root 4096  3月  1 14:16 devise-4.7.1/
  • ディレクトリ名以外は邪魔なので矩形指定で消す( Vimなら ctrl-v 押してから、矢印キーで範囲指定し、xで削除)
bcrypt-3.1.13/
orm_adapter-0.5.0/
responders-3.0.0/
warden-1.2.8/
devise-4.7.1/
  • これらの行をvimなら Ctrl+Shift+vを同時押しして、矢印で範囲指定し、 :キーを押してコマンド入力モードに
:'<,'>
  • が表示されてるので、この後に以下を入れエンター、これで最初にgem install が追加される
s/^/gem install /
  • 以下の感じに
gem install bcrypt-3.1.13/
gem install orm_adapter-0.5.0/
gem install responders-3.0.0/
gem install warden-1.2.8/
gem install devise-4.7.1/
  • これらの行をvimなら Ctrl+Shift+vを同時押しして、矢印で範囲指定し、 :キーを押してコマンド入力モードに
:'<,'>
  • が表示されてるので、この後に以下を入れエンター、これでおしりの部分が変形される
s/-\([0-9.]*\)\/$/ -v "\1" \&\& \\/
  • こんな感じに
gem install bcrypt -v "3.1.13" && \
gem install orm_adapter -v "0.5.0" && \
gem install responders -v "3.0.0" && \
gem install warden -v "1.2.8" && \
gem install devise -v "4.7.1" && \
  • 最後の行のおしりを消して、最初にRUN を追加し、インデントをvimなら Ctrl+Shift+vしてから矢印キーで選択後,シフト+>キーでインデントを揃えると以下に
RUN gem install bcrypt -v "3.1.13" && \
    gem install orm_adapter -v "0.5.0" && \
    gem install responders -v "3.0.0" && \
    gem install warden -v "1.2.8" && \
    gem install devise -v "4.7.1"
  • これをDockerの最後の方に追加

19.4 この章のまとめ

  • 前章のRails6向けDockerイメージの改良
  • 元々必用なGemもバージョン指定してDockerイメージに取り込み
  • デフォルトでtest000プロジェクトを生成したものもイメージに入れておいた(手軽に試せる)

20 色々な工夫(2021/05/18バージョン)

  • 今までのだと、DockerImage内の時計が日本時間とズレる(これの修正)
  • 同じapt updateが含まれる行のDockerfileを時間差をもって実行するとキャッシュが使われて、最新のパッケージリストじゃなく、かつてapt updateした時のパッケージリストがキャッシュから利用されてしまい、追加パッケージをダウンロード出来ないエラーで途中で止まってしまう事があった(キャッシュ無視でDocker Imageの作成をした方が良いケースあり)

20.1 以下の操作を行っている動画


20.2 色々な工夫2021/05/18バージョン手順

20.2.1 今までのだと、DockerImage内の時計が日本時間とズレる(これの修正) 対策方法(Ubuntuの場合)

  • Dockerfile で ENV DEBIAN_FRONTEND=noninteractive を使ってたら、コメントアウト(行頭に#を追加)
  • apt -y update && apt -y upgrade した後に echo “6\n79\n” | apt -y install tzdataを行う。これはtzdataを入れる時にタイムゾーンを聞かれるので、日本の東京を選択するのに必要な6のあと79を入れるようにした命令
FROM ubuntu:20.04
... 省略
#ENV DEBIAN_FRONTEND=noninteractive
... 省略
RUN apt -y update && apt -y upgrade 
RUN echo "6\n79\n" | apt -y install tzdata
... 省略

20.2.2 同じ(apt updateが含まれる行のDockerfileを時間差をもって実行するとキャッシュが使われて、最新のパッケージリストじゃなく、かつてapt updateした時のパッケージリストがキャッシュから利用されてしまい、追加パッケージをダウンロード出来ないエラーで途中で止まってしまう事があった(キャッシュ無視でDocker Imageの作成をした方が良いケースあり)時用の対策方法

  • docker build 刷る時に –no-cache オプションを追加して、キャッシュを利用しないようにする
  • 例えば mybuildozer のイメージ作成するには以下のコマンド
docker build --no-cache  -t mybuildozer .

20.3 この章のまとめ

  • 最近DockerでUbuntuベースでDocker Imageつくる時に追加してる工夫をまとめてみました。

21 PythonでAndroidアプリ作る用のDocker Imageの作成(2021/05/18バージョン)

  • 昔一度作ろうとしたが、Dockerfile内の命令で、GoogleのAndroid SDK NDKを入れる時のライセンスの認証入力の自動化がうまくいかず放置してた
  • ホスト側のAndroid SDKやNDKをディレクトリ共有でやったらいけそうな気して、作ってみた
  • YaneuraOuさんの将棋エンジン、詰将棋エンジンのAndroidクロスコンパイルをやるのにも使いたくて、文書化、動画化しようとしてる

21.1 以下の操作を行っている動画


21.2 PythonでAndroidアプリ作る用のDocker Imageの作成(2021/05/18バージョン) の手順

21.2.1 事前準備

  • 前準備として、Android SDK NDKをインストールする必要があります。https://youtu.be/3U5_330aySk
  • /work/Android に mount –bindして以下は行なっています。違うディレクトリにインストールしている場合は、そのディレクトリに置き換えてください。

21.2.2 Dockerfileを作成

  • 起動後は一般ユーザーで起動するようにしてある
  • Pythonパッケージでもっと入れた方が良いのあるけど、最小構成
  • Buldozerにもパッチ当てた方が良いとこあるけど、そこは現在は行わないDockerfile
    • ホストとの共有ディレクトリ内にvirtualenvを作成して、そこでBuldozerの修正行なった方が良いかも
  • YaneuraOuさんの将棋エンジンや、詰将棋エンジンのクロスコンパイルにも利用予定
  • Android SDKやNDKはホスト側に用意して、利用する方針
    • イメージにこれらも組み込む場合は、ホスト側で用意してから、COPYでDocker Imageに入れると良い
    • イメージのサイズが相当大きくなりそうだから、ホスト側においといて、起動時にディレクトリ共有する手順にするつもり
FROM ubuntu:20.04
MAINTAINER NM Max
#ENV DEBIAN_FRONTEND=noninteractive
ENV user_n=user
ENV user_id=1000
RUN apt -y update && apt -y upgrade 
RUN echo "6\n79\n" | apt -y install tzdata
RUN apt -y install python3-dev python3-pip vim git g++ clang cmake make w3m less python3-ipython ipython3 nkf less diffutils patch sudo zlib1g-dev unzip locales python3-virtualenv openjdk-8-jdk adb \
    && locale-gen ja_JP.UTF-8 \
    && pip3 install pybind11 \
    && pip3 install buildozer 
RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/default/locale
ENV LC_ALL ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE LANGUAGE=ja_JP:ja
RUN echo "${user_n} ALL=NOPASSWD: ALL" >> /etc/sudoers
WORKDIR /work
RUN echo "\n\n\n\n\n\n\n" | adduser --uid ${user_id} --disabled-password ${user_n}
RUN echo "user ALL=NOPASSWD: ALL" >> /etc/sudoers && chown user.user /work
RUN mkdir -p /home/${user_n}/C && chown  ${user_n}.${user_n} /home/${user_n}/C
RUN mkdir -p /home/${user_n}/Android && chown  ${user_n}.${user_n} /home/${user_n}/Android
COPY set.sh /home/${user_n}/
RUN echo ". /home/${user_n}/set.sh" >> /home/${user_n}/.bashrc
ENTRYPOINT sudo su - ${user_n}

21.2.3 Android SDKやNDKを利用する時用の環境変数をセットするスクリプトファイルset.shを用意

export NDK_PATH=${HOME}/Android/SDK/ndk-bundle
export PATH=${HOME}/Android/SDK/cmake/3.10.2.4988404/bin:${HOME}/Android/SDK/cmdline-tools/latest/bin:${NDK_PATH}:$PATH
export ANDROID_SDK_ROOT=${HOME}/Android/SDK
export SDK_PATH=${ANDROID_SDK_ROOT}

21.2.4 Docker Image作成

docker build -t mybuildozer .
  • もし、apt install 時にパッケージがないとかエラーでるなら、古いキャッシュを利用しているのが原因かも、その場合は以下でイメージ作成を行う(キャッシュを利用しないようにして)
docker build --no-cache -t mybuildozer .

21.2.5 動作確認

  • ホストの /work/Android と ドッカーの/home/user/Android ディレクトリの共有 を行うようにオプション指定してあります。違うディレクトリと共有したい場合は /work/Android をそのディレクトリに変更
  • ホストの /work/mybuildozer と ドッカーの/home/user/C ディレクトリの共有 。 違うディレクトリと共有したい場合は /work/Android をそのディレクトリに変更
docker run -it --rm -v /work/Android:/home/user/Android -v /work/mybuildozer:/home/user/C mybuildozer

21.2.6 その他

  • Androidアプリや実行ファイルは上のDockerfileと上記の起動方法で可能だが、端末へのインストール転送は、ホスト側のadbコマンドで行う仕様(現在は)

21.3 この章のまとめ

  • YaneuraOuさんの将棋エンジンをAndroid用にクロスコンパイル可能で、PythonでAndroidアプリ作成出来るDocker Imageを作成してみた

22 今後

  • こんぱ今後も文書追加していきます。

23 この文書のチェンジログ

  • 2019/12/10 初版
  • 2019/12/12 django向けカスタマイズイメージ作成章追加
  • 2019/12/12 Docker imageのsave loadの章追加
  • 2019/12/28 docker-composeを利用し、django向け環境3つ(MySQL,PostgreSQL,SQLite3)を作成する3つの章追加
  • 2019/12/28 docker-composeを利用し、django向け(MySQL)のPython用Dockerfile修正
  • 2020/01/12 docker cpのの解説の章追加
  • 2020/01/13 一般ユーザー追加したUbuntuベースのPython用パッケージ作成 の章を追加
  • 2020/01/14 tensorflow v1.15.0-rc3 コンパイルの章追加
  • 2020/01/22 DockerHubのtensorflowイメージ利用の章追加
  • 2020/02/03 DockerHubのtensorflowイメージ拡張その1の章を追加
  • 2020/02/04 DockerHubのtensorflowイメージ拡張その2の章を追加
  • 2020/02/06 Rails6を動かすDockerイメージの作成
  • 2020/03/01 Rails6を動かすDockerイメージの作成2 の章を追加
  • 2021/05/18 色々な工夫(2021/05/18バージョン) の章の追加
  • 2021/05/18 PythonでAndroidアプリ作る用のDocker Imageの作成(2021/05/18バージョン) の章の追加

著者: NM Max

Created: 2021-05-18 火 23:47

Validate