Docker入門
目次
- 1. 概要
- 2. リンク
- 3. インストール
- 4. カスタマイズしたDocker imageを作成(nginx)
- 5. 作成されたコンテナの削除
- 6. 作成したイメージ全部消す
- 7. django向けにカスタマイズしたDocker imageを作成(django+mysql+nginx+uwsgi)
- 8. Docker imageのsave load
- 9. django向けDocker composeを作成(django+mysql)
- 10. django向けDocker composeを作成(django+postgresql)
- 11. django向けDocker composeを作成(django+sqlite3)
- 12. docker cp (コンテナ←→ホスト間でのファイルのコピー
- 13. 一般ユーザー追加したUbuntuベースのPython用パッケージ作成
- 14. tensorflowをavx無しモードでコンパイル(v1.15.0-rc3)
- 15. 話題のAI関係のライブラリTensorflowをDockerで提供されているイメージを使って動かしてみる
- 16. Docker Hubのtensorflow/tensorflowを拡張、その1
- 17. Docker Hubのtensorflow/tensorflowを拡張、その2
- 18. Rails6向けDockerイメージの作成
- 19. Rails6向けDockerイメージの作成2(改良バージョン)
- 20. 色々な工夫(2021/05/18バージョン)
- 21. PythonでAndroidアプリ作る用のDocker Imageの作成(2021/05/18バージョン)
- 22. 今後
- 23. この文書のチェンジログ
1 概要
- 環境構築ツール
- 基本Linuxベース
- Windowsバージョンは互換性が低い?
2 リンク
- Docker公式文書 https://docs.docker.com/
- Docker日本語マニュアル http://docs.docker.jp/index.html
- https://docs.djangoproject.com/ja/2.2/intro/
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
- http://localhost:8000/ を開くとnginxのデフォルトページが表示。
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)
- 本家の文書をベースに作成しました http://docs.docker.jp/compose/django.html
- 前はUbuntuをベースに作成したが、Docker本家の文書にしたがって、公式イメージを組み合わせて作ってみた
- 関係するリンク1 docker hub python イメージ https://hub.docker.com/_/python
- 関係するリンク2 docker hub postgres イメージ https://hub.docker.com/_/postgres
- 関係するリンク3 docker hub mysql イメージ https://hub.docker.com/_/mysql
- 関係するリンク4 docker-comose 関係文書 http://docs.docker.jp/compose/reference/index.html
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関係のファイルを準備
- 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
- 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
- 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)
- 本家の文書をベースに作成しました http://docs.docker.jp/compose/django.html
- 前はUbuntuをベースに作成したが、Docker本家の文書にしたがって、公式イメージを組み合わせて作ってみた
- 関係するリンク1 docker hub python イメージ https://hub.docker.com/_/python
- 関係するリンク2 docker hub postgres イメージ https://hub.docker.com/_/postgres
- 関係するリンク3 docker hub mysql イメージ https://hub.docker.com/_/mysql
- 関係するリンク4 docker-comose 関係文書 http://docs.docker.jp/compose/reference/index.html
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関係のファイルを準備
- 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
- 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
- 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)
- 本家の文書をベースに作成しました http://docs.docker.jp/compose/django.html
- 前はUbuntuをベースに作成したが、Docker本家の文書にしたがって、公式イメージを組み合わせて作ってみた
- 関係するリンク1 docker hub python イメージ https://hub.docker.com/_/python
- 関係するリンク2 docker hub postgres イメージ https://hub.docker.com/_/postgres
- 関係するリンク3 docker hub mysql イメージ https://hub.docker.com/_/mysql
- 関係するリンク4 docker-comose 関係文書 http://docs.docker.jp/compose/reference/index.html
11.1 以下の操作を行っている動画
11.2 準備作業
11.2.1 Docker関係のファイルを準備
- 作業用ディレクトリ作成し、その中にはいる
- 好きなツールを使ってOK
mkdir myDjango3.0_Sqlite3
cd myDjango3.0_Sqlite3/
11.2.2 Docker関係のファイルを準備
- 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
- 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 (コンテナ←→ホスト間でのファイルのコピー
- 関係する本家の文書 https://docs.docker.com/engine/reference/commandline/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 をホスト側にコピー
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を利用するものを実行してみる
- 囲碁AI作成キット「Pyaq」 https://github.com/intenseG/Pyaq
- Pyaq に関する記事 https://qiita.com/intenseG/items/73cd082443aed2eb7b5d
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
13.8 この章では
- djangoをdockercomposeで動かす用のDockerに一般ユーザーを追加するコードを追加し修正したDockerfileを作成
- tensorflowを利用して動く囲碁ソフトをそのイメージ内で動かしてみた
14 tensorflowをavx無しモードでコンパイル(v1.15.0-rc3)
14.1 関係リンク等、色々
- 前の章のDockerfileを用います。
- Lenovo-G580 という古い機種でCPUが Intel(R) Celeron(R) CPU B830 @ 1.80GHz でコンパイルにほぼ24時間必用でした。
- 正直素直にavx命令が使えるCPUに交換すべき(発注しました)
- Ubuntu19.10ベースだと色々エラーが出て、色々設定を変更したり、コンパイルするtensorflowのバージョン変更してみたけど、ダメで、Ubuntu 18.04ベースのイメージにしたら上手くコンパイルできました。
- 公式のコンパイル手順順序 https://www.tensorflow.org/install/source?hl=ja この手順のままだと上手くいかなかったので以下で示す手順がお勧め
- 上の文書からリンクがはられているBazelのインストール手順 https://docs.bazel.build/versions/master/install.html これも最新バージョンが入ってしまい、v1.15.0-rc3のtensorflowは v0.26.1のbazelが必用なため別の手順でインストール
- 古いBazelのインストール手順 https://github.com/bazelbuild/bazel/releases
- bazelをUbuntuにインストールする手順 https://docs.bazel.build/versions/master/install-ubuntu.html ここに古いbazelのインストール手順も書いてある
- bazel 0.26.1 https://github.com/bazelbuild/bazel/releases/tag/0.26.1 tensorflow v1.15.0-rc3 向け
- bazel 0.25.2 https://github.com/bazelbuild/bazel/releases/tag/0.25.2 tensorflow v1.14xxx 向け
- gccのコンパイルオプション https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/x86-Options.html#x86-Options nativeだとコンパイルしてる環境にあわせてくれるらしい
- bazelでコンパイルするときに特定のエラーが発生した時の対処方法 https://github.com/tensorflow/serving/issues/928 以下のオプションをつけるとエラー回避できるらしい
--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で提供されているイメージを使って動かしてみる
- 関係文書 https://hub.docker.com/r/tensorflow/tensorflow/
- おそらく、CPUがavx命令サポートしてないと動かない(CPUをavx命令対応の物と交換しました。)
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イメージの作成
- Docker Hubのrubyイメージをベースに作成
- UbuntuのパッケージはRailsは5系までしかない。Docker HubのRailsのバージョンも同じく5系までしかない。
- 最新のRailsのバージョンを使うには特殊な環境を用意する必用があった。
- Docker Hub Ruby https://hub.docker.com/_/ruby
- Docker Hub Ruby https://github.com/docker-library/ruby/blob/82eecb7596c3cb466dd87d4b0350d189a330b925/2.6/buster/Dockerfile
- Docker Hub Ruby イメージのベースはDebian 10(buster)のようだ(/etc/issueで確認)
- Docker Hub nodejs https://hub.docker.com/_/node
- node.js関係 https://github.com/nodesource/distributions/blob/master/README.md#debinstall
- yarn関係 https://classic.yarnpkg.com/ja/docs/install/#debian-stable
- PostgreSQL https://www.postgresql.org/download/linux/debian/
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
- http://localhost:3000にアクセスして動作確認
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
- http://localhost:3000にアクセスして動作確認
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コマンドで行う仕様(現在は)
- DockerHubのadbを使えるイメージの起動方法を参考にすれば、今回のイメージでもadb接続出来そう https://hub.docker.com/r/sorccu/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バージョン) の章の追加
Created: 2021-05-18 火 23:47