- 投稿日:2020-05-16T23:51:47+09:00
DockerとPython(とSQL)で簡単なRPGゲームを作る Ⅰ~Docker+python3環境構築~
概要
在宅ワークに飽きてきたのでゲームでも作ってみようと思います.
暇なときにちょっとずつ作っていきます.環境構築
Python3が使用可能なDocker環境を作る.
Tkinterとか使ってGUIも作れるといいと思っている.ディレクトリ構成
Game |-Docker | |-Dockerfile | |-docker-compose.yml | |-requirements.txt(pip用) | |-program | |-(program) |-DB |-(player-data etc)Dockerfile
FROM python:3.7.0-slim WORKDIR /app COPY /requirements.txt /app/ RUN apt-get update \ && apt-get -y upgrade \ && apt-get install -y python3-tk \ && pip install --no-cache-dir -r requirements.txt \ && rm -rf /tmp/* /var/tmp/* \ && rm -rf /var/lib/apt/lists/* \ rm -rf /var/lib/apt/lists/* WORKDIR /workついでにcompose-upも作っておく(そのうちSQLにデータを保存したりしたい)
docker-compose.ymlversion: '3' services: quest-env: image: "quest-image" volumes: - ./../program/:/work tty: trueとりあえず動作確認
Hello world代わりに以下のプログラムを作成,実行
Battle.pydef Encount(monster): print("やせいの{}があらわれた!".format(monster)) if __name__ == '__main__': Encount('スライム')python3 Battle.py やせいのスライムがあらわれた!やったね!
基本となるキャラクタークラスを作る
敵味方関係なく基本となるキャラクターのクラスを作る.ここから継承とかしていけたら勉強になっていいな...
名前,攻撃力,HPを持っていて攻撃とダメージ計算ができるクラス.超単純.character.pyclass character(): def __init__(self, name, attack, HP): self.name = name self.atk = attack self.hp = HP def attack(self): return self.atk def damage(self, enemy_attack): damage = enemy_attack self.hp -= damage return damage相手の攻撃力を一旦damageに移しているのは,後々たまにダメージ倍増とかを入れる準備.
さっきのBattle.pyに入れて動かしてみる.
とりあえずプレイヤーとモンスターのインスタンスを生成して戦わせる.Battle.pyimport character def Encount(monster): print("やせいの{}があらわれた!".format(monster.name)) def Attack(attacker, defender): print("{}のこうげき!{}に{}のダメージ".format(attacker.name, defender.name, defender.damage(attacker.atk))) return defender.hp def Battle(player, monster): Encount(monster) turn = 0 while(1): turn += 1 print("--------------------") print("ターン:{} HP:{}".format(turn, player.hp)) if Attack(player, monster) <= 0: print("{}を倒した!".format(monster.name)) break if Attack(monster, player) <= 0: print("{}は倒れた!".format(player.name)) break if __name__ == '__main__': player = character.character('たこやき', 2, 10) monster = character.character('スライム', 2, 10) Battle(player, monster)一応攻撃を関数化して共通化してみた.あと先制攻撃を入れるために遭遇も分けてみた.
一応勝ち負けのパターンでテストしたけど勝ったパターン載せときます.
python3 Battle.py やせいのスライムがあらわれた! -------------------- ターン:1 HP:10 たこやきのこうげき!スライムに2のダメージ スライムのこうげき!たこやきに2のダメージ -------------------- ターン:2 HP:8 たこやきのこうげき!スライムに2のダメージ スライムのこうげき!たこやきに2のダメージ -------------------- ターン:3 HP:6 たこやきのこうげき!スライムに2のダメージ スライムのこうげき!たこやきに2のダメージ -------------------- ターン:4 HP:4 たこやきのこうげき!スライムに2のダメージ スライムのこうげき!たこやきに2のダメージ -------------------- ターン:5 HP:2 たこやきのこうげき!スライムに2のダメージ スライムを倒した!勝った!
今日はこれくらいにしておきます.
- 投稿日:2020-05-16T23:28:17+09:00
dockerで作ったRailsプロジェクトをロリポップ!マネージドクラウドにあげるのに手こずった話
前置き
dockerを使ってRailsの開発を趣味でやっていた。
ひと段落ついたので、サーバーに公開しようと思ったがエラーが出てなかなかうまくいかなかった話です。エラーの内容
consoleArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`
解決法
consoleEDITOR=vim rails credentials:edit --environment production
dockerに入って上のコマンドを実行していたが、Vimが入っていなかったので、一見できてるようでできていなかった。
編集画面が出てこないのでおかしいとは思っていたが、ファイルはしっかり生成されているし大丈夫だと思っていたのが罠だった。あとはマネクラのプロジェクト管理画面で環境変数の設定をしておく。
ここに入れる値の内容は、/config/credentials/production.key
の内容をコピーして貼り付ける。その後以下のファイルを作った。
/config/deploy.rbappend :linked_files, 'config/credentials/production.key'これは
Railsがproduction.keyを参照するためのシンボリックリンクを貼る記述を追加する。
という感じらしい。
最後にSSHでマネクラにアクセスして以下のファイルを作っておいてからPushするとOK
consolevim user_command.sh
user_command.shtest -f ~/shared/.env && ln -s ~/shared/.env ./.env || true export RAILS_ENV=production bundle install --deployment --without development,test --path vendor/bundle bin/rails db:create bin/rails db:migrate最後に
なかなか解決せずに6時間くらい悩みました。
30分休憩してから再度取り掛かったらすぐに解決しました。
煮詰まったら一回休むってほんと大事お世話になった記事
Rails 6でCapistranoでデプロイする際のCredentials関連エラーに対処する
[Ruby on Rails]ロリポップ!マネージドクラウドでRailsアプリを稼働させるまで
- 投稿日:2020-05-16T22:37:02+09:00
Dockder + Rails Scaffoldを使用して簡単なアプリケーションを構築してみた
はじめに
書籍や動画、Qiita記事を参考にDocker-compose を使用してRuby on Railsでのアプリケーションを構築する方法について
苦戦したため、色々試してようやく動作するところまで持って行けたため、最終的なファイルと実行手順を残します。作業手順
ファイル作成
Dockerfile docker-compose.yml Gemfile Gemfile.lock# イメージ名にRuby(Ver2.6.5)の実行環境のイメージを指定 FROM ruby:2.6.5 # パッケージのリストを更新しrailsの環境構築に必要なパッケージをインストール RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs # プロジェクト用のディレクトリを作成 RUN mkdir /myapp # ワーキングディレクトリに設定 WORKDIR /myapp # プロジェクトのディレクトリにコピー COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock # bundle install実行 RUN bundle install # ビルドコンテキストの内容を全てmyappにコピー COPY . /myappdocker-compose.ymlversion: '3' services: db: # postgresのイメージを取得 image: postgres environment: POSTGRES_USER: 'postgresql' POSTGRES_PASSWORD: 'postgresql-pass' restart: always volumes: - pgdatavol:/var/lib/postgresql/data web: # Dockerfileからイメージをビルドして使用 build: . # コンテナ起動時に実行 command: bundle exec rails s -p 3000 -b '0.0.0.0' # カレントディレクトリを/myappにバインドマウント volumes: - .:/myapp # 3000で公開して、コンテナの3000へ転送 ports: - "3000:3000" # Webサービスを起動する前にdbサービスを起動 depends_on: - db # データ永続化のためにpgdatabolのvolumeを作成し、postgresqlのデータ領域をマウント volumes: pgdatavol:source 'https://rubygems.org' gem 'rails', '5.2.4.2'Gemfile.lockrailsアプリケーション作成
docker-compose run web rails new . --force --database=postgresqlrailsプロジェクトに使用するデータベースの設定ファイルを修正
database.ymldefault: &default adapter: postgresql encoding: unicode # -------- 追加 -------- host: db username: postgresql password: postgresql-pass # -------- ここまで --------デタッチモード(バックグラウンド)で起動
docker-compose up -dbundle installが反映されない場合の対応
docker-compose build --no-cacheデータベース作成コマンド
docker-compose run web rails db:createScaffoldにて簡易的なアプリケーション作成
docker-compose run web bin/rails g scaffold User name:stringdocker-compose run web bin/rails db:migrate参考URL
いまさらだけどDockerに入門したので分かりやすくまとめてみた
Docker Compose + Railsでイメージ内でbundle installしているはずなのにgemが無いとエラーがでる。
- 投稿日:2020-05-16T20:41:17+09:00
[TryHackMe]Docker+KaliでOpenVPN(余談でParrot OSに関して)
概要
CTFに興味を持ってTryHackMeとHackTheBoxのアカウントを作ったあと、OpenVPNに関するチュートリアルがあり、VMを推奨していたがせっかくなのでDockerでやってみようと思った。
つまずいた点が多々あったので備忘録としても記しておきます。対象
マシンスペックに不安がある人やVMの設定が面倒だなって人向け
本題
Dockerはコンテナの作成廃棄を頻繁に行うべきという姿勢らしいのでDockerfileとdocker-compose.ymlを作成して管理を用意にします。
最低限の構成
CTF御用達Kali-linuxを使います。
今回使うイメージはbooyaabes/kali-linux-fullDockerfileFROM booyaabes/kali-linux-fulldocker-compose.ymlversion: '3' services: kali-linux: container_name: kali build: context: . dockerfile: Dockerfile volumes: - ./test:/test stdin_open: true tty: trueこの2つのファイルを同じディレクトリに配置しそこにtestディレクトリを作成しコンテナ内とファイル共有スペースを作成します。
TryHackMeのOpenVPN/Task1のページからMy Configuration Fileを取得し先ほど作成したtest内に入れておきます。躓いた点
一旦このままコンテナを立ち上げてコンテナ内に入りOpenVPNを使ってみます。
$ docker-compose up --build -d $ docker exec -it コンテナID bash $ cd test $ sudo openvpn testにいれたファイル名 #エラーメッセージ ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)No such file or directoryとのことなのでみてみると確かにdev以降が存在していませんでした。
解決策1
エラーメッセージを調べたところ以下のようなわかりやすい説明の記事を発見。
上記の指示に従って先程存在しないといわれた子たちを作ります。
$ mkdir /dev/net (まだ /dev/net が存在しない場合) $ mknod /dev/net/tun c 10 200しかしこんどはpermissionに関するエラーが発生。
ERROR: Cannot ioctl TUNSETIFF tun: Operation not permitted (errno=1)解決策2
最も簡単な方法としてdocker-compose.yml内でprivilegedをいじって特権を与えると成功するがセキュリティ面に問題が大きいらしい。
Dockerコンテナを特権モードで実行することが危険な理由
どうにか特権をいじらずにできないか模索していると海外ニキたちが以下のような質問をしていた。
Calling OpenConnect VPN client in docker container shows TUNSETIFF failed: Operation not permitted要約すると特権の方でもできるけど--cap-add SYS_NET_ADMINでもいけるとのこと。
全権限を付与しているのでなく権限を限定している感じっぽい(詳しい人教えてください)よってymlを以下のように変更。
version: '3' services: kali-linux: container_name: kali build: context: . dockerfile: Dockerfile volumes: - ./test:/test stdin_open: true tty: true cap_add:FROM booyaabes/kali-linux-full RUN apt-get update && \ apt-get clean && \ apt-get -y update && \ apt-get install -y iputils-ping && \ mkdir -p /dev/net && \ mknod /dev/net/tun c 10 200 - NET_ADMIN #SYS_NET_ADMINだとそんなんないよってエラーが出た何度もmkdirするのもめんどくさいのでDockerfileも変更。
DockerfileFROM booyaabes/kali-linux-full RUN apt-get update && \ apt-get clean && \ apt-get -y update && \ apt-get install -y iputils-ping && \ mkdir -p /dev/net && \ mknod /dev/net/tun c 10 200余談ですがDockerfileのコマンドはそれぞれ1回しか呼び出さないようにするのが基本のようです。コンテナの作成廃棄の頻度の件も下記に紹介する本に記載されていました。ネットだけである程度の知識も集まるもののこういうよく使う技術に関する本は一冊持っておくと良さそう。
(自宅ではじめるDocker入門)[https://books.rakuten.co.jp/rb/15828738/]実行結果
コンテナ内でopenvpnをsudoで実行すると無事接続されました。
余談(Parrot OS)
HachTheBoxの方ではKaliと共にParrotなるものが推奨されていました。
初めて聞いたので調べてみるとKaliのようにペネトレーションテストに特化したイタリア出身のLinuxディストリビューションらしいです。日本記事が非常に少ないというデメリットはありながらもKaliより軽量でありKali VS Parrotなんて記事や動画も多く出回っており、その中のコメントや記事内ではParrotはKaliを超えているという意見がそこそこ多かったように思えました。
個人の好みはもちろんあるでしょうし一概にどっちが優れているかという話でなく、そこまでの力がありながら日本でシェアが低いのは割と謎なので先日購入したジャンクのThinkPadにParrotを実際にいれてみたので知識が深まればそれも記事にしたいと考えています。
(本記事の内容もParrotでDockerを立ち上げて動かしてます)これに関しても詳しい人いたらツイッターとかにフォロー飛ばしていろいろ教えてください。
- 投稿日:2020-05-16T20:41:17+09:00
[TryHackMe]Docker+KaliでOpenVPN(+αでParrot OSに関して)
概要
CTFに興味を持ってTryHackMeとHackTheBoxのアカウントを作ったあと、OpenVPNに関するチュートリアルがあり、VMを推奨していたがせっかくなのでDockerでやってみようと思った。
つまずいた点が多々あったので備忘録としても記しておきます。対象
マシンスペックに不安がある人やVMの設定が面倒だなって人向け
本題
Dockerはコンテナの作成廃棄を頻繁に行うべきという姿勢らしいのでDockerfileとdocker-compose.ymlを作成して管理を用意にします。
最低限の構成
CTF御用達Kali-linuxを使います。
今回使うイメージはbooyaabes/kali-linux-fullDockerfileFROM booyaabes/kali-linux-fulldocker-compose.ymlversion: '3' services: kali-linux: container_name: kali build: context: . dockerfile: Dockerfile volumes: - ./test:/test stdin_open: true tty: trueこの2つのファイルを同じディレクトリに配置しそこにtestディレクトリを作成しコンテナ内とファイル共有スペースを作成します。
TryHackMeのOpenVPN/Task1のページからMy Configuration Fileを取得し先ほど作成したtest内に入れておきます。躓いた点
一旦このままコンテナを立ち上げてコンテナ内に入りOpenVPNを使ってみます。
$ docker-compose up --build -d $ docker exec -it コンテナID bash $ cd test $ sudo openvpn testにいれたファイル名 #エラーメッセージ ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)No such file or directoryとのことなのでみてみると確かにdev以降が存在していませんでした。
解決策1
エラーメッセージを調べたところ以下のようなわかりやすい説明の記事を発見。
上記の指示に従って先程存在しないといわれた子たちを作ります。
$ mkdir /dev/net (まだ /dev/net が存在しない場合) $ mknod /dev/net/tun c 10 200しかしこんどはpermissionに関するエラーが発生。
ERROR: Cannot ioctl TUNSETIFF tun: Operation not permitted (errno=1)解決策2
最も簡単な方法としてdocker-compose.yml内でprivilegedをいじって特権を与えると成功するがセキュリティ面に問題が大きいらしい。
Dockerコンテナを特権モードで実行することが危険な理由
どうにか特権をいじらずにできないか模索していると海外ニキたちが以下のような質問をしていた。
Calling OpenConnect VPN client in docker container shows TUNSETIFF failed: Operation not permitted要約すると特権の方でもできるけど--cap-add SYS_NET_ADMINでもいけるとのこと。
全権限を付与しているのでなく権限を限定している感じっぽい(詳しい人教えてください)よってymlを以下のように変更。
version: '3' services: kali-linux: container_name: kali build: context: . dockerfile: Dockerfile volumes: - ./test:/test stdin_open: true tty: true cap_add: - NET_ADMIN #SYS_NET_ADMINだとそんなんないよってエラーが出た何度もmkdirするのもめんどくさいのでDockerfileも変更。
DockerfileFROM booyaabes/kali-linux-full RUN mkdir -p /dev/net && \ mknod /dev/net/tun c 10 200余談ですがDockerfileのコマンドはそれぞれ1回しか呼び出さないようにするのが基本のようです。コンテナの作成廃棄の頻度の件も下記に紹介する本に記載されていました。ネットだけである程度の知識も集まるもののこういうよく使う技術に関する本は一冊持っておくと良さそう。
(自宅ではじめるDocker入門)[https://books.rakuten.co.jp/rb/15828738/]実行結果
コンテナ内でopenvpnをsudoで実行すると無事接続されました。
余談(Parrot OS)
HachTheBoxの方ではKaliと共にParrotなるものが推奨されていました。
初めて聞いたので調べてみるとKaliのようにペネトレーションテストに特化したイタリア出身のLinuxディストリビューションらしいです。日本記事が非常に少ないというデメリットはありながらもKaliより軽量でありKali VS Parrotなんて記事や動画も多く出回っており、その中のコメントや記事内ではParrotはKaliを超えているという意見がそこそこ多かったように思えました。
個人の好みはもちろんあるでしょうし一概にどっちが優れているかという話でなく、そこまでの力がありながら日本でシェアが低いのは割と謎なので先日購入したジャンクのThinkPadにParrotを実際にいれてみたので知識が深まればそれも記事にしたいと考えています。
(本記事の内容もParrotでDockerを立ち上げて動かしてます)これに関しても詳しい人いたらツイッターとかにフォロー飛ばしていろいろ教えてください。
- 投稿日:2020-05-16T18:07:10+09:00
(備忘録)TensorFlowを使ってオススメの楽曲名を類推するWebアプリ【docker-composeで実行環境作り】
はじめに
本記事は(備忘録)TensorFlowを使ってオススメの楽曲名を類推するWebアプリの続きです。
docker-composeでローカル環境にTensorFlow+Kerasの環境作り、
WEB API叩くところまで整理したいと思います。
自分用に作った記事なので、分かりにくい点や情報、技術が古いかもしれませんがご了承ください
また何かしらのWebアプリを独りで作りたい方のご参考になれば嬉しいです。Webアプリ実物は以下のGIFのようになります。
検索ボックスに文章で入力すると、ハンバード・ハンバードさんの「同じ話」と言う回答頂きました
$\tiny{※学習データが少ないため、一部の曲しかヒットしません。。しょぼいです}$
$\tiny{※楽譜リンクをクリックすると楽譜の一部が表示されていますが、記事の対象外です}$参考文献
この記事を作るにあたって参考にさせて頂きました
- docker-composeでgunicorn+nginx+flaskを動かしてみた話
- [イメージ図付]Nginx+gunicorn+FlaskをDocker化[後編]
- DockerでDjangoの開発環境を再構築!!!!
- すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方
TODO マップ
(備忘録)TensorFlowを使ってオススメの楽曲名を類推するWebアプリの続きで、
今回はWeb API側の環境構築(実行環境)です。
章 区分 状況 内容 言語、FW、環境等 序 章 共通 済 アプリの概要 Python
TensorFlow
Keras
Google Colaboratory第一章 Web API 済 (今回)環境構築(実行環境) docker-compose
Flask
Nginx
gunicorn第二章 Web API 未着手 機械学習 Python
TensorFlow
Keras
Flask第三章 画面 未着手 環境構築 Python
Django
Nginx
gunicorn
PostgreSQL
virtualenv第四章 画面 未着手 表示、Web API呼出し部分 Python
Django第五章 AWS 未着手 AWS自動デプロイ Github
EC2
CodeDeploy
CodePipeline※まだ記事は全然整理できていないので時間ある時につくります。
未着手のまま命尽きるかも
またマップは書いてるうちに変わる可能性ありますのでご了承下さい。。環境 ※以下のVerでなくても動くと思いますが、古いのでご注意下さい
Ubuntuバージョン$ cat /etc/os-release NAME="Ubuntu" VERSION="18.04.4 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.4 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionicDockerバージョン$ docker version Client: Docker Engine - Community Version: 19.03.8 API version: 1.40 Go version: go1.12.17 Git commit: afacb8b7f0 Built: Wed Mar 11 01:25:46 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.8 API version: 1.40 (minimum version 1.12) Go version: go1.12.17 Git commit: afacb8b7f0 Built: Wed Mar 11 01:24:19 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683Docker-Composeバージョン$ docker-compose version docker-compose version 1.25.5, build unknown docker-py version: 4.2.0 CPython version: 3.7.4 OpenSSL version: OpenSSL 1.1.1c 28 May 2019※なぜかbuild unknown。時間掛かりそうだったので諦めました
実行環境の作り方
端的に書くと、ちゃんとdocker-composeがインストールされていて、
以降記載のディレクトリ構成通りに必要ファイルを配置すれば、
以下のコマンドを実行するだけです。ビルド&backgroundで起動docker-compose up -d --build初回はビルドに時間かかりますが、コンテナできた後、Web API叩くと以下GIFのようになります。
Web_API実行例http://localhost:7020/recommend/api/what-music/切なくて誰かの幸せ願う歌Web API実行例
ツールは色々あるので何でも良いと思いますが、GIFのようにJSONで返ってきます。ディレクトリ構成
適当に作っています$\tiny{※凝視したらダメです}$
ゴミファイルが多いですが、Githubに置いてあります。
ソースディレクトリ構成dk_tensor_fw ├── app_tensor │ ├── Dockerfile │ ├── exeWhatMusic.py │ ├── inputFile │ │ └── ans_studyInput_fork.txt │ ├── mkdbAndStudy.py │ ├── requirements.txt │ ├── studyModel │ │ ├── genre-model.hdf5 │ │ ├── genre-tdidf.dic │ │ ├── genre.pickle │ ├── tfidfWithIni.py │ └── webQueApiRunServer.py ├── docker-compose.yml ├── web_nginx ├── Dockerfile └── nginx.confdocker-composeでローカル環境作るのに必要なファイル
docker-compose.ymlversion: '3' services: ########### Appサーバ設定 ########### app_tensor: container_name: app_tensor # サービス再起動ポリシー restart: always # ビルドするdockerファイルが格納されたディレクトリ build: ./app_tensor volumes: # マウントするディレクトリ - ./app_tensor:/dk_tensor_fw/app_tensor ports: # ホスト側のポート:コンテナ側のポート - 7010:7010 networks: - nginx_network ########### Appサーバ設定 ########### ########### Webサーバ設定 ########### web-nginx: container_name: web-nginx build: ./web_nginx volumes: # マウントするディレクトリ - ./web_nginx:/dk_tensor_fw/web_nginx ports: # ホストPCの7020番をコンテナの7020番にポートフォワーディング - 7020:7020 depends_on: # 依存関係を指定。web-serverの起動より前にapp-serverを起動するようになる - app_tensor networks: - nginx_network ########### Webサーバ設定 ########### networks: nginx_network: driver: bridge※ (参考)上記でポート番号を指定していますが、以下のコマンドで確認してます。
(参考)空いているポートの調べ方# 空いているポート調べる(何も表示されなければ空いてる) netstat -an | grep 7010Dockerfile←Apサーバ側(Gunicorn)FROM ubuntu:18.04 WORKDIR /dk_tensor_fw/app_tensor COPY requirements.txt /dk_tensor_fw/app_tensor RUN apt-get -y update \ && apt-get -y upgrade \ && apt-get install -y --no-install-recommends locales curl python3-distutils vim ca-certificates \ && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \ && python3 get-pip.py \ && pip install -U pip \ && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && pip install -r requirements.txt --no-cache-dir ENV LANG en_US.utf8 CMD ["gunicorn", "webQueApiRunServer:app", "-b", "0.0.0.0:7010"]requirements.txtFlask==1.1.0 gunicorn==19.9.0 Keras>=2.2.5 numpy==1.16.4 pandas==0.24.2 pillow>=6.2.0 python-dateutil==2.8.0 pytz==2019.1 PyYAML==5.1.1 requests==2.22.0 scikit-learn==0.21.2 sklearn==0.0 matplotlib==3.1.1 tensorboard>=1.14.0 tensorflow>=1.14.0 mecab-python3==0.996.2Dockerfile←Webサーバ側(Nginx)FROM nginx:latest RUN rm /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx/conf.dnginx.confupstream app_tensor_config { # コンテナのサービス名を指定すると名前解決してくれる server app_tensor:7010; } server { listen 7020; root /dk_tensor_fw/app_tensor/; server_name localhost; location / { try_files $uri @flask; } location @flask { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; proxy_pass http://app_tensor_config; } # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # 静的ファイルの要求をstaticにルーティング ←使ってませんので不要です。 location /static/ { alias /dk_tensor_fw/app_tensor/satic/; } }出来上がった環境の確認
ビルド&backgroundで起動
$ docker-compose up -d --builddocker-compose イメージ情報を表示
$ docker-compose images Container Repository Tag Image Id Size ----------------------------------------------------------------------- app_tensor dk_tensor_fw_app_tensor latest 3b916ea797e0 2.104 GB web-nginx dk_tensor_fw_web-nginx latest 175c2596bb8b 126.8 MB作り方が悪いのか結構容量大きいような
コンテナの一覧表示
$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------ app_tensor gunicorn webQueApiRunServe ... Up 0.0.0.0:7010->7010/tcp web-nginx nginx -g daemon off; Up 0.0.0.0:7020->7020/tcp, 80/tcpコンテナに接続(Apサーバ側)
$ docker-compose exec app_tensor /bin/bash root@ba0ce565430c:/dk_tensor_fw/app_tensor#Apサーバ側のコンテナに入れました。。。
TensorFlowとかKeras入っているか中身を確認
出力結果の表示が長いのでいくつか省きました
root@ba0ce565430c:/dk_tensor_fw/app_tensor# pip3 list Package Version ---------------------- ----------- absl-py 0.9.0 Flask 1.1.0 gunicorn 19.9.0 Keras 2.3.1 Keras-Applications 1.0.8 Keras-Preprocessing 1.1.2 matplotlib 3.1.1 mecab-python3 0.996.2 numpy 1.16.4 pandas 0.24.2 Pillow 7.1.2 pip 20.1 python-dateutil 2.8.0 pytz 2019.1 PyYAML 5.1.1 requests 2.22.0 requests-oauthlib 1.3.0 rsa 4.0 scikit-learn 0.21.2 six 1.14.0 sklearn 0.0 tensorboard 2.2.1 tensorboard-plugin-wit 1.6.0.post3 tensorflow 2.2.0 tensorflow-estimator 2.2.0 (省略)TensorFlow、Kerasなど一通り入っているようです。。。
Webサーバ側のコンテナに接続
$ docker-compose exec web-nginx /bin/bash root@d6971e4dc05c:/#Webサーバ側のコンテナにも入れました。
一応、Webサーバ(Nginx)が起動しているか確認します。
root@d6971e4dc05c:/# /etc/init.d/nginx status [ ok ] nginx is running.Nginxも起動しているようです。
一旦ここまでで実行環境の確認しました。
上記Web APIの実行例のようにWEB APIが叩ければWEB API側の実行環境できてると思います。。。今後について
今回はWEB API側の実行環境まで少し整理できました。
また、時間のある時に少しづつブラッシュアップ、整理できればと思います
未定ですが、次回は機械学習部分を整理できればと思います。
章 区分 状況 内容 言語、FW、環境等 序 章 共通 済 アプリの概要 Python
TensorFlow
Keras
Google Colaboratory第一章 Web API 済 環境構築(実行環境) docker-compose
Flask
Nginx
gunicorn第二章 Web API 未着手 (次回)機械学習 Python
TensorFlow
Keras
Flask第三章 画面 未着手 環境構築 Python
Django
Nginx
gunicorn
PostgreSQL
virtualenv第四章 画面 未着手 表示、Web API呼出し部分 Python
Django第五章 AWS 未着手 AWS自動デプロイ Github
EC2
CodeDeploy
CodePipeline
- 投稿日:2020-05-16T17:43:30+09:00
npm installでエラーが出た時にとりあえずやってみること
はじめに
npm installでしょっちゅうエラーにぶち当たるので備忘的に残しておきます。
npmってなんぞ?って方はこちらの記事とか参考になるかと思います。とりあえず確認しとく項目
1. nodeとnpmのバージョンを見直す
2. node_modules フォルダとpackage-lock.json(場合によっては node-gyp も)を削除
3. npm install 実行するディレクトリを変える各詳細は後述します。今回はdockerとlaravelを使用して環境構築しています。
発生したエラー
docker-compose up -d
でコンテナ作成したあと、
npm install
コマンド実行しようとしたら出たエラー。$ docker run -it --rm -v $(pwd):/app -w /app node npm install ... gyp ERR! build error gyp ERR! stack Error: `make` failed with exit code: 2 gyp ERR! stack at ChildProcess.onExit (/app/node_modules/node-gyp/lib/build.js:262:23) gyp ERR! stack at ChildProcess.emit (events.js:315:20) gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:276:12) gyp ERR! System Linux 4.19.76-linuxkit gyp ERR! command "/usr/local/bin/node" "/app/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library=" gyp ERR! cwd /app/node_modules/laravel-elixir/node_modules/node-sass gyp ERR! node -v v14.2.0 gyp ERR! node-gyp -v v3.8.0 gyp ERR! not ok Build failed with error code: 1 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/chokidar/node_modules/fsevents): npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"}) npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! node-sass@3.13.1 postinstall: `node scripts/build.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the node-sass@3.13.1 postinstall script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2020-05-11T03_23_06_075Z-debug.log1. node と npm のバージョンを見直す
いろいろ調べたり試した結果、
nodeとnpmのバージョン変更でほとんど解消できそうな感じでした。
node v12系、14系は同様のエラーが出るみたいな記事があったので
今回は10系にスイッチしました。node管理ツールはnodebrewを使用しています。
(nodebrew をインストールされてない場合はこちら。)nodeのバージョン変更
#インストールできるnode.jsのバージョンを確認 $ nodebrew ls-remote #バージョンを指定してインストール $ nodebrew install-binary v10.16.0 #使用バージョンの切替 $ nodebrew use v7.7.4 #使用nodeバージョン確認 $ node -v v10.16.0npmのバージョン変更
npmのバージョンはnodeのバージョンに対応して自動的に切り替わってる?みたいなので
手動で変更するときは使用バージョンをインストールしてpackage.jsonを直接編集しました。#バージョンを指定してインストール $ npm install -g npm@6.14.2 #npmバージョンの確認 $ npm -v 6.14.2↑バージョン確認して変わってない場合はpackage.jsonを直接編集。
package.json例{ "name": "exam", "version": "0.9.4", "description": "WordPress Theme framework", "main": "index.js", "scripts": { "postinstall": "gulp copy-assets" }, "engines": { "npm": "6.9.0" # ←このバージョンを直接指定する }, ...もっかい
npm -v
してバージョン変更されてればOK2. node_modules と package-lock.json を削除
なんかゴミが残ってて邪魔してたりするので、一回きれいにするため
node_modules と package-lock.json を 削除する。
↑2つ削除してもだめそうだったら~/.node-gyp/
も削除してみる。$ rm -rf node_modules $ rm package-lock.json $ rm -rf ~/.node-gyp/3. npm install 実行するディレクトリを変える
windowsの記事だったのでmac使用している人は関係ないかも…?
筆者もmacユーザーですがいろいろ試してる中で
もしかしたらこれが功を奏していたかもしれないので一応記載。Dockerのコンテナ内でnpm installをコマンド実行した場合、
コンテナにマウントされているディレクトリでnpm installを行うとこのようなエラーになるらしい
とのことだったので、下記の対応をする#マウントされてない任意フォルダに移動 $ cd /tmp #元々 npm install しようとしてたディレクトリのpackage.json を移動させる $ cp /usr/local/hoge/package.json #移動先のフォルダでnpm install(windowsの場合は--no-bin-linksオプションが必要らしい) $ npm install --no-bin-links : #node_modulesディレクトリを元々npm installを実行する予定だったディレクトリに丸ごと移動 $ mv ./node_modules /usr/local/hoge/さいごに
これら一通りやったらなにかしら好転したらいいなと思っている今日この頃。
nodeとnpmの適切バージョンを切り分ける簡単な方法あれば誰か教えてください。。。
エラー解消できないのほんとうざい(´・ω・`)参考サイト
- 投稿日:2020-05-16T17:42:36+09:00
DockerでRuby on Railsの環境開発を構築
はじめに
MacOSのユーザー向けの解説になります。
Dockerのバージョンは19.03.8です。Dockerのインストール
下記の公式サイトにアクセスします。
https://hub.docker.com/editions/community/docker-ce-desktop-macGet Dockerをクリックしてダウンロードをします。
ダウンロードが完了したらダブルクリックをしてPC上にインストールができたことを確認します。
一番左側にくじらのマークが現れたら次のことを試します。
インストールができたかどうかを確認する
下記のコマンドを実行してDockerのバージョンが表示されたらdockerがインストールされていることを試します。
$ docker version Client: Docker Engine - Community Version: 19.03.8 API version: 1.40 Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:21:11 2020 OS/Arch: darwin/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.8 API version: 1.40 (minimum version 1.12) Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:29:16 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: v1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683Dockerを用いたRuby on Railsの環境構築
Dockerのインストールが完了したのでこれからDockerを用いたRuby on Railsの環境構築を行います。
各ファイルの準備
DockerでRuby on Railsの環境を構築するプロジェクトのディレクトリを作成し移動します。今回は
docker_sample
とします。$ mkdir docker_sample $ cd docker_sampleそして移動したら
Dockerfile
を作成します。$ touch Dockerfile $ ls Dockerfile次にDockerfile内に記述するためにviコマンドで開き編集します。
$ vi Dockerfile下記の内容をDockerfile内に記述します。
FROM ruby:2.5 RUN apt-get update -qq && apt-get install -y nodejs postgresql-client RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"]次は
Gemfile
の編集になります。同じくviコマンドで開き編集をします。$ vi Gemfile下記の内容を
Gemfile
内に記述します。source 'https://rubygems.org' gem 'rails', '~>5'次に
Gemfile.lock
を作成します。このときにGemfile.lock
は空にします。この時点で下記の3つのファイルがあれば正常です。$ touch Gemfile.lock $ ls Dockerfile Gemfile Gemfile.lock次は
entrypoint.sh
の作成をします。$ vi entrypoint.sh下記の内容を
entrypoint.sh
内に記述します。entrypoint.sh#!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"次は
docker-compose.yml
の作成をします。vi docker-compose.yml下記の内容を
docker-compose.yml
内に記述します。docker-compose.ymlversion: '3' services: db: image: postgres volumes: - ./tmp/db:/var/lib/postgresql/data web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/myapp ports: - "3000:3000" depends_on: - dbRails newを行う
各ファイルの準備が整ったので
Rails new
をします。$ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bundleダウンロードが終わるまでしばらく待ちます。
bundle install
ダウンロードが完了しましたら
Gemfile
が更新されたのでビルドの実行をします。$ docker-compose buildRuby on RailsのDB設定
初期設定ではSQLiteになっているため下記のようにコードを差し替えます。
config/database.ymldefault: &default adapter: postgresql encoding: unicode host: db username: postgres password: pool: 5 development: <<: *default database: myapp_development test: <<: *default database: myapp_testコンテナの起動
次にコンテナの起動を行います。
$ docker-compose up※コンテナの起動でエラーになってしまった場合
DBがエラーになった場合 db_1 | Error: Database is uninitialized and superuser password is not specified. db_1 | You must specify POSTGRES_PASSWORD to a non-empty value for the db_1 | superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run". db_1 | db_1 | You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all db_1 | connections without a password. This is *not* recommended. db_1 | db_1 | See PostgreSQL documentation about "trust": db_1 | https://www.postgresql.org/docs/current/auth-trust.html sample_app_db_1 exited with code 1このようなエラーが発生した場合には
docker-compose.yml
にパスワードを記載します。docker-compose.ymlversion: '3' services: db: image: postgres volumes: - ./tmp/db:/var/lib/postgresql/data environment: #追加 POSTGRES_PASSWORD: 'postgres' #追加 web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/myapp ports: - "3000:3000" depends_on: - dbもう一度下記のコマンドを実行します。
$ docker-compose upDBの作成
$ docker-compose run web rake db:createあとは
db:create
を行い完了になります。http://localhost:3000/ にアクセスします。
PG::ConnectionBadエラーが発生した場合
Ruby on RailsのDBのパスワードが設定されていないことが原因なので下記のようにパスワードを追加して、マイグレーションをします。config/database.ymldefault: &default adapter: postgresql encoding: unicode host: db username: postgres password: postgres #追加 pool: 5 development: <<: *default database: myapp_development test: <<: *default database: myapp_test以上がDockerでRuby on Railsの環境開発を構築する内容になります^_^
補足
多くの解説サイトや解説動画などで構築の方法が紹介されていてもDockerの起動と停止方法ついて同じページ内で作成されていなかったので補足で書き足します。
下記のリンクをぜひご覧ください^_^
- 投稿日:2020-05-16T17:42:16+09:00
DockerでUbuntu16:04イメージをベースにコンテナを作成する
目的
Dockerfile で Ubuntu16:04 イメージをベースにコンテナを作成する際の基本手順の備忘録です。
前提
Dockerをインストール済である事が前提
Dockerfileの作成とコンテナの起動
docker imageが何も起動していない状態から開始
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESDockerfileを用意
Dockerfile#利用するUbuntuのイメージ FROM ubuntu:16.04 RUN apt-get updateDockerfileを格納しているディレクトリで、docker buildしてイメージを作成
(例)"ubuntu1604-test"の名前のイメージをbuild $ docker build -t ubuntu1604-test . Sending build context to Docker daemon 6.144kB Step 1/2 : FROM ubuntu:16.04 16.04: Pulling from library/ubuntu ... Successfully built 059ae10b126a Successfully tagged ubuntu1604-test:latest $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu1604-test latest 059ae10b126a About a minute ago 151MB ubuntu 16.04 005d2078bdfa 3 weeks ago 125MB作成したイメージをベースにコンテナを起動
(例)ubuntu1604-testという名前でコンテナを起動する $ docker run -it -d --name ubuntu1604-test ubuntu1604-test:latest d9d1cb8606bc0a2ddb798bc19ab6de746eced6b19f933de335be986d8c955296 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d9d1cb8606bc ubuntu1604-test:latest "/bin/bash" 13 seconds ago Up 12 seconds ubuntu1604-test起動が成功すればOK
コンテナ内に入って色々試してみる$ docker exec -it ubuntu1604-test /bin/bash root@d9d1cb8606bc:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@d9d1cb8606bc:/# exit # コンテナから出る不要になればコンテナを削除
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d9d1cb8606bc ubuntu1604-test:latest "/bin/bash" 2 minutes ago Up 2 minutes ubuntu1604-test $ docker stop d9d1cb8606bc d9d1cb8606bc $ docker rm d9d1cb8606bc d9d1cb8606bc $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES不要になればイメージも削除
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu1604-test latest 059ae10b126a 5 minutes ago 151MB ubuntu 16.04 005d2078bdfa 3 weeks ago 125MB $ docker rmi ubuntu1604-test Untagged: ubuntu1604-test:latest Deleted: sha256:059ae10b126a33c0a1383be2de2e164ba34459bc2671e05f1d3368511a59070c Deleted: sha256:f5de470b93ff6d77d6ec1d3b43e963aee80fefee1226520cafa65b8762b81307 $ docker rmi ubuntu:16.04 Untagged: ubuntu:16.04 Untagged: ubuntu@sha256:db6697a61d5679b7ca69dbde3dad6be0d17064d5b6b0e9f7be8d456ebb337209 Deleted: sha256:005d2078bdfab5066ae941cea93f644f5fd25521849c870f4e1496f4526d1d5b Deleted: sha256:a83c92a7c7a0f4a52fc74fa38496be9a5e6b738bc5fd5d60e54768fed238c173 Deleted: sha256:c6a36d55655e576fc8166a32fd05e281d03bedc26b1118902e92e7ba421dfa72 Deleted: sha256:d1c997f15060e07ff557383387d6839e0377873837025fc843fa5d94bea2c4e5 Deleted: sha256:b592b5433bbffb04389a0e6349cdba6af8d006779bbb93beb69aa77d59133be4 (base) seigonoMacBook-puro-1320:appjs seigo$ docker images REPOSITORY TAG IMAGE ID CREATED SIZEdocker run の代わりに docker-compose.ymlを使う場合
以下のようにdocker-compose.ymlを用意する
docker-compose.ymlversion: '3.3' services: test: container_name: ubuntu1604-test image: 'ubuntu1604-test:latest' stdin_open: truedocker run の代わりにdocker-compose でコンテナ起動する
$ docker-compose up -d Creating ubuntu1604-test ... done (base) seigonoMacBook-puro-1320:appjs seigo$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2276b9cd3f0 ubuntu1604-test:latest "/bin/bash" 2 seconds ago Up 1 second ubuntu1604-testdocker build の代わりに docker-compose.ymlを使う場合
以下のようにdocker-compose.ymlを用意する
docker-compose.ymlversion: '3.3' services: test: build: context: . dockerfile: Dockerfile container_name: ubuntu1604-test image: 'ubuntu1604-test:latest' stdin_open: truedocker build/run の代わりにdocker-compose でコンテナ起動する
$ docker-compose build $ docker-compose up -d $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7af849677b8c ubuntu1604-test:latest "/bin/bash" 3 seconds ago Up 2 seconds ubuntu1604-testその他
作成したコンテナを利用して、以下を参考にROSインストールを行い、turtlesimが動かせる事を確認済(2020/5/15)→別記事にする予定
ROS Kinetic の Ubuntu へのインストール
ROSトピックの理解
Docker for MacでROSの亀さんと戯れた参考
Dockerfile リファレンス
超基礎からの 速習 Docker (1)
Docker for MacでROSの亀さんと戯れた
Docker run/createコマンド
DockerでUbuntu 16.04 LTSのイメージを利用してみよう
Dockerによる開発環境構築(Rails & Postgres)において exited with code 0 でコンテナが終了してしまった時の対処法
ROS Kinetic の Ubuntu へのインストール
ROSトピックの理解
ROS Kinetic の Ubuntu へのインストール
ROSトピックの理解
Docker for MacでROSの亀さんと戯れた
- 投稿日:2020-05-16T17:03:18+09:00
Dockerで日本語入力可能なubuntu 20.04イメージを作りました (xrdp)
使い方
# USER と PASSWD を適宜変更してください。 # SYS_ADMIN : chrome 使用時に必要 # DAC_READ_SEARCH : smbmount 使用時に必要 docker run -it -d \ --cap-add SYS_ADMIN \ --cap-add DAC_READ_SEARCH \ --security-opt apparmor:unconfined \ --name mozc \ --restart=always \ -u $(id -u):$(id -g) \ -e USER=user1 \ -e PASSWD=hoge \ -v /dev/shm:/dev/shm \ -p 3389:3389 \ tukiyo3/xrdp:icewm接続rdesktop localhost -u user1 -g 1280x1024
半角/全角
キーで日本語入力onoffできます。firefoxをインストールしたい場合sudo pkgadd.sh firefox firefox-ja firefox
Firefoxなどが頻繁にクラッシュする理由
shm-size
の指定が必要。chrome の起動
以下が必要
docker-compose.ymlcap_add: - SYS_ADMIN感謝
@yama07 さんのDockerでuid/gid指定可能かつsudo使用可能なデスクトップ環境を構築する(XRDP編) を参考に ubuntu 20.04 に対応版を作りました。
- ibus-mozc
- xrdpのディレクトリパーミッション
- 起動スクリプト
などとても参考になりました。ありがとうございました。
- 投稿日:2020-05-16T17:03:18+09:00
Dockerで日本語入力可能なXubuntu 20.04イメージを作りました (xrdp)
使い方
# USER と PASSWD を適宜変更してください。 # SYS_ADMIN : chrome 使用時に必要 # DAC_READ_SEARCH : smbmount 使用時に必要 docker run -it -d \ --cap-add SYS_ADMIN \ --cap-add DAC_READ_SEARCH \ --security-opt apparmor:unconfined \ --name mozc \ --restart=always \ -u $(id -u):$(id -g) \ -e USER=user1 \ -e PASSWD=hoge \ -v /dev/shm:/dev/shm \ -p 3389:3389 \ tukiyo3/mozc-xrdp-ja:xubuntu20.04接続rdesktop localhost -u user1 -g 1280x1024
半角/全角
キーで日本語入力onoffできます。firefoxをインストールしたい場合apt update apt install -y firefox firefox-ja firefoxFirefoxなどが頻繁にクラッシュする理由
shm-size
の指定が必要。chrome の起動
以下が必要
docker-compose.ymlcap_add: - SYS_ADMIN感謝
@yama07 さんのDockerでuid/gid指定可能かつsudo使用可能なデスクトップ環境を構築する(XRDP編) を参考に ubuntu 20.04 に対応版を作りました。
- ibus-mozc
- xrdpのディレクトリパーミッション
- 起動スクリプト
などとても参考になりました。ありがとうございました。
- 投稿日:2020-05-16T16:58:13+09:00
GolangアプリをKubernetesにDeployしてIngressで公開までしてみる【minikube&docker hubを利用】
以前に、DockerでサクッとGolangの環境作ってみたという記事を書いたGoのアプリをkubernetesで動かして、webブラウザで確認するところまでやってみる。
必要なもの
minikube v1.9.0
docker 19.03.8
dockerhubのアカウント成果物
https://github.com/atsugitakuya/golang_kubernetes
Docker Hubにリポジトリを作成する
docker hubのアカウントを作成し、リポジトリを作成する。
今回は以下のものがリポジトリの情報です。(publicなので、誰でも利用可です)
・アカウント名:takuya911
・リポジトリ名:go-kubernetes-sampleDockerfileをビルドし、ImageをDocker Hubに登録する
前回の記事と同じ内容だが、念のためmain,goとDockerfileを載せておく
/DockerfileFROM golang:alpine # フォルダ作成 RUN mkdir /app/ # 作成したフォルダ内にmain.goを配置 COPY . /app/ # 作業場所を/appに設定(main.goがある場所) WORKDIR /app/ # main.goをbuild RUN go build -o main . CMD ["/app/main"]/main.gopackage main import ( "fmt" "net/http" ) func index(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "golang api access") } func main() { http.HandleFunc("/", index) http.ListenAndServe(":80", nil) }Dockerfileをビルドして、imageを作成する。
docker hubのリポジトリ名と同じ名前のimage名になるようにする。zsh$docker build -t takuya911/go-kubernetes-sample:1 . .... Successfully built 74ed57aa2c28 Successfully tagged takuya911/go-kubernetes-sample:1ビルドに成功したら、次はImageをDocker Hubにpushする。
Docker HubはDocker Imageを管理するためのモノ。zsh$docker push takuya911/go-kubernetes-sample:1 .... 1: digest: sha256:76487a1e6dc32faf94cb845ee9894c024340885e22432090304c870ce29b1d79 size: 1992今回はbuild時にtagとして1を設定しているので、Docker Hubのtagが1になっていることを確認する。
Kunernetesでアプリを動かす
Docker Hubに登録したImageを取得し、Kubernetesにdeployする。
まずはminikubeを起動する。zsh$minikube start .... Done! kubectl is now configured to use "minikube"インフラをコードで管理するのが今時(カッコいい)ので、deployしたい内容が記載されたyamlファイルを生成する。
zsh$cd manifest $kubectl create deploy go-sample --image takuya911/go-kubernetes-sample:1 -o yaml --dry-run=client > deployment.yamlすると、deployment.yamlが生成されている。
/manifest/deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: go-sample name: go-sample spec: replicas: 1 selector: matchLabels: app: go-sample strategy: {} template: metadata: creationTimestamp: null labels: app: go-sample spec: containers: - image: takuya911/go-kubernetes-sample:1 name: go-kubernetes-sample resources: {} status: {}yamlファイルをapplyする
zsh$kubectl apply -f deployment.yaml deployment.apps/go-sample createdちゃんと動いていることを確認する。
zsh$kubectl get deploy,rs,po NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/go-sample 1/1 1 1 25s NAME DESIRED CURRENT READY AGE replicaset.apps/go-sample-66b5fb64f6 1 1 1 25s NAME READY STATUS RESTARTS AGE pod/go-sample-66b5fb64f6-p6sn8 1/1 Running 0 25sIngressを使って、Goアプリを公開する
Kubernetes上で動かすことはできたけれど、やっぱりwebブラウザからgoが動いていることを確認したい。クラスタ外からクラスタ内のアプリにアクセスするための方法としては、以下の3つがある。
- Node Portを使う
- 外部ロードバランサーを使う
- Ingressを使う
Ingressがよく使われている&yamlで管理できるので、今回はIngressを使う。
ingressでサービスを公開する際にはserviceも必要になる。以下参考記事。
https://qiita.com/Esfahan/items/f7d13d7e80848e9b6963なのでserviceとingressを作成していく。
まず、minikubeのIngressのaddonを有効にする。
zsh$minikube addons enable ingress ? The 'ingress' addon is enabled次にserviceを作成していく。
/manifest/service.yamlapiVersion: v1 kind: Service metadata: creationTimestamp: null labels: app: go-sample name: go-sample spec: type: NodePort ports: - protocol: TCP port: 7000 targetPort: 80 selector: app: go-sample status: loadBalancer: {}/manifest/ingress.yamlapiVersion: extensions/v1beta1 kind: Ingress metadata: name: go-sample spec: rules: - host: http: paths: - path: backend: serviceName: go-sample servicePort: 7000service.yamlとingress.yamlをdeployする。
zsh$kubectl apply -f . deployment.apps/go-sample configured ingress.extensions/go-sample created service/go-sample createdしばらく待ってからingressの情報を表示するコマンドを実行すると、ipが振られているのでそのipを確認する。
zsh$kubectl get ing NAME CLASS HOSTS ADDRESS PORTS AGE go-sample <none> * 192.168.64.3 80 4m39s実際にingressで割り振られたipアドレスにアクセスすると、main.goのindexメソッドの実行結果が帰ってくる
ここまでで、GolangのアプリのImageをDocker Hubに登録し、そのImageを使ってアプリをkubernetesにデプロイ&外部公開までが完了です。
- 投稿日:2020-05-16T16:26:20+09:00
Docker Quickstart Terminalでpemission denied
背景
PCのOSがWindows10 Homeだった為、リンクからDockerToolboxをインストールしDocker Quickstart Terminalでmkdirしたところ下記のようなエラーがでた。
DockerQuickstartTerminal$ mkdir imagebuild mkdir cannot create directory 'imagebuild' : Permission denied解決策
DockerQuickstartTerminal$ cd [任意の作業ディレクトリ] $ mkdir imagebuild $ cd imagebuild原因
DockerQuickstartTerminalを起動した際の作業ディレクトリが権限を持っていないことが原因。
権限について詳しくはこちらC:\Program Files\Docker Toolbox上ではなく、新しくdocker作業用ディレクトリを作成しそこでmkdirをすれば解決。基本的にはDocker Toolboxディレクトリ上では作業しない。
参考
- 投稿日:2020-05-16T16:01:18+09:00
docker環境構築手順メモ
# lspci | grep VGA 02:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200e [Pilot] ServerEngines (SEP1) (rev 42) 04:00.0 VGA compatible controller: NVIDIA Corporation TU106 [GeForce RTX 2070] (rev a1) # lsmod | grep nouveau nouveau 1898794 0 mxm_wmi 13021 1 nouveau wmi 21636 2 mxm_wmi,nouveau video 24538 1 nouveau i2c_algo_bit 13413 2 mgag200,nouveau drm_kms_helper 186531 2 mgag200,nouveau ttm 96673 2 mgag200,nouveau drm 456166 5 ttm,drm_kms_helper,mgag200,nouveau # vi /etc/modprobe.d/blacklist-nouveau.conf root@st250 ~]# cat /etc/modprobe.d/blacklist-nouveau.conf blacklist nouveau options nouveau modeset=0 # dracut --force # reboot # yum install -y gcc make kernel-devel # curl -O http://jp.download.nvidia.com/XFree86/Linux-x86_64/440.82/NVIDIA-Linux-x86_64-440.82.run # chmod 755 NVIDIA-Linux-x86_64-440.82.run # ./NVIDIA-Linux-x86_64-440.82.runkernel-develよりkernelのバージョンが古かったのでkernelをアップ
# yum update -y kernel # reboot # ./NVIDIA-Linux-x86_64-440.82.run # nvidia-smi Sat May 16 15:26:25 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 440.82 Driver Version: 440.82 CUDA Version: 10.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 GeForce RTX 2070 Off | 00000000:04:00.0 Off | N/A | | 29% 48C P0 26W / 175W | 0MiB / 7982MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+ # curl -O http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run # chmod 755 cuda_10.2.89_440.33.01_linux.run # ./cuda_10.2.89_440.33.01_linux.runDriverはインストール済みなので、cudaだけインストール
# yum install -y yum-utils # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # yum install -y yum-utils device-mapper-persistent-data lvm2 # yum install -y docker-ce # yum-config-manager --add-repo https://nvidia.github.io/nvidia-docker/centos7/nvidia-docker.repo # yum install -y nvidia-docker2 # systemctl enable docker # systemctl start docker # vi /etc/docker/daemon.json # cat /etc/docker/daemon.json { "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } } } # systemctl stop docker # systemctl start docker # curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-compose
- 投稿日:2020-05-16T15:50:44+09:00
PostgresでIndexによる実行速度の違いを調査した
Indexとは
要するに索引で、対象のカラムを高速に検索するために利用される。
実装は対象のカラムとIDの組を、対象カラムの内容でソートしたものがある。
(他にもありそう)イメージとしては、よく技術本の索引で用語集みたいなのがアルファベット順で並べてあるのを思い浮かべた。
「Index」を調べようとしたら、アルファベット順に並んだものからすぐに「Index」を見つけられ、Indexが記載されたページ(ID)がすぐ分かる。一方、DBの内容を変更する操作はIndexを更新する必要があるため遅くなる。
これも本の索引を調べたらすんなり分かる。実験
準備
実験のためDockerでPostgresサーバーを立てた。
version: "3.1" services: db: image: postgres:12.2 restart: always environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=example - PGPASSWORD=example - POSTGRES_DB=testdb adminer: image: adminer restart: always ports: - 8080:8080テーブルを作成した。
CREATE TABLE "one" ( "id" serial NOT NULL, "name" character(50) NULL, "age" integer NULL );名前と年齢のデータで年齢でユーザーを検索するイメージ。
適当です。実験用のSQL
インデックスを貼る
CREATE INDEX "one_age" ON "one" ("age");データを入れる
1千万行入れます。
検索予定のageは1歳から200歳までランダムで挿入します。INSERT INTO "one" (id,name, age) SELECT i, format('テスト%s', i), (random()*200)::int FROM generate_series(1,10000000) as i ;データを検索する
SELECT * FROM one WHERE age = 30 ;実験結果
速度測定のためにpostgresのCUI上で\timingを使い、SQLを実行しました。
インデックス無し インデックス有り 挿入 24s 49s 検索 0.8s 0.3s 結構影響ありますね。
- 投稿日:2020-05-16T15:39:03+09:00
docker-composeでRails5.2+MySQL開発環境
(社内の特殊な環境を移行した際のメモです)
rubyのイメージでうまく環境を構築できなかった(=既存のrails環境のGemfileと一致するバージョンのgemが揃わなかった)ため、Ubuntuのイメージから出発してRailsの環境を構築した際の設定です。
docker-compose.ymlversion: '3' services: db: image: mysql:5.7 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: - ./tmp/mysql:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=secret web: build: . command: "rails s -p 3000 -b '0.0.0.0'" volumes: - ./:/railsapp ports: - "3000:3000" depends_on: - dbDockerfileFROM ubuntu:18.04 RUN apt-get update && apt-get upgrade && apt-get install -y \ ruby-dev libmysqlclient-dev libmagick++-dev libcurl4-openssl-dev libssl-dev nodejs \ && gem install rails -v "~> 5.2" -N && gem install bundler -v "~> 1.16" RUN mkdir /railsapp WORKDIR /railsapp COPY ./ /railsapp RUN bundle install
- 投稿日:2020-05-16T12:40:59+09:00
Docker開発で詰まったところ
今回はDockerの開発をしていて詰まったところを書きます!
やりたかったこと
$ docker-compose up -d上記コマンドを入力後、コンテナ内でフレームワークやライブラリをインストールするとローカルにマウントされるという方法です。
え?そんなもん知ってるんですけど??って方はブラウザバック推奨です。以下ではLaravelをベースに話を進行し、上記コマンドをupコマンドと称します。
詰まったところ
下記ファイルでupコマンドを実行してみるとファイルが出てこないじゃないか…コンテナ内で実行すると出るのに…どうしてだよおおおお
DockerfileFROM php:fpm WORKDIR /var/www/laravel RUN apt-get update \ && apt-get install -y git zip unzip RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ && php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ && php composer-setup.php \ && php -r "unlink('composer-setup.php');" \ && mv composer.phar /usr/local/bin/composer RUN composer create-project laravel/laravel --prefer-dist . CMD ["bash"]docker-compose.ymlversion: "3" services: laravel: container_name: laravel build: ./laravel image: practice/laravel volumes: - .:/var/www/laravel tty: true解決方法
Dockerfileではなくdocker-compose.ymlでupコマンドを実行すると出来た。めっちゃ時間食ったのに案外あっさり解決して悲しすぎるDockerfileFROM php:fpm WORKDIR /var/www/laravel RUN apt-get update \ && apt-get install -y git zip unzip RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ && php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ && php composer-setup.php \ && php -r "unlink('composer-setup.php');" \ && mv composer.phar /usr/local/bin/composer CMD ["bash"]docker-compose.ymlversion: "3" services: laravel: container_name: laravel build: ./laravel image: practice/laravel command: ["composer", "create-project", "laravel/laravel", "--prefer-dist" ,"."] volumes: - .:/var/www/laravel tty: true最後に
まじで簡単なことだったので悲しいですが、これで一つの知見が得られたということで前向きに頑張ります。。。
- 投稿日:2020-05-16T12:33:40+09:00
DockerでNginxコンテナを立ち上げる
詳細はDocker Hubのnginxを参照しながら実行ください。
■ nginx:Docker Hub
https://hub.docker.com/_/nginxDockerでnginxコンテナを立ち上げるコマンド
docker run --name <コンテナ名> -d\ -p <ホスト側のポート番号>:<コンテナ側のポート番号>\ <イメージ名>terminal例:test-nginxを立ち上げるコマンド docker run --name test-nginx -d -p 8080:80 nginx
立ち上げたnginxコンテナを止める
docker stop test-nginx
nginxコンテナを削除する
docker rm test-nginx
補足
-dを入れないとCtrl+Cをした時に切断される。
docker run --name test-nginx -p 8080:80 nginx
バインドマウントを使用したnginxコンテナの立ち上げ
docker run --name <コンテナ名> -d \ -v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション> \ -p <ホスト側のポート番号>:<コンテナ側のポート番号> \ <イメージ名>terminal#例: docker run --name first-nginx \ -v /Users/user/dockerdocs/html:/usr/share/nginx/html:ro \ -d -p 8080:80 \ nginx現在のディレクトリを確認
terminalpwd > /Users/username/dockerdocs/htmlvimでindex.htmlを編集する
terminalvim index.html
vim/index.html例: <!DOCTYPE html> <html> <body> <h1>My First Heading</h1> <p>MY First paragraph.</p> </body> </html>:wqで保存
docker run --name first-nginx \ -v /Users/user/dockerdocs/html:/usr/share/nginx/html:ro \ -d -p 8080:80 nginx \ ##localhost:8080につなぐと上記のindex.htmlの内容が表示されるDockerファイルのCOPY命令
docker run --name tmp-nginx \ --rm -d nginx #--rmコマンド:コンテナ終了と共にコンテナが削除されるdocker cpコマンド
ホストマシンのファイルをコンテナ内にコピーする場合
docker cp <ホスト上のコピーしたいファイルのパス>\ <コンテナ名 or ID>:<コピー先のパス>コンテナ内のファイルをホストマシンにコピーする場合
docker cp <コンテナ名 or ID>:<コンテナ上のコピーしたいファイルのパス>\ <コピー先のパス>terminal例: ```terminal:terminal docker cp tmp-nginx:/etc/nginx/conf.d/default.conf ./
vimでdefault.confを編集
terminalvim default.conf
listen を 80から8080に変更し、localhost:8080で表示できるようにする
vim/default.confserver { listen 80; ->8080;に変更する server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 #Dockerfileを作成しコピー命令を書く
vimでDockerfileを編集
terminalvim Dockerfile
vim/DockerfileFROM nginx:latest COPY default.conf /etc/nginx/conf.d/default.confnginx:ver1をbuildする
terminaldocker build -t nginx:ver1 .
nginx:ver1をrun
terminaldocker run --name web -p 8080:8080 --rm nginx:ver1
無事にlocalhost:8080で表示された
- 投稿日:2020-05-16T12:15:51+09:00
10分でReact × Dockerの環境構築
概要
React×Dockerの環境構築ではまったのでメモとして書きました
環境構築
作業ディレクトリを作成
$ mkdir react-dockerDockerfile作成
DockerfileFROM node:8.16.0-alpine WORKDIR /usr/src/appdocker-compose.ymlを作成
docker-compose.ymlversion: "3" services: web: build: context: . dockerfile: Dockerfile stdin_open: true volumes: - ./:/usr/src/app command: sh -c "cd react-sample && yarn start" ports: - "3000:3000"ビルド
$ docker-compose buildcreate-react-appとReactのインストール(数分かかります)
$ docker-compose run --rm web sh -c "npm install -g create-react-app && create-react-app react-sample"コンテナ起動
$ docker-compose up終了!
ちょっとはまったところ
stdin_open: true
の記述をなしで構築するとコンテナ起動後にすぐコンテナが停止してしまう。
docker run の「-it」オプションに当たるもの。これを指定しないと、コンテナを起動してもすぐ終了してしまう$ docker-compose up Creating docker-react_web_1 ... done Attaching to docker-react_web_1 web_1 | yarn run v1.15.2 web_1 | $ react-scripts start web_1 | ℹ 「wds」: Project is running at http://172.20.0.2/ web_1 | ℹ 「wds」: webpack output is served from web_1 | ℹ 「wds」: Content not from webpack is served from /usr/src/app/react-sample/public web_1 | ℹ 「wds」: 404s will fallback to / web_1 | Starting the development server... web_1 | web_1 | Done in 12.50s. docker-react_web_1 exited with code 0参考: https://github.com/facebook/create-react-app/issues/8688
docker-compose.ymlversion: "3" services: web: build: context: . dockerfile: Dockerfile stdin_open: true volumes: - ./:/usr/src/app command: sh -c "cd react-sample && yarn start" ports: - "3000:3000"参考記事
- 投稿日:2020-05-16T10:39:44+09:00
Windowsコンテナを触ってみる
はじめに
最終目標は違うところにあるのですが、もともとDockerってどんなものなのかを試してみたかったので勉強も兼ねて...
※状況がどんどん変わっていっているみたいなので、最新状況は定期的に追っかけないとだめそうだ...ただ、始めるタイミングは良かった模様TODO
▽Redmineを試す
▽GROWIを試す
▽環境構成関連の用語把握
▽Oracleを試す
▽K8sを試す環境構築
★構築時のバージョンを記載!!
◆Docker Desktop for Windows
https://hub.docker.com/editions/community/docker-ce-desktop-windows/
※最新安定版:v2.3.0.2
◆Docker Desktop for Windows Stable Release notes
https://docs.docker.com/docker-for-windows/release-notes/
※導入中:v2.3.0.2GROWI
GROWI.ps1# 複数コンテナアプリケーション起動(PostgreSQL/Redmine) git clone https://github.com/weseek/growi-docker-compose.git growi cd growi docker-compose up # 環境再構築 docker-compose down --volumes docker-compose up --force-recreate # 一括完全消去コマンド docker-compose down --rmi all --volumes # Dockerイメージ/ボリューム一覧表示 docker image ls docker volume ls参考サイト
◆docker-compose | GROWI Docs
https://docs.growi.org/ja/admin-guide/getting-started/docker-compose.html◆DockerでGrowiをセットアップする
https://qiita.com/hawk777/items/2c87327f6a2d83b4bad7Redmine
Redmine.ps1# 指定バージョンのイメージ取得 docker pull sameersbn/redmine:4.1.1-2 # 複数コンテナアプリケーション起動(PostgreSQL/Redmine) wget https://raw.githubusercontent.com/sameersbn/docker-redmine/master/docker-compose.yml -OutFile docker-compose.yml docker-compose up # ★☆★後で古いバージョン(MySQL/Redmine 3.4.x)を試す # 指定バージョンのイメージ取得(v3.4.7) docker pull sameersbn/redmine:3.4.7 # ※「3.4.7」はBranches/Tags # (github上で対象ブランチもしくはタグを確認すればよい) wget https://github.com/sameersbn/docker-redmine/raw/3.4.7/docker-compose-mysql.yml -OutFile docker-compose-mysql.yml docker-compose -f docker-compose-mysql.yml up参考サイト
◆GitHub - sameersbn/docker-redmine: Docker Image for Redmine
https://github.com/sameersbn/docker-redmineWindows Server
WindowsServer.ps1# Windows Serverコンテナ作成&起動(下記で起動確認取れた!!) docker run -it --name winsvcont01 --isolation=process --rm mcr.microsoft.com/windows/nanoserver:1909 cmd # ※こちらはまだ未確認... docker run -it --name winsvcont02 --isolation=process mcr.microsoft.com/windows/servercore powershellUbuntu
Ubuntu.ps1# Dockerのバージョン確認 # ※[Switch to Lixux/Windows Containers...]設定で切替可能 docker version # Ubuntuコンテナ作成&起動(--name指定しないと毎回別コンテナ作成) docker run -it --name ubucont01 ubuntu bash参考サイト
◆Dockerコンテナを移行してみる【成功編】
https://qiita.com/Osbrewery/items/57feacd9d1f84f8813aa◆《滅びの呪文》Docker Composeで作ったコンテナ、イメージ、ボリューム、ネットワークを一括完全消去する便利コマンド
https://qiita.com/suin/items/19d65e191b96a0079417◆Docker for WindowsでKubernetesを試してみる
https://qiita.com/h-r-k-matsumoto/items/68f694650029ddf7351d◆Docker Desktop for Windows - マイクロソフト系技術情報 Wiki
https://techinfoofmicrosofttech.osscons.jp/index.php?Docker%20Desktop%20for%20Windows◆開発者に朗報! Windows 10でWindows Serverコンテナが実行可能に
https://www.atmarkit.co.jp/ait/articles/1902/07/news024.html◆WindowsでDocker環境を試してみる
https://qiita.com/fkooo/items/d2fddef9091b906675ca◆Windowsコンテナについて調べてみた
https://qiita.com/tnk4on/items/d95c6394797b46b5fb2b◆WindowsServerコンテナとは (docker)
https://tyablog.net/2018/04/22/windows-container-of-docker/◆アーキテクチャー
https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_3.1.0/getting_started/architecture.html
※用語と関連図の大枠を把握するために
- 投稿日:2020-05-16T09:28:18+09:00
Docker×Laravel×Vue (Laravel部分)
こちら側ではタイトルにあるように
Docker×Laravel×Vue 開発における
(Laravel部分)のお話をしていきます。SPA認証
Laravel Airlock -> Sanctumに改名!!
これでは実装できなかったので諦めてLaravelのweb版で対応することにしました。
マルチ認証
この記事に死ぬほどお世話になりました!!
https://qiita.com/namizatop/items/5d56d96d4c255a0e3a87?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items#controllerRouteServiceProviderの値でlogin後の挙動が変わることは初知りでした!!
Auth::routeって??
middlewareの認証されてるかされてないか
blade.php@guest('admin') //認証されていない場合表示させるもの!! @endguestblade.php@auth('admin') //認証されてる場合表示させるもの @endauthでadminのmiddleware側の認証の有無が確認できます。
https://readouble.com/laravel/5.5/ja/blade.html
Middleware
https://tech-blog.optim.co.jp/entry/2019/08/13/173000
Class消してるのに Cannot declare class Illuminate\Support\Facades\App\User, because the name is already in use が出てくる
composer dump-autoloadで対応!!
https://qiita.com/WebSysRider/items/e41f211f8c913e008d03
バリデーション
Requestクラス説明
https://www.ritolab.com/entry/41https://www.ritolab.com/entry/40#aj_3
ルーティングで名前指定した時にどうやって値渡す??
{{ route('user.profile', ['id' => 1]) }}こんな感じで第一引数にルーティング名指定して上げて、第二引数で連想配列で値を渡してあげるみたいです!!
これでパラメータ指定してURL渡せそうです!!https://qiita.com/kazuhei/items/935257b0d72fa314d461
フォームリクエスト
Controller内にValidationロジックを書くのは保守運用上あまり良くない。
→Requestクラス内に切り出してあげる。その際に出た
This action is unauthorizedpublic function authorize() { return false; }を
public function authorize() { return true; }に変更することで対応完了!!
https://nekorokkekun.hatenablog.com/entry/2019/07/13/223834
登録画面
// 入力画面post時 public function postIndex() { // postデータ取得 $data = Request::all(); // エラーチェックなどの処理 // 確認画面へリダイレクト return redirect('/form/confirm')->withInput(); } // 確認画面 public function getConfirm() { // post内容を取得 $postdata = Session::get('_old_input'); return view('form.confirm', compact('postdata')); }http://cly7796.net/wp/php/take-over-the-value-when-you-redirect-in-laravel-of-form/
$validationCode = request()->session()->get('validation_code', '');組み合わせで前ページの値持ってける。
Routing書くの面倒なんでグルーピング
middleware ・・・ ミドルウェアでグループ化し適用する namespace ・・・ ネームスペースでグループ化 domain ・・・ サブドメインをグループ化 prefix ・・・ URLが始まる文字列でグループ化 name ・・・ ルーティング名でグループ化ブログから拝借しましたが→これで対応できそうです。
https://blog.capilano-fw.com/?p=556
エラー関係
TOO Large
自分の場合localのphp.iniの設定ファイルと同じようにdocker内のphpが読みこまれていたのでローカルの
php.iniを変更して対応しました。https://qiita.com/kangyoosam/items/609b6eb1a262dee9f547
ファイルアップロードが失敗する場合
https://qiita.com/sano1202/items/b2babd55a6b11109de9a
Laravel ファイルがアップロードできない
まじか!!!!
調子に乗ってupload_max_filesizeを1024Mにしたのが原因でした。。。
アップロードできるサイズに直接関係するのは「upload_max_filesize」と「memory_limit」です。
「memory_limit」は「upload_max_filesize」よりも大きい値を設定するようにします。upload_max_filesize > memory_limit になったらエラーになる!!
https://gray-code.com/php/setting-for-file-upload-by-phpini/
シンボリックリンク
php artisan strage:linkで作ることができるリンク
publicからファイルを取得するのに使うんやけど
アップロードされたファイルは基本Storageに入ってくるからここにアクセスするためのコマンド。storage/ap/public
から触れる。src ="{{asset('/storage/company/description/first/'.$companyDescription["img_1"])}}"みたいに自分はアクセスした。
認可
自分が投稿した記事しか編集できないようにする。
https://tech.windii.jp/backend/laravel/authorization-basic画面
Flash Message
https://qiita.com/usaginooheso/items/6a99e565f16de2f9ddf7
ページネーション
なんとか対応完了
https://qiita.com/rorensu2236/items/abf5706f56a124e50640
Eloquentの検索結果がからかどうか判定するメソッド
if($blogs->isEmpty()){ //なんらかの処理 } if($blogs->first()){ //なんらかの処理 }403 This Action is unauthorized
この画面になった時は大概 Requestクラス内の
public function authorize() { return true; }になっていない可能性を疑う。
全部自分の場合はこれでした。
- 投稿日:2020-05-16T05:59:30+09:00
Docker+LaravelでSNSログインをやってみた
目的
開発プロジェクトでSNSログインを行う場合、
- SSLが必要になる事
- ローカル専用ドメインでSSLがしたい
本番用のドメインでSSLを作成して、hosts等で本番ドメインをローカルホストにアクセスするように設定すれば良いが、それはそれで後々問題が起きそうなので、今回は
- ローカル専用ドメインを用意
- ローカル専用SSLを作成
- Docker上で使用する
この条件で、開発環境の構築からLaravelでSNSログインの実装までを説明する。
前提
下記の環境で実装した。
- ローカルはmacos
- Dockerコンテナはnginx+phpfpm
- DockerコンテナのnginxにローカルSSLを組み込む
- ローカル専用ドメインはsnslogin.dev.cdeとする
- コンテナはdocker-composeを使用する
- UIはとりあえずbootstrapで行う
ローカルホスト側の設定
ローカル専用SSLはmkcertを使用する。
よってmacosのターミナルで% brew install mkcert # mkcertをhomebrewからインストール % mkcert --install # ローカルSSL初期設定 % mkcert localhost dev.cde *.dev.cde # ローカルドメイン用のSSLを作成 % mkcert -cert-file ./snslogin_dev_cde.crt.pem \ -key-file ./snslogin_dev_cde.key.pem snslogin.dev.cde # key,certファイルの作成以上で、SSLの必要なファイルを作成した。
作成したファイルはSslディレクトリにコピーしておく。nginxコンテナ
nginxコンテナの作成は下記の通りである。
services: nginx: image: nginx container_name: "snslogin-nginx" ports: - "80:80" - "443:443" volumes: - ./svr:/svr - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - ./Ssl/snslogin_dev_cde.crt.pem:/etc/nginx/conf.d/snslogin_dev_cde.cert.pem - ./Ssl/snslogin_dev_cde.key.pem:/etc/nginx/conf.d/snslogin_dev_cde.key.pem - ./weblog:/var/log/nginx depends_on: - phpfpm phpfpm: build: ./phpfpm次にnginxコンテナ上のdefault.confにてSSLの設定を行う。
server { index index.php index.html; root /svr/app/public; listen 443 ssl; server_name snslogin.dev.cde; ssl_certificate /etc/nginx/conf.d/snslogin_dev_cde.cert.pem; ssl_certificate_key /etc/nginx/conf.d/snslogin_dev_cde.key.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; 〜以下省略〜Laravelの設定
ここで、一旦コンテナを起動して、Laravelの設定を行う。
phpfpmに接続して、コマンドラインから% laravel new app % composer require laravel/socialite % composer require laravel/ui % php artisan ui bootstrap % php artisan ui bootstrap --auth % npm install % npm run dev以上を行う。
Laravelのパッケージはlaravel/socialite、laravel/uiをインストールする。
UIはbootstrapを使用し、認証スカフォールドを生成する。テーブル設定
laravel標準のusersを使用するが、SNSログインの場合、パスワードがNULLになるため、マイグレーションを変更しておく。
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password')->nullable(); // ここ。 $table->rememberToken(); $table->timestamps(); }); } 〜以下省略〜passwordをnullableしておく。
これが済めば、.envにDB接続情報を設定してから、マイグレーションを実行する。% php artisan migrateルーティングとサービスの設定
まず、route/web.phpにルーティングの設定を行う。
Route::get('/login/{social}', 'Auth\LoginController@socialLogin') ->where('social', 'facebook|twitter'); Route::get('/login/{social}/callback', 'Auth\LoginController@handleProviderCallback') ->where('social', 'facebook|twitter');SNSログインのURLとコールバックのURLを設定した。
次にサービスの設定をconfig/service.phpに記述する。<?php return [ /* |-------------------------------------------------------------------------- | Third Party Services |-------------------------------------------------------------------------- | | This file is for storing the credentials for third party services such | as Mailgun, Postmark, AWS and more. This file provides the de facto | location for this type of information, allowing packages to have | a conventional file to locate the various service credentials. | */ 'mailgun' => [ 'domain' => env('MAILGUN_DOMAIN'), 'secret' => env('MAILGUN_SECRET'), 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), ], 〜中略〜 // 以下を追加 'facebook' => [ 'client_id' => env('FACEBOOK_API_ID'), 'client_secret' => env('FACEBOOK_API_SECRET'), 'redirect' => env('FACEBOOK_CALLBACKURL'), ], ];とりあえず、facebookの設定のみを行った。
実際の値は、.envにて設定する。コントローラとViewの編集
コントローラーは認証スカフォールドで作成されたLoginControllerを使用する。
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\AuthenticatesUsers; // ここから use Socialite; use App\User; use Auth; // ここまで追加 class LoginController extends Controller { 〜中略〜 // SNSログインのメソッド public function socialLogin($social) { return Socialite::driver($social)->redirect(); } // SNSログインコールバックのメソッド public function handleProviderCallback($social) { $userSocial = Socialite::driver($social)->stateless()->user(); $user = User::where(['email' => $userSocial->getEmail()])->first(); if ($user) { Auth::login($user); } else { $newuser = new User; $newuser->name = $userSocial->getName(); $newuser->email = $userSocial->getEmail(); $newuser->save(); Auth::login($newuser); } $uri = "/home"; if (session()->has("login_after_url")) { // ログイン後リダイレクト $uri = session("login_after_url"); session()->forget("login_after_url"); } return redirect($uri); } }ここでは、SNSログインの開始とコールバックの処理を行う。
コールバック時にログインユーザがusersになければ、作成して、
Auth::login()にて強制ログインする。
SNSログイン開始前にセッション変数login_after_urlにログイン後のリダイレクト先URLを
設定しておくと、そのURLに遷移する。Viewは同じく認証スカフォールドで作成されたresources/views/auth/login.blade.php
にSNSログインのリンクを記述する。<div class="form-group row"> <label for="name" class="col-sm-4 col-form-label text-md-right"> Login With </label> <div class="col-md-6"> <a href="{{ url('login/facebook')}}" class="btn btn-social-icon btn-facebook"> <i class="fa fa-facebook"></i>Facebookログイン </a> </div> </div>以上で、ローカル開発環境にSNSログインの組み込みは完了である。
実際に実行する前にSNS側のアプリ設定とログインコールバックのURLを設定すればOKである。考察
意外と簡単にできたのである。
laravel/socialiteで他に何ができるかは未調査であるが、少なくともSNSログインは簡単にできたのである。
むしろdocker-compse.ymlやローカルSSLの方が大変だった。
作成したプロジェクトはGitHubにアップしたので、必要であれば参照していただきたい。
- 投稿日:2020-05-16T04:22:36+09:00
Docker Compose で作った Redmine だって Full Text Search plugin と ChupaText サーバーを連携させたい
はじめに
以前の記事 で Full text search plugin が使える Docker Compose の Redmine 環境を作ったのですが、同プラグインのオプションで添付ファイルの全文検索ができることを最近になって知りました。
オプションを有効にするためには ChupaText サーバーというものが必要です。Docker 版の ChupaText サーバー がありますので、今回はこれを組み込んでみました。
組み込みに至るまでの経緯
Docker 版の ChupaText サーバーは docker-compose.yml が用意されているので簡単に構築できるかなって甘く見ていたのですが、実際にやってみるとちょっと困ったことが起きました。
docker-compose.yml の内容を読んだところ、コンテナ側の ChupaText サーバーのポートを Docker ホスト側の 20080 番ポートにバインドする構成だということがわかりました。今回は Redmine も Docker Compose で構築しているため、Redmine のアプリケーションサーバーからどうやって Docker ホスト側のローカルアドレスにアクセスすればいいのか…結局のところわかりませんでした。
そこで、Redmine 構築用の docker-compose.yml に直接 ChupaText サーバーの設定を追加してしまえば、ChupaText サーバーが Redmine と同じ内部ネットワークに入るから簡単になるんじゃないかなと考えました。(両方の Docker Compose から接続できる共用ネットワークを作ることも考えましたが、管理が煩雑になりそうだったので今回は見送りました)
組み込んだ結果
docker-compose.yml
以前 GitHub で公開していたファイルを更新しています。
docker-compose.ymlversion: "3.7" services: redmine: build: ./redmine container_name: myfav-redmine restart: always depends_on: - db + - chupa-text ports: - "3000:3000" environment: TZ: Asia/Tokyo REDMINE_DB_POSTGRES: db REDMINE_DB_DATABASE: redminedb REDMINE_DB_USERNAME: redmineuser REDMINE_DB_PASSWORD: redminepassword REDMINE_PLUGINS_MIGRATE: "true" volumes: - "/srv/redmine/files:/usr/src/redmine/files:z" - "/var/log/redmine:/usr/src/redmine/log:z" db: build: ./db container_name: myfav-redmine-db restart: always environment: TZ: Asia/Tokyo POSTGRES_DB: redminedb POSTGRES_USER: redmineuser POSTGRES_PASSWORD: redminepassword volumes: - "dbdata:/var/lib/postgresql/data" + + chupa-text-proxy: + image: groonga/chupa-text:proxy + container_name: myfav-redmine-chupa-text-proxy + restart: always + environment: + TZ: Asia/Tokyo + volumes: + - "/var/log/redmine-chupa-text/proxy:/var/log/squid:z" + chupa-text: + image: groonga/chupa-text:ubuntu-latest + container_name: myfav-redmine-chupa-text + restart: always + depends_on: + - chupa-text-proxy + environment: + TZ: Asia/Tokyo + http_proxy: http://chupa-text-proxy:3128/ + https_proxy: http://chupa-text-proxy:3128/ + RAILS_SERVE_STATIC_FILES: "true" + volumes: + - "/var/log/redmine-chupa-text/rails:/home/chupa-text/chupa-text-http-server/log:z" volumes: dbdata:
- ChupaText サーバーが起動してから Redmine が起動するように依存関係を定義しました
- ChupaText サーバーおよびプロキシは DockerHub から取得するようにしました
- Docker ホスト側にポートをバインドする必要がないので省きました
- ログは
/var/log/redmine-chupa-text
に出力するようにしました(別のパスに変えても問題ないです)Full text search plugin の設定
管理 > プラグイン から Full text search plugin の設定画面を開き、「ChupaTextサーバーのURL」に
http://chupa-text:3000/extraction.json
と設定します。ChupaText の README に書いている説明と、ホスト名:ポート番号が違っているので注意してください。検索実行
公開資料 Redmine全文検索システムの実際 をダウンロードして、チケットに添付してから検索してみました。ちゃんと、PDF 内のワードで検索されています。
まだわかっていない点
- ChupaText サーバーの構築以前に登録された添付ファイルはどうやったら検索対象になるかのがわかっていません。
full_text_search:synchronize
タスクを実行してみたりもしましたが、検索対象になってくれませんでした。- DMSF の「文書管理」に登録したファイルを検索対象にする方法がわかっていません。(そもそも機能が存在していないかもです)
残タスク
ChupaText のログローテーションを組み込んでいません。とはいえ、README によるとホスト側の logrotate.d に 設定 を追加しろということなので、それに従えば良いような気がします。
おわりに
今回の組み込みにより、添付ファイルも全文検索できるようになりました。
Redmine の良いところの 1 つに、本体だけでなくプラグインにも素晴らしい機能がたくさんあることが挙げられると思います。有志のみなさんにはいつも心から感謝しています。
しかし、Redmine は構築するのが難しいので、せっかくこのような素晴らしい機能があってもセットアップすることができずにメリットを享受する機会を失っているのではないかと危惧しております。
僕がここまで積み上げてきたアウトプットが、そういった機会損失の防止に少しでもお役に立てれば幸いです。Linux に Docker Compose をインストールさえできたら、後は README に従えば簡単に起動できますので、是非ともお試しください。
- 投稿日:2020-05-16T03:56:55+09:00
Flatを利用してLAMP環境構築
Flatを利用してLAMP環境構築
参考記事:FlatをRaspberryPIへ事前にインストールが必要です。
1.FlatのGUIへアクセスし、「admin」のアカウントでログインします。
①http://[Raspberry PIのIP:9000
→内部で同じネットワークであるpcから接続する場合は、このアドレスを使用してください。②http://localhost:9000
→Raspberry PIにvncまたは直接繋げている場合、このアドレスを利用してください。③Raspberry PIのIPアドレスを確認する場合は、下記のコマンドを利用してください。
WIFIでアクセスしているので、下記のIPアドレスを利用してアクセスします。pi@raspberrypi:~ $ ifconfig eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether dc:a6:32:97:c4:93 txqueuelen 1000 (ォ、?ォオォヘォテォネ) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.16 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::6de5:78e2:f6ed:f272 prefixlen 64 scopeid 0x20<link> ether dc:a6:32:97:c4:95 txqueuelen 1000 (ォ、?ォオォヘォテォネ) RX packets 3424 bytes 245801 (240.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3269 bytes 3961381 (3.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 02.Flatの初期ページです。
3.App Templatesメニューをクリックします。
4.LAMPを選択します。
5.LAMPの環境情報を入力します。
①Publicを選択します。
②show advanced optionsをクリックしてください。
※注意事項:LAMP環境で使っているポートを外部に公開したい場合、記載します。
③下記の情報通りに記載します。
・名前:LAMP
・WEBポート:80
・Mysqlポート:3306
※Createボタンをクリックしてください。
④生成が終わったらこの画面が表示されます。
※Lampの環境の設定が完了して、コンテナが正常に起動されているとOKです。
6.WEBページを確認します。
①Raspberry PIのIPアドレスを入力すると下記のWEBページが表示されます。
http://[raspberry piのip
②phpinfoページへアクセスします。
※PHP Version 5.6.33-0+deb8u1のバージョンで古いですね。
^^;;今後バージョンアップしてみましょう。
http://[raspberry piのip/phpinfo.php
7.Flatでコンテナのコンソルに接続
①下記の画面で名前を選択します。
②下記の画面が表示されます。「>_Console」をクリックしてください。
③「Connect」ボタンをクリックしてください。
④下記のコンソル画面が表示されます。
※基本的にRoot権限で接続されます。
8.Mysqlへ接続
下記のコマンドでMysqlへ接続します。
root@9e39b05fbb93:/# mysql -uroot Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.5.60-0+deb8u1 (Raspbian) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>9.Raspberry PIへSSHを利用してLAMPのテンプレートにアクセスしたい場合
①TeraTermを利用してRaspberryPIへログインします。
②下記のコマンドでLAMP環境の名前を確認します。
pi@raspberrypi:~ $ docker ps
③下記のコマンドでテンプレートへBashシェルでアクセスします。
pi@raspberrypi:~ $ docker exec -it LAMP /bin/bash④Mysqlへ接続
pi@raspberrypi:~ $ mysql -uroot終わりに
Flatのテンプレートを利用してDocker用のLAMP環境が簡単に構築できました。
PHPとMysqlのバージョンが古いですが、このFlatで提供しているものではなく
RaspberyPIのLAMP(Docker用)をインストールしても使えます。
今回はテンプレートを利用して簡単にLAMP環境を構築するための内容です。
Flatはいかがでしょうか?まだ日本に知られてないツールです。
是非お試してみてください。
- 投稿日:2020-05-16T03:10:02+09:00
Docker Hubへのイメージをプッシュする
前提条件
・事前にDocker Hubに登録しID,Passwordを所持している
・imageファイルを作成しているDocker Hubでの操作
Docker Hubのホームページでサインインする
→Create Repositoryをクリック
→リポジトリ名、Descriptionを記載し、Createをクリック
※privateリポジトリにしたい場合はPublicからPrivateに変更するレジストリサーバー(Docker Hub)へログインする
docker loginコマンドを入力し、登録したID,Passwordを入力する
terminaldocker login > UsernameとPasswordを入力 Login Succeededと表示されたら成功Pushするタグの作成
docker tag <イメージ名> <Docker ID>/<イメージ名>:<タグ名> # タグ名は省略可能(自動でlatestタグに変換) 例: docker tag imagename username/imagename:tagnameDocker HubにPushする
※あらかじめDocker HubのTagsページで重複するタグがないことを確認
docker push <Docker ID>/<イメージ名>:<タグ名> 例: docker push username/imagename:tagnameこれでDocker HubにイメージをPushできた!!
localにPullする際のコマンド
#localにイメージファイルが残っている場合はあらかじめ削除 docker rmi -f image ID #localにPullする docker pull username/imagename:tagname #pushできたか確認 docker images補足
Quay.ioにログインする場合
terminaldocker login quay.io #ログインの引数にQuay.ioを入力
Docker Hubにおけるタグ付けルール
<Docker ID>/<イメージ名>:<タグ名> # タグ名は省略可能(自動でlatestタグに変換)
- 投稿日:2020-05-16T00:46:31+09:00
NestJS でプロジェクト作成から API ドキュメントの表示まで
Docker で Nestjs の環境を作って、SwaggerUI で API ドキュメントを表示するところまで。
Nestjs の記事なら既にあるみたいな話はあるけれども、そこは何卒。
(プロジェクト作成だけ、とかならあっても、ドキュメントのことまで同時に書いているところはなかったような)Dockerfile 作成
FROM node:12.16.1 RUN npm i -g @nestjs/cli ENTRYPOINT ["/bin/bash", "-c"]
@nestjs/cli
だけ入れておけば良さそう。docker-compose 作成
version: "3" services: app: build: . working_dir: /app volumes: - .:/app ports: - "3000:3000"プロジェクト作成
new
下記のコマンドで作成できる。
$ docker-compose run --rm app nest new {プロジェクト名}パッケージ管理に
npm
かyarn
を選べるので、好きな方を選ぶ。
ここでは、yarn
を選んだものとして進めていく。Hello World
yarn start
で api サーバーの起動。$ docker-compose run --rm --service-ports app yarn start別シェルを開いてポートの確認。
$ docker-compose ps Name Command State Ports -------------------------------------------------------------------------------------------------- app_run_xxxxxxxxx docker-entrypoint.sh nest ... Up 0.0.0.0:3000->3000/tcpルートにアクセスすると、レスポンスが確認できる。
$ curl 0.0.0.0:3000 Hello World!
参考: https://docs.nestjs.com/cli/usages
ドキュメントの表示
モジュール追加
必要なモジュールをいれる。
$ yarn add @nestjs/swagger swagger-ui-express
main.ts
必要な記述を追加する。
import { NestFactory } from '@nestjs/core'; // 追加 import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 追加 // ----ここから---- const options = new DocumentBuilder() .setTitle('Cats example') .setDescription('The cats API description') .setVersion('1.0') .addTag('cats') .build(); const document = SwaggerModule.createDocument(app, options); SwaggerModule.setup('api', app, document); // ---- ここまで---- await app.listen(3000); } bootstrap();参考: https://docs.nestjs.com/recipes/swagger
表示してみる
docker-compose run --rm --service-ports app nest start
/api
にアクセスすると、ドキュメントが確認できる。