20200516のdockerに関する記事は26件です。

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.yml
version: '3'
services:
    quest-env:
        image: "quest-image"
        volumes:
            - ./../program/:/work
        tty: true

とりあえず動作確認

Hello world代わりに以下のプログラムを作成,実行

Battle.py
def Encount(monster):
    print("やせいの{}があらわれた!".format(monster))

if __name__ == '__main__':
    Encount('スライム')
python3 Battle.py
やせいのスライムがあらわれた!

やったね!

基本となるキャラクタークラスを作る

敵味方関係なく基本となるキャラクターのクラスを作る.ここから継承とかしていけたら勉強になっていいな...
名前,攻撃力,HPを持っていて攻撃とダメージ計算ができるクラス.超単純.

character.py
class 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.py
import 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のダメージ
スライムを倒した!

勝った!

今日はこれくらいにしておきます.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerで作ったRailsプロジェクトをロリポップ!マネージドクラウドにあげるのに手こずった話

前置き

dockerを使ってRailsの開発を趣味でやっていた。
ひと段落ついたので、サーバーに公開しようと思ったがエラーが出てなかなかうまくいかなかった話です。

エラーの内容

console
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`

解決法

console
EDITOR=vim rails credentials:edit --environment production

dockerに入って上のコマンドを実行していたが、Vimが入っていなかったので、一見できてるようでできていなかった。
編集画面が出てこないのでおかしいとは思っていたが、ファイルはしっかり生成されているし大丈夫だと思っていたのが罠だった。

あとはマネクラのプロジェクト管理画面で環境変数の設定をしておく。
スクリーンショット 2020-05-16 23.24.27.png
ここに入れる値の内容は、/config/credentials/production.keyの内容をコピーして貼り付ける。

その後以下のファイルを作った。

/config/deploy.rb
append :linked_files, 'config/credentials/production.key'

これは

Railsがproduction.keyを参照するためのシンボリックリンクを貼る記述を追加する。

という感じらしい。

最後にSSHでマネクラにアクセスして以下のファイルを作っておいてからPushするとOK

console
vim user_command.sh
user_command.sh
test -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アプリを稼働させるまで

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 . /myapp
docker-compose.yml
version: '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.lock

railsアプリケーション作成

docker-compose run web rails new . --force --database=postgresql

railsプロジェクトに使用するデータベースの設定ファイルを修正

database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  # -------- 追加 --------
  host: db
  username: postgresql
  password: postgresql-pass
  # -------- ここまで --------

デタッチモード(バックグラウンド)で起動

docker-compose up -d

bundle installが反映されない場合の対応

docker-compose build --no-cache

データベース作成コマンド

docker-compose run web rails db:create

Scaffoldにて簡易的なアプリケーション作成

docker-compose run web bin/rails g scaffold User name:string
docker-compose run web bin/rails db:migrate

http://localhost:3000/users

参考URL

いまさらだけどDockerに入門したので分かりやすくまとめてみた

Dockerイメージとコンテナの削除方法

Dockerコンテナの作成、起動〜停止まで

Docker Compose + Railsでイメージ内でbundle installしているはずなのにgemが無いとエラーがでる。

Dockerでコンテナ内にbundle installされない問題の解決法

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[TryHackMe]Docker+KaliでOpenVPN(余談でParrot OSに関して)

概要

CTFに興味を持ってTryHackMeとHackTheBoxのアカウントを作ったあと、OpenVPNに関するチュートリアルがあり、VMを推奨していたがせっかくなのでDockerでやってみようと思った。
つまずいた点が多々あったので備忘録としても記しておきます。

対象

マシンスペックに不安がある人やVMの設定が面倒だなって人向け

本題

Dockerはコンテナの作成廃棄を頻繁に行うべきという姿勢らしいのでDockerfileとdocker-compose.ymlを作成して管理を用意にします。

最低限の構成

CTF御用達Kali-linuxを使います。
今回使うイメージはbooyaabes/kali-linux-full

Dockerfile
FROM booyaabes/kali-linux-full

docker-compose.yml
version: '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内に入れておきます。

Screenshot at 2020-05-16 18-39-24.png

躓いた点

一旦このままコンテナを立ち上げてコンテナ内に入り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

エラーメッセージを調べたところ以下のようなわかりやすい説明の記事を発見。

ユニバーサル TUN/TAP デバイスドライバについて

上記の指示に従って先程存在しないといわれた子たちを作ります。

$ 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も変更。

Dockerfile
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

余談ですがDockerfileのコマンドはそれぞれ1回しか呼び出さないようにするのが基本のようです。コンテナの作成廃棄の頻度の件も下記に紹介する本に記載されていました。ネットだけである程度の知識も集まるもののこういうよく使う技術に関する本は一冊持っておくと良さそう。
(自宅ではじめるDocker入門)[https://books.rakuten.co.jp/rb/15828738/]

実行結果

コンテナ内でopenvpnをsudoで実行すると無事接続されました。

Screenshot at 2020-05-16 20-22-28.png

余談(Parrot OS)

HachTheBoxの方ではKaliと共にParrotなるものが推奨されていました。
初めて聞いたので調べてみるとKaliのようにペネトレーションテストに特化したイタリア出身のLinuxディストリビューションらしいです。

日本記事が非常に少ないというデメリットはありながらもKaliより軽量でありKali VS Parrotなんて記事や動画も多く出回っており、その中のコメントや記事内ではParrotはKaliを超えているという意見がそこそこ多かったように思えました。
個人の好みはもちろんあるでしょうし一概にどっちが優れているかという話でなく、そこまでの力がありながら日本でシェアが低いのは割と謎なので先日購入したジャンクのThinkPadにParrotを実際にいれてみたので知識が深まればそれも記事にしたいと考えています。
(本記事の内容もParrotでDockerを立ち上げて動かしてます)

これに関しても詳しい人いたらツイッターとかにフォロー飛ばしていろいろ教えてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[TryHackMe]Docker+KaliでOpenVPN(+αでParrot OSに関して)

概要

CTFに興味を持ってTryHackMeとHackTheBoxのアカウントを作ったあと、OpenVPNに関するチュートリアルがあり、VMを推奨していたがせっかくなのでDockerでやってみようと思った。
つまずいた点が多々あったので備忘録としても記しておきます。

対象

マシンスペックに不安がある人やVMの設定が面倒だなって人向け

本題

Dockerはコンテナの作成廃棄を頻繁に行うべきという姿勢らしいのでDockerfileとdocker-compose.ymlを作成して管理を用意にします。

最低限の構成

CTF御用達Kali-linuxを使います。
今回使うイメージはbooyaabes/kali-linux-full

Dockerfile
FROM booyaabes/kali-linux-full

docker-compose.yml
version: '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内に入れておきます。

Screenshot at 2020-05-16 18-39-24.png

躓いた点

一旦このままコンテナを立ち上げてコンテナ内に入り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

エラーメッセージを調べたところ以下のようなわかりやすい説明の記事を発見。

ユニバーサル TUN/TAP デバイスドライバについて

上記の指示に従って先程存在しないといわれた子たちを作ります。

$ 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も変更。

Dockerfile
FROM 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で実行すると無事接続されました。

Screenshot at 2020-05-16 20-22-28.png

余談(Parrot OS)

HachTheBoxの方ではKaliと共にParrotなるものが推奨されていました。
初めて聞いたので調べてみるとKaliのようにペネトレーションテストに特化したイタリア出身のLinuxディストリビューションらしいです。

日本記事が非常に少ないというデメリットはありながらもKaliより軽量でありKali VS Parrotなんて記事や動画も多く出回っており、その中のコメントや記事内ではParrotはKaliを超えているという意見がそこそこ多かったように思えました。
個人の好みはもちろんあるでしょうし一概にどっちが優れているかという話でなく、そこまでの力がありながら日本でシェアが低いのは割と謎なので先日購入したジャンクのThinkPadにParrotを実際にいれてみたので知識が深まればそれも記事にしたいと考えています。
(本記事の内容もParrotでDockerを立ち上げて動かしてます)

これに関しても詳しい人いたらツイッターとかにフォロー飛ばしていろいろ教えてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(備忘録)TensorFlowを使ってオススメの楽曲名を類推するWebアプリ【docker-composeで実行環境作り】

はじめに

本記事は(備忘録)TensorFlowを使ってオススメの楽曲名を類推するWebアプリの続きです。
docker-composeでローカル環境にTensorFlow+Kerasの環境作り、
WEB API叩くところまで整理したいと思います。
自分用に作った記事なので、分かりにくい点や情報、技術が古いかもしれませんがご了承ください:bow:
また何かしらのWebアプリを独りで作りたい方のご参考になれば嬉しいです。

Webアプリ実物は以下のGIFのようになります。
ezgif.com-crop.gif
検索ボックスに文章で入力すると、ハンバード・ハンバードさんの「同じ話」と言う回答頂きました:clap:
$\tiny{※学習データが少ないため、一部の曲しかヒットしません。。しょぼいです}$:bow_tone1:
$\tiny{※楽譜リンクをクリックすると楽譜の一部が表示されていますが、記事の対象外です}$:no_good_tone1:

参考文献

この記事を作るにあたって参考にさせて頂きました:bow_tone1:

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

※まだ記事は全然整理できていないので時間ある時につくります。
未着手のまま命尽きるかも:angel_tone2:
またマップは書いてるうちに変わる可能性ありますのでご了承下さい。。

環境 ※以下のVerでなくても動くと思いますが、古いのでご注意下さい:no_good_tone2:

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=bionic
Dockerバージョン
$ 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:        fec3683
Docker-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。時間掛かりそうだったので諦めました:sob:

実行環境の作り方

端的に書くと、ちゃんとdocker-composeがインストールされていて、
以降記載のディレクトリ構成通りに必要ファイルを配置すれば、
以下のコマンドを実行するだけです。

ビルド&backgroundで起動
docker-compose up -d --build

初回はビルドに時間かかりますが、コンテナできた後、Web API叩くと以下GIFのようになります。

Web_API実行例
http://localhost:7020/recommend/api/what-music/切なくて誰かの幸せ願う歌

Web API実行例

Peek 2020-05-16 14-30.gif
ツールは色々あるので何でも良いと思いますが、GIFのようにJSONで返ってきます。

ディレクトリ構成

適当に作っています$\tiny{※凝視したらダメです}$:no_good_tone1:
ゴミファイルが多いですが、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.conf

docker-composeでローカル環境作るのに必要なファイル

docker-compose.yml
version: '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 7010
Dockerfile←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.txt
Flask==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.2
Dockerfile←Webサーバ側(Nginx)
FROM nginx:latest

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
nginx.conf
    upstream 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 --build

docker-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

作り方が悪いのか結構容量大きいような:sweat:

コンテナの一覧表示

$ 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入っているか中身を確認

出力結果の表示が長いのでいくつか省きました:sweat:

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側の実行環境まで少し整理できました。
また、時間のある時に少しづつブラッシュアップ、整理できればと思います:sob:
未定ですが、次回は機械学習部分を整理できればと思います。

区分 状況 内容 言語、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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.log

1. 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.0

npmのバージョン変更

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してバージョン変更されてればOK

2. 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の適切バージョンを切り分ける簡単な方法あれば誰か教えてください。。。
エラー解消できないのほんとうざい(´・ω・`)

参考サイト

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでRuby on Railsの環境開発を構築

はじめに

MacOSのユーザー向けの解説になります。
Dockerのバージョンは19.03.8です。

Dockerのインストール

下記の公式サイトにアクセスします。
https://hub.docker.com/editions/community/docker-ce-desktop-mac

スクリーンショット 2020-05-16 16.00.07.png

Get Dockerをクリックしてダウンロードをします。
ダウンロードが完了したらダブルクリックをしてPC上にインストールができたことを確認します。
スクリーンショット 2020-05-16 16.02.19.png

一番左側にくじらのマークが現れたら次のことを試します。

インストールができたかどうかを確認する

下記のコマンドを実行して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:        fec3683

Dockerを用いた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.yml
version: '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:
      - db

Rails newを行う

各ファイルの準備が整ったのでRails newをします。

$ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bundle

ダウンロードが終わるまでしばらく待ちます。

bundle install

ダウンロードが完了しましたらGemfileが更新されたのでビルドの実行をします。

$ docker-compose build

Ruby on RailsのDB設定

初期設定ではSQLiteになっているため下記のようにコードを差し替えます。

config/database.yml
default: &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.yml
version: '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 up

DBの作成

$ docker-compose run web rake db:create

あとはdb:createを行い完了になります。http://localhost:3000/ にアクセスします。
スクリーンショット 2020-05-16 17.33.56.png

PG::ConnectionBadエラーが発生した場合

スクリーンショット 2020-05-16 13.56.50.png
Ruby on RailsのDBのパスワードが設定されていないことが原因なので下記のようにパスワードを追加して、マイグレーションをします。

config/database.yml
default: &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の起動と停止方法ついて同じページ内で作成されていなかったので補足で書き足します。
下記のリンクをぜひご覧ください^_^

シンプルなDockerの起動と停止方法

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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               NAMES

Dockerfileを用意

Dockerfile
#利用するUbuntuのイメージ
FROM ubuntu:16.04 

RUN apt-get update

Dockerfileを格納しているディレクトリで、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             SIZE

docker run の代わりに docker-compose.ymlを使う場合

以下のようにdocker-compose.ymlを用意する

docker-compose.yml
version: '3.3'
services:
    test:
        container_name: ubuntu1604-test
        image: 'ubuntu1604-test:latest'
        stdin_open: true

docker 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-test

docker build の代わりに docker-compose.ymlを使う場合

以下のようにdocker-compose.ymlを用意する

docker-compose.yml
version: '3.3'
services:
    test:
        build:
          context: .
          dockerfile: Dockerfile
        container_name: ubuntu1604-test
        image: 'ubuntu1604-test:latest'
        stdin_open: true

docker 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の亀さんと戯れた

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.yml
cap_add:
- SYS_ADMIN

感謝

@yama07 さんのDockerでuid/gid指定可能かつsudo使用可能なデスクトップ環境を構築する(XRDP編) を参考に ubuntu 20.04 に対応版を作りました。

  • ibus-mozc
  • xrdpのディレクトリパーミッション
  • 起動スクリプト

などとても参考になりました。ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
firefox

Firefoxなどが頻繁にクラッシュする理由

shm-size の指定が必要。

chrome の起動

以下が必要

docker-compose.yml
cap_add:
- SYS_ADMIN

感謝

@yama07 さんのDockerでuid/gid指定可能かつsudo使用可能なデスクトップ環境を構築する(XRDP編) を参考に ubuntu 20.04 に対応版を作りました。

  • ibus-mozc
  • xrdpのディレクトリパーミッション
  • 起動スクリプト

などとても参考になりました。ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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-sample

スクリーンショット 2020-05-16 14.30.43.png

Dockerfileをビルドし、ImageをDocker Hubに登録する

前回の記事と同じ内容だが、念のためmain,goとDockerfileを載せておく

/Dockerfile
FROM 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.go
package 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になっていることを確認する。
スクリーンショット 2020-05-16 14.36.34.png

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.yaml
apiVersion: 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          25s

Ingressを使って、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.yaml
apiVersion: 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.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: go-sample
spec:
  rules:
  - host: 
    http:
      paths:
      - path: 
        backend:
          serviceName: go-sample
          servicePort: 7000

service.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メソッドの実行結果が帰ってくる
スクリーンショット 2020-05-16 16.52.55.png

ここまでで、GolangのアプリのImageをDocker Hubに登録し、そのImageを使ってアプリをkubernetesにデプロイ&外部公開までが完了です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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ディレクトリ上では作業しない。

参考

  1. chmod? chown? よくわからんって人のための、ファイル権限系まとめ
  2. Docker Toolboxのパーミッション変更
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.run

kernel-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.run

Driverはインストール済みなので、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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

結構影響ありますね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeでRails5.2+MySQL開発環境

(社内の特殊な環境を移行した際のメモです)

rubyのイメージでうまく環境を構築できなかった(=既存のrails環境のGemfileと一致するバージョンのgemが揃わなかった)ため、Ubuntuのイメージから出発してRailsの環境を構築した際の設定です。

docker-compose.yml
version: '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:
      - db
Dockerfile
FROM 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker開発で詰まったところ

今回はDockerの開発をしていて詰まったところを書きます!

やりたかったこと

$ docker-compose up -d 

上記コマンドを入力後、コンテナ内でフレームワークやライブラリをインストールするとローカルにマウントされるという方法です。
え?そんなもん知ってるんですけど??って方はブラウザバック推奨です。

以下ではLaravelをベースに話を進行し、上記コマンドをupコマンドと称します。

詰まったところ

下記ファイルでupコマンドを実行してみるとファイルが出てこないじゃないか…コンテナ内で実行すると出るのに…どうしてだよおおおお

Dockerfile
FROM 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.yml
version: "3"
services: 
    laravel:
        container_name: laravel
        build: ./laravel
        image: practice/laravel
        volumes: 
            - .:/var/www/laravel
        tty: true

解決方法
Dockerfileではなくdocker-compose.ymlでupコマンドを実行すると出来た。めっちゃ時間食ったのに案外あっさり解決して悲しすぎる

Dockerfile
FROM 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.yml
version: "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

最後に

まじで簡単なことだったので悲しいですが、これで一つの知見が得られたということで前向きに頑張ります。。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでNginxコンテナを立ち上げる

詳細はDocker Hubのnginxを参照しながら実行ください。

■ nginx:Docker Hub
https://hub.docker.com/_/nginx

Dockerで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

現在のディレクトリを確認

terminal
pwd
> /Users/username/dockerdocs/html

vimでindex.htmlを編集する

terminal
vim 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を編集

terminal
vim default.conf

listen を 80から8080に変更し、localhost:8080で表示できるようにする

vim/default.conf
server {
    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を編集

terminal
vim Dockerfile
vim/Dockerfile
FROM nginx:latest
COPY default.conf /etc/nginx/conf.d/default.conf

nginx:ver1をbuildする

terminal
docker build -t nginx:ver1 .

nginx:ver1をrun

terminal
docker run --name web -p 8080:8080 --rm nginx:ver1

無事にlocalhost:8080で表示された

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

10分でReact × Dockerの環境構築

概要

React×Dockerの環境構築ではまったのでメモとして書きました:pencil2:

環境構築

作業ディレクトリを作成
$ mkdir react-docker
Dockerfile作成
Dockerfile
FROM node:8.16.0-alpine
WORKDIR /usr/src/app
docker-compose.ymlを作成
docker-compose.yml
version: "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 build
create-react-appとReactのインストール(数分かかります)
$ docker-compose run --rm web sh -c "npm install -g create-react-app && create-react-app react-sample"
コンテナ起動
$ docker-compose up
終了!

スクリーンショット 2020-05-16 11.55.23.png

ちょっとはまったところ

stdin_open: trueの記述をなしで構築するとコンテナ起動後にすぐコンテナが停止してしまう。
docker run の「-it」オプションに当たるもの。これを指定しないと、コンテナを起動してもすぐ終了してしまう:sob:

$ 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.yml
version: "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"

参考記事

-Reactの開発環境をDockerで構築してみた

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.2

GROWI

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/2c87327f6a2d83b4bad7

Redmine

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-redmine

Windows 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 powershell

Ubuntu

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
  ※用語と関連図の大枠を把握するために

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker×Laravel×Vue (Laravel部分)

こちら側ではタイトルにあるように

Docker×Laravel×Vue 開発における
(Laravel部分)のお話をしていきます。

SPA認証

Laravel Airlock -> Sanctumに改名!!

https://stackoverflow.com/questions/54675520/composer-update-the-requested-php-extension-ext-http-missing

これでは実装できなかったので諦めてLaravelのweb版で対応することにしました。

マルチ認証

この記事に死ぬほどお世話になりました!!
https://qiita.com/namizatop/items/5d56d96d4c255a0e3a87?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items#controller

RouteServiceProviderの値でlogin後の挙動が変わることは初知りでした!!

Auth::routeって??

middlewareの認証されてるかされてないか

blade.php
@guest('admin')
//認証されていない場合表示させるもの!!
@endguest
blade.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/41

https://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 unauthorized

    public 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

スクリーンショット 2020-05-12 21.01.16.png

この画面になった時は大概 Requestクラス内の

  public function authorize()
    {
        return true;
    }

になっていない可能性を疑う。
全部自分の場合はこれでした。

https://hiroslog.com/post/173

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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にアップしたので、必要であれば参照していただきたい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.yml
version: "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 に書いている説明と、ホスト名:ポート番号が違っているので注意してください。

clipboard-202005160243-d8us5.png

検索実行

公開資料 Redmine全文検索システムの実際 をダウンロードして、チケットに添付してから検索してみました。ちゃんと、PDF 内のワードで検索されています。

検索実行

まだわかっていない点

  • ChupaText サーバーの構築以前に登録された添付ファイルはどうやったら検索対象になるかのがわかっていません。 full_text_search:synchronize タスクを実行してみたりもしましたが、検索対象になってくれませんでした。
  • DMSF の「文書管理」に登録したファイルを検索対象にする方法がわかっていません。(そもそも機能が存在していないかもです)

残タスク

ChupaText のログローテーションを組み込んでいません。とはいえ、README によるとホスト側の logrotate.d に 設定 を追加しろということなので、それに従えば良いような気がします。

おわりに

今回の組み込みにより、添付ファイルも全文検索できるようになりました。

Redmine の良いところの 1 つに、本体だけでなくプラグインにも素晴らしい機能がたくさんあることが挙げられると思います。有志のみなさんにはいつも心から感謝しています。

しかし、Redmine は構築するのが難しいので、せっかくこのような素晴らしい機能があってもセットアップすることができずにメリットを享受する機会を失っているのではないかと危惧しております。

僕がここまで積み上げてきたアウトプットが、そういった機会損失の防止に少しでもお役に立てれば幸いです。Linux に Docker Compose をインストールさえできたら、後は README に従えば簡単に起動できますので、是非ともお試しください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 0

image.png

2.Flatの初期ページです。

image.png

3.App Templatesメニューをクリックします。

・下段のページ5をクリックします。
image.png

4.LAMPを選択します。

image.png

5.LAMPの環境情報を入力します。

①Publicを選択します。
②show advanced optionsをクリックしてください。
image.png
※注意事項:LAMP環境で使っているポートを外部に公開したい場合、記載します。
③下記の情報通りに記載します。
・名前:LAMP
・WEBポート:80
・Mysqlポート:3306
※Createボタンをクリックしてください。
image.png
④生成が終わったらこの画面が表示されます。
※Lampの環境の設定が完了して、コンテナが正常に起動されているとOKです。
image.png

6.WEBページを確認します。

①Raspberry PIのIPアドレスを入力すると下記のWEBページが表示されます。
http://[raspberry piのip
image.png
②phpinfoページへアクセスします。
※PHP Version 5.6.33-0+deb8u1のバージョンで古いですね。
^^;;今後バージョンアップしてみましょう。
http://[raspberry piのip/phpinfo.php
image.png

7.Flatでコンテナのコンソルに接続

①下記の画面で名前を選択します。
image.png
②下記の画面が表示されます。「>_Console」をクリックしてください。
image.png
③「Connect」ボタンをクリックしてください。
image.png
④下記のコンソル画面が表示されます。
※基本的にRoot権限で接続されます。
image.png

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>

image.png

9.Raspberry PIへSSHを利用してLAMPのテンプレートにアクセスしたい場合

①TeraTermを利用してRaspberryPIへログインします。
image.png
image.png
image.png

②下記のコマンドでLAMP環境の名前を確認します。

pi@raspberrypi:~ $ docker ps

image.png

③下記のコマンドでテンプレートへBashシェルでアクセスします。

pi@raspberrypi:~ $ docker exec -it LAMP /bin/bash

image.png

④Mysqlへ接続

pi@raspberrypi:~ $ mysql -uroot

image.png

終わりに

Flatのテンプレートを利用してDocker用のLAMP環境が簡単に構築できました。
PHPとMysqlのバージョンが古いですが、このFlatで提供しているものではなく
RaspberyPIのLAMP(Docker用)をインストールしても使えます。
今回はテンプレートを利用して簡単にLAMP環境を構築するための内容です。
Flatはいかがでしょうか?まだ日本に知られてないツールです。
是非お試してみてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Hubへのイメージをプッシュする

前提条件

・事前にDocker Hubに登録しID,Passwordを所持している
・imageファイルを作成している

Docker Hubでの操作

Docker Hubのホームページでサインインする
Create Repositoryをクリック
リポジトリ名、Descriptionを記載し、Createをクリック
※privateリポジトリにしたい場合はPublicからPrivateに変更する

レジストリサーバー(Docker Hub)へログインする

docker loginコマンドを入力し、登録したID,Passwordを入力する

terminal
docker login
> UsernameとPasswordを入力
Login Succeededと表示されたら成功

Pushするタグの作成

docker tag <イメージ名> <Docker ID>/<イメージ名>:<タグ名>
# タグ名は省略可能(自動でlatestタグに変換)

例:
docker tag imagename username/imagename:tagname

Docker 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にログインする場合

terminal
docker login quay.io #ログインの引数にQuay.ioを入力

Docker Hubにおけるタグ付けルール

<Docker ID>/<イメージ名>:<タグ名>
# タグ名は省略可能(自動でlatestタグに変換)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 {プロジェクト名}

パッケージ管理に npmyarn を選べるので、好きな方を選ぶ。
ここでは、 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 にアクセスすると、ドキュメントが確認できる。

Screen Shot 2020-05-16 at 0.39.55.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む