20210315のdockerに関する記事は19件です。

【Rails】Webpacker::Manifest::MissingEntryErrorの対処法【Docker】

環境

Ruby 2.6.6
Rails 6.1.1
Docker 20.10.2

はじめに

Docker環境でRailsアプリを開発中に、サーバーを起動しhttp://localhost:3000/にアクセスすると発生。
Rails6ではwebpackerが標準サポートとなり、webpakerのインストールにはパッケージマネージャーであるyarnが必要。

エラーの解決方法

1)まずyarnで必要なライブラリをインストールする

$ bin/yarn

2)次にwebpackでJavaScriptのコンパイルをする

$ bin/webpack

3)最後にJS配信用のdevサーバーを起動する。(自動でwatch&コンパイルされる)

$ bin/webpack-dev-server

これをした後に一応docker-compose up -dで再起動し、localhost:3000にアクセスすると表示されました!
2と3はどちらかだけでも良いかも??

参考

【Rails6】Webpacker::Manifest::MissingEntryErrorが出たときの対処法

【Rails】インストール時につまづきがちなエラー集】

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

Docker使ってみた。

Dockerの仕様。

Dockerfile(アプリコード・ライブラリー・ベースイメージ)

↓(作成)

イメージ

↓(作成・起動)

コンテナ

イメージを作成・作るコマンド

docker image build -t sample/webrick:latest .

-t はタグの名前をつける。今回はsample/webric
:latest はバージョン情報
. は今いるディレクトリ

イメージができたか確認コマンド

docker image ls

コンテナの作成・起動コマンド

docker container run

今回はこちらのコマンドでやった。

docker container run -p 8000:8000 --name webrick sample/webrick:latest

-p 8000:8000 はポート番号の指定。
ローカルの8000ポートをdockerの8000ポートに接続するよー。

—name webrick コンテナの名前

sample/webrick:latest イメージの名前とバージョンを追記

コンテナの起動状況の確認コマンド

docker container ls

起動中であれば以下のように出てくる。

******-mbp:docker eryumeng$ docker container ls
CONTAINER ID   IMAGE                   COMMAND                  CREATED        STATUS        PORTS                    NAMES
87760adc745a   sample/webrick:latest   "ruby /var/www/main.…"   39 hours ago   Up 39 hours   0.0.0.0:8000->8000/tcp   webrick
******-mbp:docker eryumeng$

また起動中のも停止中のも確認するならば、

docker container ls -a

コンテナの停止

docker container stop webrick ///webrickはコンテナの名前

コンテナ削除

docker container rm webrick  ///webrickはコンテナの名前

ログを確認

docker container logs webrick  ///webrickはコンテナの名前

起動中に他のコマンドを使用したい時

docker container exec webrick ruby -v ///webrickはコンテナの名前・またruby -vを使用。

使用していないコンテナの削除

docker system prune -a //今使っていないものを一気に削除

Dockerfile

CMD [ "/bin/bash" ]

コンテナ起動(あと色々)

docker container run -it -p 4567:4567 --name sinatra -v ${PWD}/src:/var/www sample/sinatra:latest

-it は上記のCMD [ "/bin/bash" ]を実行するために。

${PWD}/src:/var/www こちらをしないと新しくファイルが作られた時に、もう一度イメージから作成しないといけなくなる。またリアルタイムでファイルの変更が見られる

src/var/wwwを参照しますよーと言っている。

上記のならないように。

Dockerfile

FROM ruby:2.7

WORKDIR /var/www

COPY ./src /var/www

RUN bundle config --local set path 'vendor/bundle'
RUN bundle install

CMD ["bundle","exec", "ruby", "app.rb"]

イメージを作り。

docker image build -t sample/sinatra:latest .

コンテナ起動とローカルサーバー起動

docker container run -p 4567:4567 --name sinatra -v ${PWD}/src:/var/www sample/sinatra:latest

学んだことで次はDockerでRailsを構築していきまーす。

今回はここまで。
ありがとうございました。

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

【未経験者】PHPとLaravelそれぞれで類似ポートフォリオ作ってみた

はじめに

こんにちは、おーもとと申します。エンジニアに転職をするため学習している初学者です。
私は車が好きで、「近年の若者の車離れ」という問題にフォーカスしたアプリを制作しようと思いました。
色々あって、生のPHPとLaravelの二通りの類似ポートフォリオを制作したので、記事にしてみました。

制作背景

若者が車を持たない理由には様々な理由があると思いますが、
「欲しいと思えるほど魅力を感じる車に出会っていないからなのでは?」
と思い、
・かわいいやかっこいいというスタイル
・大きさ
・国産か外車か
・アウトドアや街乗りという用途
これらの項目に当てはまる車を、結果として表示するアプリを制作することにしました。
(これらの特徴は全て私が定めているため、投票などにより特徴を決める機能をつけたいです)

11月 PHPでアプリ開発

10月からPHPの学習を始めていたので、そのアプリはPHPで制作しました。
カーセンサーAPIを使用して、車の情報を取得します。
解説動画:https://www.youtube.com/watch?v=ZXbgUtjxKM8
スクリーンショット 2020-12-12 12.34.26.png

機能

ユーザー登録関連
⚪︎ ログイン
⚪︎ ログアウト
⚪︎ 新規登録
⚪︎ ユーザー件数を表示

車の検索機能
⚪︎ 車の見た目→「かわいい」「かっこいい」「シンプル」「おしゃれ」「レトロ」
⚪︎ 車のサイズ→「ふつう」「すごくおおきい」「おおきい」「ちいさい」
⚪︎ 車の製造国→「国産車」「外車」
⚪︎ 車の用途 →「街乗り」「アウトドア」「スポーツ」

カーセンサーAPI連携
⚪︎ DBにある車情報と合致した車情報を取得
⚪︎ cronでキャッシュファイル自動生成

苦労した点

検索結果の画像表示高速化

検索の度にAPIからデータを取得していたので、電波の悪い場所では結果の表示に1分以上かかっていました。
そのため、毎日APIからデータを取得するバッチ処理をcronで自動化し、キャッシュ化することで、ユーザーにストレスのない速度で結果を表示させることができました。

EC2へデプロイ

公式ドキュメントを参考にしデプロイしました。
その際、インフラの知識が不足していたため、デプロイに一週間以上かかりました。

APIのサービス終了!!

転職活動を始めようとした際、一週間後にカーセンサーAPIサービスが終了すると知りました。
急いで提供元へ問い合わせたところ、
「完全に提供が終了すること」「24時間以上のキャッシュデータの保有も禁止」、ということを告げられました。
その後、他の車データAPIの提供元を調べましたが他にありませんでした。
画像だけでもどうにかならないかと思い、ト◯タや◯産などの画像利用規約を確認しましたが、
営利目的ではない&提供元のURLなどの情報を記載する
としても、利用は禁止でした。
そのためLaravelの勉強も兼ねて、画像問題を解決できるアプリの制作に取り掛かりました。

1月 Laravelでアプリ開発

12月末からLaravelの学習を始め、1月からアプリの制作に取り掛かりました。

前回のPHPで制作したポートフォリオとの違い

画像の取得にAPIを用いていましたが、ユーザーから愛車の画像を提供してもらう方針に変更し、機能の追加などを行いました。

完成

アプリのURL:https://pf-kurushira.com
(スマホサイズにも対応しています)
スクリーンショット 2021-03-14 16.03.00.png

使用技術

使用言語

⚪︎ HTML
⚪︎ CSS
⚪︎ SCSS
⚪︎ PHP 7.4.14
⚪︎ Laravel 6.20.11

インフラ

⚪︎ Github Actions 自動デプロイ
⚪︎ Docker 20.10.2 / docker-compose 1.27.4
⚪︎ nginx 1.18
⚪︎ mysql 5.7.31 / PHPMyAdmin
⚪︎ AWS ( EC2, ALB, ACM, S3, RDS, Route53, VPC, EIP, IAM)

インフラ構成図

スクリーンショット 2021-02-28 20 11 32

機能一覧

機能 概要
ユーザー管理機能 新規登録・ログイン・ログアウトができます
簡単ログイン機能 ログイン画面のゲストログインをクリックすることで、ゲストユーザーとしてログインできます
おすすめ車種検索機能 条件を選択すると、それにあった車種一覧を表示します
検索履歴機能 直近の検索履歴・結果を表示します
画像提供機能 ユーザーの所有している車の画像を提供できます
提供した画像の削除機能 提供した画像を削除できます
提供画像一覧表示機能 自身が提供した画像一覧を表示します。
ユーザー情報編集機能 ご登録いただいたユーザー名・メールアドレスを変更できます
Twitterシェア機能 車の検索結果をツイートすることができます
レスポンシブ機能 スマホサイズ(320~540px)にも対応しています

DB設計

スクリーンショット 2021-02-20 19 05 58

各テーブルについて

テーブル名 説明
users 登録ユーザー情報
cars 登録車情報
histories 直近の検索結果の情報
car_images 提供画像の情報

苦労した点

ユーザー情報編集ページのバリデーション

LaravelのAuth機能のバリデーションを使いまわそうとしましたが、ブラックボックスになっていて苦労しました。
→新しくバリデーションを作成。

S3からオブジェクト削除

画像の削除機能でDBからだけでなく、S3からもオブジェクトを削除する必要があり苦労しました。
→解決方法を記事にしました
laravel6でS3に画像アップロード&削除

今後の課題

機能

機能 概要
英訳機能 Google Cloud Translation APIを利用して翻訳
通報機能 ユーザーの投票で不適切な画像を削除

技術

⚪︎ テスト
⚪︎ Dockerを用いた本番環境の構築
⚪︎ ECSへデプロイ

参考にした学習教材など

PHP/Laravel

【Udemy】PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門
【書籍】詳細!PHP 7+MySQL 入門ノート
【書籍】PHPフレームワークLaravel入門 第2版
【書籍】PHPフレームワーク Laravel実践開発
Laravel6.0(PHP7.3)+MySQL+Laradockで簡易的なECサイトを作る

AWS

【Udemy】AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得

Docker

【超入門】20分でLaravel開発環境を爆速構築するDockerハンズオン

さいごに

生のPHPでひとつPFを制作したのは、基礎力が身についたので良かったと思います。
今回ポートフォリオ完成を優先したため、ECSではなくEC2へデプロイしました。
まだ課題も多いですが、ブラッシュアップしていきたく思っています。
長くなりましたが、ここまで読んでくださりありがとうございました!!

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

Docker,PHP,MySQLで構築した環境におけるDBホスト名の調べ方

以下の記事を参考に、Docker,PHP,MySQLの開発環境を構築した。

記事の手順にしたがって開発環境は構築できたのだが、mysqliでDBに接続する際に、ホスト名が分からない事態に遭遇。
ホスト名は、DBに接続して以下のコマンドを入力する事で確認できる。

mysql> show variables like 'hostname';

今回はDocker環境なので、DBコンテナに入ってから上記コマンドを入力する必要がある。
入力するコマンドは以下の通り。

// DBコンテナに接続
docker-compose exec db bash

// DBに接続
root@2918fd6815ab:/# mysql -u root -p
→ パスワードを入力

// ホスト名を表示
mysql> show variables like 'hostname';

以上のコマンドで、ホスト名を確認できる。

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

nvidia-dockerをdocker-composeで動かす

はじめに

  • 動作環境
    • OS: Ubuntu 20.04.2 LTS (focal)
    • GPU: GeForce GTX 960
  • 前提
    • docker, docker-compose, nvidia-docker-runtime は導入済み

docker-compose.yamlの書き方例(ver3系)

docker-compose.yaml
version: '3.8'
services:
  sample:
    image: nvidia/cuda:11.2.1-base
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
           - driver: nvidia
             capabilities: [utility, compute, video]

各パラメータの詳細は公式を参考に.

動作確認

$ docker-compose version
docker-compose version 1.28.5, build unknown
:
$ docker-compose up
Starting sample_sample_1 ... done
Attaching to sample_sample_1
sample_1  | Mon Mar 15 10:05:43 2021       
sample_1  | +-----------------------------------------------------------------------------+
sample_1  | | NVIDIA-SMI 460.39       Driver Version: 460.39       CUDA Version: 11.2     |
sample_1  | |-------------------------------+----------------------+----------------------+
sample_1  | | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
sample_1  | | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
sample_1  | |                               |                      |               MIG M. |
sample_1  | |===============================+======================+======================|
sample_1  | |   0  GeForce GTX 960     Off  | 00000000:0E:00.0 Off |                  N/A |
sample_1  | | 30%   53C    P2    38W / 130W |    652MiB /  4042MiB |     46%      Default |
sample_1  | |                               |                      |                  N/A |
sample_1  | +-------------------------------+----------------------+----------------------+
sample_1  |                                                                                
sample_1  | +-----------------------------------------------------------------------------+
sample_1  | | Processes:                                                                  |
sample_1  | |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
sample_1  | |        ID   ID                                                   Usage      |
sample_1  | |=============================================================================|
sample_1  | +-----------------------------------------------------------------------------+
sample_sample_1 exited with code 0

docker-composeのバージョンに注意

docker-composeのバージョンが古い場合、以下のようなエラーが出る.

$ docker-compose version
docker-compose version 1.25.0, build unknown
:
$ docker-compose up
ERROR: The Compose file './docker-compose.yaml' is invalid because:
services.sample.deploy.resources.reservations value Additional properties are not allowed ('devices' was unexpected)

docker-composeのGitHub によると、1.28から上の書き方に対応した模様.

(作者はaptで入れたら1.25だったので、とりあえずpipで入れなおしました)

ver2系(おまけ)

ちなみに、ver2系では以下のように書く.

docker-compose.yaml
version: '2.4'
services:
  sample:
    image: nvidia/cuda:11.2.1-base
    command: nvidia-smi
    runtime: nvidia
    environment:
      NVIDIA_VISIBLE_DEVICES: all
      NVIDIA_DRIVER_CAPABILITIES: utility,compute,video

ただし、ver2系ではreplicas等がサポートされていない.
あと、コンテナのために環境変数 NVIDIA_* を入れるのも気持ち悪い(個人の感想です).
なので、どんどんver3形式で書いていきましょう.

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

Docker環境のLaravelアプリをHerokuデプロイした後、画像をS3を利用して表示できるようにする

概要

Docker、Laravel、Heroku、S3(AWS)の勉強がてら画像アップロードができる掲示板アプリを作ったのですが、S3での画像表示にてこずったので備忘録として記事にしました。
この記事はあくまで本番環境でS3を使用して画像表示をするための記事ですので、ローカル環境で画像アップロード機能が仕上がっている事が前提となります。
自分はこちらの記事を参考に画像アップロード機能を作りました↓
https://note.com/koushikagawa/n/n74380a1f3643

アプリケーションについて

簡単な掲示板アプリです。
908a56e59e9e00691f538f81f46e1298.png
新規投稿ページです↑
91cd29065fe23cad6217b129accbb1d3.png
詳細ページにて画像が表示されます↑
トップページには画像を表示しないので省略します。

AWS

AWSの登録等は省略します。S3に移動しバケットを作成します。
a3ddd4d79078faac6a5002e66ac8dfd4.png
バケット名を入力します↑
68f82c67a05f1686d6bdf1c40e774e95.png
バケットの設定をこのようにして「バケットを作成」を押します。

コード

画像アップロードに関係するコードを載せていきます。

create.blade.php
<form action="/posts" method="post" enctype="multipart/form-data">
    {{ csrf_field() }}
    <input type="file" name="image_url">
    @if ($errors->has('image_url'))
        <div>{{ $errors->first('image_url') }}</div>
    @endif
</form>

postsテーブルの画像のカラム名もimage_urlにしています。変えた方がわかりやすかったかもしれないですね。

PostController.php
public function store(request $request)
{
    $post = new Post();
    $post->body = $request->body;
    // ローカル
    // $time = date("Ymdhis");
    // $post->image_url = $request->image_url->storeAs('public/post_images', $time.'_'.Auth::user()->id. '.jpg');
    $image = $request->file('image_url');
    $path = Storage::disk('s3')->putFile('/', $image, 'public');
    $post->image_url = $path;
    $post->user_id = $id;
    $post->save();
    return redirect()->to('/');
}

public function show(Post $post)
{
    $user_id = $post->user_id;
    $user = DB::table('users')->where('id', $user_id)->first();
    return view('posts.detail', [
        'post' => $post,
        'user' => $user,
        // ローカル
        // 'image_url' => str_replace('public/', 'storage/', $post->image_url)
        'image_url' => $post->image_url
    ]);
}

public function update(request $request)
{
    $id = $request->post_id;
    $post = Post::findOrFail($id);
    $post->body = $request->body;
    if($request->hasFile('image_url'))
    {
        // ローカル
        // Storage::delete('public/post_images/' . $post->image_url);
        // $time = date("Ymdhis");
        // $post->image_url = $request->image_url->storeAs('public/post_images', $time.'_'.Auth::user()->id. '.jpg');
        $image = $request->image_url;
        Storage::disk('s3')->delete($image); //画像削除
        $path = Storage::disk('s3')->putFile('/', $image, 'public');
        $post->image_url = $path;
    }
    $post->save();
    return redirect()->to('/');
}
detail.blade.php
@if ($image_url)
    // ローカル
    // <img src="/{{ $image_url }}" width="250px" height="250px">
    <img src="https://バケット名.s3.ap-northeast-1.amazonaws.com/{{ $image_url }}" width="250px" height="250px">
@endif

ローカルのコードも一応載せています。無視してもらって結構です。

HerokuにAWSの環境変数を設定

terminal
% heroku config:set AWS_ACCESS_KEY_ID=◯◯◯◯◯◯◯◯◯◯
% heroku config:set AWS_BUCKET=バケット名
% heroku config:set AWS_DEFAULT_REGION=ap-northeast-1
% heroku config:set AWS_SECRET_ACCESS_KEY=△△△△△△△△△△

アクセスキーとシークレットキーをそれぞれ入力します。

terminal
% git push heroku main

これで本番環境で画像が表示できました。

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

S3を利用して画像を表示できるようにする

概要

Docker、Laravel、Heroku、S3(AWS)の勉強がてら画像アップロードができる掲示板アプリを作ったのですが、S3での画像表示にてこずったので備忘録として記事にしました。
この記事はあくまで本番環境でS3を使用して画像表示をするための記事ですので、ローカル環境で画像アップロード機能が仕上がっている事が前提となります。
自分はこちらの記事を参考に画像アップロード機能を作りました↓
https://note.com/koushikagawa/n/n74380a1f3643

アプリケーションについて

簡単な掲示板アプリです。
908a56e59e9e00691f538f81f46e1298.png
新規投稿ページです↑
91cd29065fe23cad6217b129accbb1d3.png
詳細ページにて画像が表示されます↑
トップページには画像を表示しないので省略します。

AWS

AWSの登録等は省略します。S3に移動しバケットを作成します。
a3ddd4d79078faac6a5002e66ac8dfd4.png
バケット名を入力します↑
68f82c67a05f1686d6bdf1c40e774e95.png
バケットの設定をこのようにして「バケットを作成」を押します。

コード

画像アップロードに関係するコードを載せていきます。

create.blade.php
<form action="/posts" method="post" enctype="multipart/form-data">
    {{ csrf_field() }}
    <input type="file" name="image_url">
    @if ($errors->has('image_url'))
        <div>{{ $errors->first('image_url') }}</div>
    @endif
</form>

postsテーブルの画像のカラム名もimage_urlにしています。変えた方がわかりやすかったかもしれないですね。

PostController.php
public function store(request $request)
{
    $post = new Post();
    $post->body = $request->body;
    // ローカル
    // $time = date("Ymdhis");
    // $post->image_url = $request->image_url->storeAs('public/post_images', $time.'_'.Auth::user()->id. '.jpg');
    $image = $request->file('image_url');
    $path = Storage::disk('s3')->putFile('/', $image, 'public');
    $post->image_url = $path;
    $post->user_id = $id;
    $post->save();
    return redirect()->to('/');
}

public function show(Post $post)
{
    $user_id = $post->user_id;
    $user = DB::table('users')->where('id', $user_id)->first();
    return view('posts.detail', [
        'post' => $post,
        'user' => $user,
        // ローカル
        // 'image_url' => str_replace('public/', 'storage/', $post->image_url)
        'image_url' => $post->image_url
    ]);
}

public function update(request $request)
{
    $id = $request->post_id;
    $post = Post::findOrFail($id);
    $post->body = $request->body;
    if($request->hasFile('image_url'))
    {
        // ローカル
        // Storage::delete('public/post_images/' . $post->image_url);
        // $time = date("Ymdhis");
        // $post->image_url = $request->image_url->storeAs('public/post_images', $time.'_'.Auth::user()->id. '.jpg');
        $image = $request->image_url;
        Storage::disk('s3')->delete($image); //画像削除
        $path = Storage::disk('s3')->putFile('/', $image, 'public');
        $post->image_url = $path;
    }
    $post->save();
    return redirect()->to('/');
}
detail.blade.php
@if ($image_url)
    // ローカル
    // <img src="/{{ $image_url }}" width="250px" height="250px">
    <img src="https://バケット名.s3.ap-northeast-1.amazonaws.com/{{ $image_url }}" width="250px" height="250px">
@endif

ローカルのコードも一応載せています。無視してもらって結構です。

HerokuにAWSの環境変数を設定

terminal
% heroku config:set AWS_ACCESS_KEY_ID=◯◯◯◯◯◯◯◯◯◯
% heroku config:set AWS_BUCKET=バケット名
% heroku config:set AWS_DEFAULT_REGION=ap-northeast-1
% heroku config:set AWS_SECRET_ACCESS_KEY=△△△△△△△△△△

アクセスキーとシークレットキーをそれぞれ入力します。

terminal
% git push heroku main

これで本番環境で画像が表示できました。

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

docker-composeの.envファイルの認識場所が変わった

どうやら最近、(おそらく2021/3/5リリースのdocker desktop for windows v3.2.1から)docker-composeの.envファイルの認識場所が変わったようです。特にVSCodeでRemote - Containersを使っている人は注意が必要です。

解決策

いままで.envファイルはdocker-composeコマンドを実行したときのディレクトリ(ワーキングディレクトリ)にある必要があったのですが、今度からはdocker-compose.ymlと同じ階層に保存してください。

環境

備考
OS Windows10
docker desktop for windows 3.2.1
docker-compose 1.28.5
VSCode 1.54.1
Remote - Containers v0.163.2

前提知識

.envファイルとはdocker-compose.yml中でホストの環境変数を使っているときに、ホストに使いたい環境変数が設定されていない場合の回避策として使えるファイルです。.envファイルについて書いた過去記事あるので参考にしてください。

変更点

いままでこの.envファイルはdocker-composeコマンドを実行したときのディレクトリ(ワーキングディレクトリ)にないと認識しなかったのですが、今度からはdocker-compose.ymlと同じ階層にないと認識しなくなったようです。

例えば、

docker-compose.yml
web:
  image: "webapp:${TAG}"
.env
TAG=v1.5

の2つを

dc_test/
 └  test_directory/
    ├ .env
     └ docker-compose.yml

と同じディレクトリに保存すれば、dc_test階層からコマンドを打ったとしても、

dc_test> docker-compose -f test_directory/docker-compose.yml config
web:
  image: webapp:v1.5

と今まで通り使えます。

VSCodeのRemote Containerで.envファイルを使っている人

VSCodeでRemote - Containersを使って、devcontainer.jsonからdockerComposeFileの項でdocker-compose.ymlを指定し、リモートコンテナを立ち上げていて、その際プロキシを設定するためなどに.envファイルを使っている方も多いと思います。

いままではVSCodeのルートディレクトリに.envファイルを置く必要があったと思いますが、今からは.envファイルはdocker-compose.ymlと同じフォルダに置くようにしてください。

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

Raspberry Piでデータの可視化をしてみる[Grafana]

Raspberry PiはLinuxベースのOSを乗せられる上に、ひと通りのセンサーが積まれていたりGPIOで容易にモジュールを接続できたりと、何かを測定するのにとても便利です。

csvやJsonなどテキスト形式のファイルに出力されることも多いと思いますが、せっかくのLinux環境なのでラズパイ内でデータの可視化ツールを動かせたら便利そうだなと考えました。

環境

Raspberry Pi 3B+/4B (Raspbian GNU/Linux 10 (buster) armv7l )

DockerでデフォルトでインストールされるGrafanaは記事執筆時点(2021/03/15)で7.4.3です。

準備

Dockerが入っていない場合はインストールしましょう。

$ curl -sSL https://get.docker.com | sh
$ docker -v
Docker version 20.10.5, build 55c4c88

実行

いちいちsudoをつけて実行するのは煩わしいので、ログインユーザをgroupに入れて権限を与えておくと良いと思います。

sudo docker run -d -p 3000:3000 grafana/grafana

これでlocalhost:3000にアクセスするとこのような感じでみることができます

image.png

私の場合はさらに、
- Grafanaでcsvを読み込むためのプラグインを導入したい
- ローカルにあるファイルをDockerコンテナ内から参照(マウント)したい
という2点をクリアしたかったので、以下のように追記して実行しました。

sudo docker run -d  -p 3000:3000 --name=grafana  -e "GF_INSTALL_PLUGINS=marcusolsson-csv-datasource" -v /home/pi:/home  grafana/grafana

Grafanaを操作する

ログインについて

初期状態ではID/PASSはadmin/adminになっています。継続的にコンテナを運用するならば入力後に変更しておくと良いでしょう。

データソースの選択

このバージョン(7.4.3)においては
Configuration(右側の歯車マーク)->Data Sources->利用するプラグインの選択('csv'を検索)->LocalファイルPathを入力
といった手順でソースを読み込みます。
この場合のPathはDocker内にマウントしているソースファイルの場所になります。
(私の例では/home/result.csv)

csv_input.mov.gif

ダッシュボードの作成

データソースが読み込めたら左の+パネルよりDashboard->Add new panelと進み、
先ほど読み込んだcsvがデフォルトで表示されているはずなので、csvのヘッダー行に指定している要素を入力していきます。

今回私が使ったデータは自宅のWifiのDL時の速度を計測したもので、
- 日時と日付が入力されているdateのカラムをTime
- 実際の測定値が入ったdownloadのカラムをNumber
でそれぞれ読み込みSwitch to table viewをクリックすると
Y軸、X軸に対応して値がグラフが出力されます。

addnew.mov.gif

なお、Edit画面右側の方でグラフの種類や軸(Axis)の調整ができます。
V7.4からはフォーカス時の横棒表示が使いやすくなったりしているみたいです。

一度作成したpanelはドラッグ操作で細かい時間軸での表示などができます。

timerenge.mov.gif

また、作成したダッシュボードはSave後、左上のShareボタンで(公開環境であれば)リンクを作成することができます。スマートフォン環境にも最適化された表示がされるので便利です。

issue

  • 常に最新のデータを表示させるためにはどうしたらええんや...? ->last〇〇 で指定すると良さそう
  • メトリクスの自動送信とかしたい

ちなみに

Google先生で検索してみると、 Grafanaの他には、

代替案 Grafana
Datadog. ...
Splunk. ...
logstash. ...
Graylog. ...
Fluentd. ...
Prometheus. ...
Nagios Log Server. ...
Scalyr.

のような感じでデータ可視化ツールがあるよと教えてくれました。

この中のいくつかは今回活用したGrafanaのようにDockerイメージが提供されていて同じ使い勝手で利用できるものもあるかと思います。
(ただし、SplunkのようにARMv7用のイメージが提供されていなかったりするので注意)
それぞれのツール同士を連携させる方法もあったりしますのでご自身の好みで色々遊んでみると楽しいかと思います。
最近ではGoogle Data Studioも俄かに流行の兆しを見せていて、一層導入のハードルは下がってい流のではないでしょうか。こちらはBig Queryやメールへのメトリクス画像送信など自社サービスとの連携も強力です。

それでは良いビジュアライズライフを!

参考にした記事

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

Docker 初心者チートシート

Docker 初心者のためのチートシート

このページは随時更新していきます。
ターミナルでのコマンド一覧です。

ログイン

$ docker login

Pullする

$ docker pull {IMAGE_NAME:TAG_NAME}

Docker imageのリストの確認

$ docker images 

コンテナに入る

// すでにあるコンテナに入る
$ docker exec {CONTAINER_NAME}

// 動いているコンテナに入る
$docker exec -it {CONTAINER_NAME} bash

Runの一覧

// imageからコンテナを作る
$ docker run {IMAGE_NAME}

// imageからコンテナを作ってから入る 
$ docker run -it {IMAGE_NAME:TAG_NAME} bash

// すでにあるコンテナを指定してrun
$ docker run --name {CONTAINER_NAME} -it {IMAGE_NAME:TAG_NAME} bash

コンテナの確認

$ docker ps -a

ファイルの作成

touch {FILE_NAME}

コンテナから出る

// 完全に出る
$ exit

// 「コンテナを動かしたままにしたい」「止めたくない」という場合
command + p + q
(コマンドでなく、ショートカット)

リスタート

$ docker restart {CONTAINER_NAME or ID}

コミット

$ docker commit {CONTAINER_NAME or ID} {NEW_Docker_image_NAME}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker composeでngrokを簡単に使う方法(QOL爆上がりな件)

docker-composeで開発をしていて、お手元のスマートフォンでの確認や、他の人にサービスを見てもらう際に、
毎度デプロイすることは難あり。
そういった時に、ngrokを使用すると、簡単にローカル環境を外部に一時的に公開することができる。

今回はLaravelの開発においての使用とし、開発環境はdockerである。
laravelが8000ポートで、
データベースが3000ポートとしている。

また、brew install ngrokを済ませていることが前提。

手順

1 Dockerを起動しておく

docker-compose up -d

2 ngrokを起動する

ngrok http 8000

このコマンドでngrokが起動する。

この時の注意点は、
docker自体にngrokなど特に何もインストールする必要はなく、
起動したいサーバーのポート番号を指定する。

laravelアプリはlocalhost:8000だから、
ngrok http 8000となる。
データベースのポート番号、3000は指定する必要はないと確認している。

そうすると、ngrokの起動画面に切り替わり、forwardingと記載されているurlが実際にchromeなどでアクセス
する際のurlになる。

ngrokの使用を停止する時は、
controll + c
で止まる。

これ使ってQOL爆上がりです。

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

Dockerで作成したLaravelで「bash: composer: command not found」と出たときの対処法

Dockerって環境構築が簡単に行えてすごく便利ですよね。

特にデータベースとかわざわざインストールしなくてもできてしまいますもんね。

そんなDockerでcomposerを使ってあるものをインストールしようとしたのですが、下記のようなエラーが起きました。

bash: composer: command not found

Dockerのコンテナ外ではcomposerコマンドを打てるのですが、コンテナ内では打てませんでした。

結論から言いますと、Dockerのイメージをビルドするときにcomposerをインストールすれば解決します。

Dockerのphpを構築するDockerfileで以下の記述を加えて下さい。

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
  && php composer-setup.php \
  && php -r "unlink('composer-setup.php');" \
  && mv composer.phar /usr/local/bin/composer

一応僕のDockerfileのコードを載せておきますね。

FROM php:7.4-fpm-buster
COPY ./backend /work
COPY ./docker/php/php.ini /usr/local/etc/php/php.ini
LABEL maintainer="ucan-lab <info@u-can.tech>"

SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

# tinker(psysh)
ARG PSYSH_DIR=/usr/local/share/psysh
ARG PSYSH_PHP_MANUAL=$PSYSH_DIR/php_manual.sqlite
ARG PHP_MANUAL_URL=http://psysh.org/manual/ja/php_manual.sqlite

# timezone
ARG TZ=Asia/Tokyo

# composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

RUN apt-get update && \
  apt-get -y install git unzip libzip-dev libicu-dev libonig-dev libjpeg-dev libpng-dev libfreetype6-dev && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  docker-php-ext-install intl pdo_mysql zip bcmath && \
  docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ && \
  docker-php-ext-install gd

# Install Composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
  && php composer-setup.php \
  && php -r "unlink('composer-setup.php');" \
  && mv composer.phar /usr/local/bin/composer

# Install Node.js
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
    && apt-get update \
    && apt-get install -y nodejs

RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN apt-get install -y cron

こんな感じでコンテナ内に入り、composer -Vと打ちバージョンが返ってくれば成功です。

以上、「Dockerで作成したLaravelで「bash: composer: command not found」と出たときの対処法」でした!

Thank you for reading

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

Docker環境構築後にVS Codeで「The git repository at 'Appディレクトリ' has too many active changes, only a subset of Git features will be enabled.」に見舞われる

環境

Ruby on Rails 6.0.3
ruby 2.6.3
MacOS Catalina 10.15.7

困ったこと

ローカルでVS CodeでDockerのコンテナ作りをしていたら、VS CodeのメニューバーのSource Control(編集したファイルの変更前後を表示してくれるナイスなやつ)が5k+になって、そのうちgitが壊れました。

それからというもの画面右下に下記メッセージが表示されるようになりました。

The git repository at 'Appディレクトリ' has too many active changes, only a subset of Git features will be enabled.

(意訳:gitリポジトリの変更が多すぎるから、一部のgit機能しか使えなくなってるよ。)

スクリーンショット 2021-03-15 11.03.07.png

そして、左のメニューバーの編集したファイルの差異を示してくれる箇所が時計マークでワークしなくなり、左下にgitのブランチ名を表示してくれなくなりました。。。VS codeを再起動しても変わらずです。

スクリーンショット 2021-03-15 11.54.34.png

実はこの問題に見舞われるのは2度目なのですが、1度目どう解決したかメモしておらず(LaravelのプロジェクトをGitHubにアップするのに試行錯誤した話)、ネットにもあまり情報がなく困り果てており、もうこのアプリではVS Codeのこの機能は諦めて全てターミナルでgit statusして凌ぐか...と思っていた矢先、弊社の最強先輩陣が助けてくれました。

解決

vendor/bundleを.gitignoreに含めてコミットしたら直りました!

このディレクトリはbundleをinstallする場所。
Dockerの環境構築した時に、5k以上のファイルがここにインストールされてしまったのかなと推察しております。

too many changes(変更が多すぎる)ということで怒られているので、.gitignoreが適切に設定されているかを疑うのがいいのかもしれません。

先輩方(@yuuu @yuka)の方向に足を向けて寝られません。

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

<Golang+Nginx+MySQL>Macローカル上にDocker Composeでアプリを立ち上げてみた

Dockerアプリケーションのアーキテクチャー

スクリーンショット 2021-03-15 10.32.57.png

ざっくりとやること・できることの説明

  • docker-composeでNginxとGo言語のAPI, DBとしてMySQLのコンテナを3つ立ち上げる
  • Nginxのindex.htmlからGo言語で書いたREST API(go-ginのフレームワーク使用)を経由して、DBに問い合わせ
  • DBにCRUD(gormのフレームワーク使用)ができることを確認
  • ※DockerとDocker Composeはインストールされているものとする。

バージョン確認

確認してみたら、以下のバージョンでした。

Docker version 20.10.2
docker-compose version 1.27.4
golang:1.14.7-alpine3.12
mysql:5.7
nginx:1.17.3-alpine

※厳密にはバージョンの依存関係とかも考えないといけないが、一旦ローカルで動かすので、スルーしますm(__)m

フォルダ構成

docker-local
├── .env
├── api
│   └── src
│       ├── main.go
│       ├── model  ── model.go
│       └── config ── config.go
├── db
│   ├── conf ── my.cnf
│   └── db-data
├── docker
│   └── nginx
│       ├── Dockerfile
│       └── nginx.conf
├── docker-compose.yml
└── web
    ├── env
    │   └── nginx ── site.conf
    └ src ── index.html

ディレクトリとファイルの用途解説

名前 種類 説明
docker-local フォルダ dockerローカルアプリケーションの親フォルダ
.env ファイル docker-composeで使う環境変数のファイル
api フォルダ APIのフォルダ
src フォルダ ソースフォルダ
main.go ファイル goを起動するときのファイル
model/model.go ファイル DBとやりとりする時のファイル
struct, dao系のメソッドを記載
config/config.go ファイル DBの接続情報等を記載
db フォルダ DBに関するフォルダ
conf/my.cnf ファイル 任意のDB設定を記載。マウント用
db-data フォルダ DBのデータをsyncするマウント用
docker フォルダ Dockerfileたちを格納するフォルダ
nginx フォルダ NginxのimageをビルドするDockerfileを格納
Dockerfile ファイル nginxのimage
nginx.conf ファイル nginxの設定ファイル
docker-compose.yml ファイル docker containerを一括でコントロールするyamlファイル
web フォルダ フロントのファイルを格納
env フォルダ 環境設定ファイルを格納
nginx/site.conf ファイル nginxのserver設定ファイル
IPアドレス、ポート、ルーティングなど設定
src/index.html ファイル 画面表示用ファイル

Docker Composeの中身

version: "3.8"

services:
  nginx:
    image: infra-challenge:nginx-20210312
    # command: 
    build: 
      context: ./docker/nginx
      dockerfile: Dockerfile
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./web/env/nginx:/etc/nginx/conf.d
      - ./web/src:/var/www/html
    depends_on:
      - api
    logging:
      driver: "none"
    restart: always
    networks:
      - services

  api:
    image: golang:1.14.7-alpine3.12
    command: go run main.go --host 0.0.0.0 --port 8080
    container_name: api
    ports:
      - 8080:8080
    volumes:
      - ./api:/go/src/github.com/infra-challenge/api
      - /Users/username/go:/go
    working_dir: /go/src/github.com/infra-challenge/api/src
    environment:
      - APP_STAGE=local
      - LOG_LEVEL=debug
      - MYSQL_CONNECTION
    depends_on:
      - db
    restart: always
    networks:
      - services

  db:
    image: mysql:5.7
    # build: ./docker/mysql
    container_name: db
    ports:
      - 3306:3306
    volumes:
      - ./db/conf/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./db/db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD
      - MYSQL_DATABASE
      - MYSQL_USER
      - MYSQL_PASSWORD
    healthcheck:
      test: ["CMD-SHELL", "mysqlshow -u ${MYSQL_USER} -p${MYSQL_PASSWORD}"]
      interval: "5s"
      retries: 10
    logging:
      driver: "none"
    restart: always
    networks:
      - services

networks:
  services:
    external:
      name: local_infra_challenge_networks

主な属性の解説

  • docker composeの文法バージョンは3.8だよ
  • services配下に、コンテナの定義を書いていく。今回はnginx, api, dbの3つ
  • nginxDockerfileを使うから、image名は任意で、buildの属性を指定。
    • contextはDockerfileのある相対パス、dockerfileはDockerfile名
    • ※ファイル名がDockerfileとなっていたら、build: ./docker/nginxとしてもOK
  • container_nameを指定すると、docker stopとかするときに、idじゃなくて名前を指定すれば制御できるので便利
  • ports<ホスト(Macローカル)>:<ゲスト(Dockerコンテナ)>でポートを接続
  • volumes<ホスト(Macローカル)>:<ゲスト(Dockerコンテナ)>でマウントフォルダを指定
    • マウントとは、フォルダ同士を共有してsync(同期)すること。
  • depends_onは他のコンテナが起動成功でき次第〜みたいなやつ
  • apiとdbは、自分でDockerfileは用意せずに、Docker-Hub公式のimageを使っている
  • environmentに環境変数を指定する。
    • docker-compose.ymlと同階層に.envファイルを置き指定
  • DBではhealthcheckを行い、起動しているか随時確認
  • ネットワークを組むことで、コンテナ間通信が可能となり、APIからDBに問い合わせができるようになった

ネットワークについて

作ったネットワークの情報を確認してみると、下記のようなObjectが返ってきますね〜
"Subnet": "172.19.0.0/16",の中で、Containers(nginx, api, db)がIPアドレスを振られて存在しているのがわかります。
ちなみに、networksだけでなくlinksという属性もあり、linksを使うと、一方的にコンテナ間通信ができるようになる設定もあるので、TPOによって使い分ける◎
公式docker:links

$ docker network inspect local_infra_challenge_networks
[
    {
        "Name": "local_infra_challenge_networks",
        "Id": "f6a978e6f3aa803be061418c1c7081d132c9538c207ea08b1d732fc55ba2b917",
        "Created": "2021-03-12T03:57:20.0697997Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "7a81d8c6f965a07ce446aa0983180bbb4775187ed6873a9e26dbc9540f623392": {
                "Name": "nginx",
                "EndpointID": "09336c1acc58f9b75ea3ced604a7d82b168a5f0cd132ae4f2fffd267a416b022",
                "MacAddress": "02:42:ac:13:00:04",
                "IPv4Address": "172.19.0.4/16", #<-これ!!
                "IPv6Address": ""
            },
            "842244244bf00593e25317dd1cafb35ae03cfbc5246a87c666c6434a6ad7540d": {
                "Name": "db",
                "EndpointID": "3810c5b1b5f87b3ba4331320fcb2106696f3dcd157a771f9de63aeffc3a14720",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16", #<-これ!!
                "IPv6Address": ""
            },
            "c0906b3fc86d92f4b89474b7647e85a36e489469f83905c94785f2f278807532": {
                "Name": "api",
                "EndpointID": "e291176e7bd08040c2486d0409dab009a724fb7e3f0da3a5a9585cb23344a999",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16", #<-これ!!
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

コンテナ間通信をするときは、コンテナ名でエンドポイントを指定することができるから便利

# db:3306 の部分 <コンテナ名:ポート>
MYSQL_CONNECTION=local:local@tcp(db:3306)/infra-challenge 

マウントについて

nginx

    volumes:
      - ./web/env/nginx:/etc/nginx/conf.d
      - ./web/src:/var/www/html
  • nginxにはdefault.confというものがあり、それを自分の設定に書き換えたいので、./web/env/nginx で書き換えてる
  • /var/www/html以下がdockerコンテナ内のnginxフォルダ構成になる(する)ので、index.htmlがあるディレクトリを同期

api

    volumes:
      - ./api:/go/src/github.com/infra-challenge/api
      - /Users/username/go:/go
  • とりあえずGo Pathが通っているところをdockerコンテナ側にマウントしてる。
  • APIのファイル等も同期

db

    volumes:
      - ./db/conf/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./db/db-data:/var/lib/mysql
  • MySQLのデータの格納先が/var/lib/mysqlになるので、ホストの./db/db-dataに同期して、コンテナを除去してもデータが消えないようにする
  • 自分のDB設定、例えば、character-setとかcollationとかをマウントして上書き
# my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[mysql]
default-character-set=utf8mb4

いざ、Docker Composeで起動してみる!!

コマンド

$ cd /Users/username/src/github.com/infra-challege/docker-local
$ docker network create --driver bridge local_infra_challenge_networks
[~省略~]
$ docker-compose build --no-cache
[~省略~]
$ docker-compose up -d --remove-orphans
Creating db ... done
Creating api ... done
Creating nginx ... done

$ docker ps -a
CONTAINER ID   IMAGE                                 COMMAND                  CREATED         STATUS                            PORTS                               NAMES
8fxxxb102ed4   infra-challenge:nginx-20210312        "nginx -g 'daemon of…"   4 seconds ago   Up 3 seconds                      0.0.0.0:80->80/tcp                  nginx
8fxxx25640e6   golang:1.14.7-alpine3.12              "go run main.go --ho…"   6 seconds ago   Up 4 seconds                      0.0.0.0:8080->8080/tcp              api
e5xxxe97320e   mysql:5.7                             "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds (health: starting)   0.0.0.0:3306->3306/tcp, 33060/tcp   db

  • docker-composeファイルがある階層に移動
  • networks属性を指定したので、そのネットワークを作成する。
  • nginxはDockerfileをつかってimageを作成するので、ビルドする必要がある。
    • --no-cacheオプション:構築時にイメージのキャッシュを使わない。
  • docker-compose upで起動
    • -dオプション:バックグラウンド実行
    • --remove-orphansオプション:Composeファイルで定義されていないサービス用のコンテナを削除

Webページにアクセスできるか確認

(超しょぼいですが...w)
アクセスできた!
スクリーンショット 2021-03-15 11.54.07.png

user1を作成してみよう。
スクリーンショット 2021-03-15 11.57.28.png
作成できたことを確認◎
スクリーンショット 2021-03-15 11.59.15.png

コンテナ終了コマンド

$ docker-compose down
Stopping nginx ... done
Stopping api   ... done
Stopping db    ... done
Removing nginx ... done
Removing api   ... done
Removing db    ... done

止まりました。

ハマったポイント

  • go run main.goした後に、起動はしていたがポート設定がミスっていて、APIにアクセスできなかった。
    • 「なんかうまくいかないな〜〜汗」ってなったので、VSCodeから一旦APIサーバーを止めて再起動して、通信がうまくいったけど、それはコンテナ間通信ではなかった、、、
      • コンテナ上ではなくローカルでAPIサーバーが立ち上がってしまい、通信できていると勘違いしてしまった。
  • index.htmlの画面表示するポートとAPIを司るポートそれぞれが別だったので、その調整にハマった。
  • nginxには、サーバー設定が必要だった。
    • nginx.confdefault.confというファイルが存在しこれのIPアドレス、ポート等を設定しないといけないので、前もってnginxの知識をいれておかないと簡単には動かなかった
# site.conf (default.confの上書き)
server {
    listen      80;
    listen      8080; # APIで8080ポートも使ってる関係で、これも必要だった
    server_name localhost;
    root        /var/www/html;

    location / {
        index  index.html index.htm;
        root   /var/www/html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/html/error;
    }
}

まとめ

docker-compose.ymlでコンテナを起動して、Dockerアプリケーションを作る感覚がつかめたので、楽しかったですわい!

コンテナのコントロールってすごい簡単で、サクサク動くから、せっかちな自分でも全然苦じゃない。
マスターしていきたいなああああ

以上、ありがとうございました!

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

Dockerとdocker-composeを使ったRails APIモードの環境構築

Dockerとdocker-composeを使い、Rails6をAPIモードで動かす環境を構築しました。最後に動作確認もしています。

*rails newをする際のオプションの説明を追記しました。


前提

Docker & docker-composeをインストール済み

動作環境

  • macOS Catalina 10.15.7
  • Ruby 2.7.1
  • Ruby on Rails 6.0.3
  • Docker 20.10.2
  • docker-compose 1.27.4


ディレクトリを作成します。

mkdir rails_api_docker
cd rails_api_docker


GemfileとDockerfileを作成します。

Gemfile
source 'https://rubygems.org'

gem 'rails', '6.0.3'
Dockerfile
FROM ruby:2.7.1-alpine3.11

ENV BUNDLER_VERSION=2.1.4

WORKDIR /usr/src/app

COPY Gemfile .

RUN apk update && \
    apk add --no-cache \
    linux-headers \
    libxml2-dev \
    curl-dev \
    make \
    gcc \
    libc-dev \
    g++ \
    sqlite-dev \
    tzdata && \
    gem install bundler && \
    bundle install

COPY . .

インストールするbundlerのバージョンを指定するためにENVで環境変数を定義しています。


Dockerfileを元にDockerイメージを作成します。

docker build -t rails_api:6.0.3 .


作成したイメージからコンテナを起動し、Railsアプリケーションを作成します。

docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app rails_api:6.0.3 rails new . --skip-keeps -M -C -S -J -B
オプション 説明
--skip-keeps .keepファイルを作成しない
-M Action Mailer, Action Mailbox, Action Text関連のファイルを作成しない
-C Action Cable関連のファイルを作成しない
-S Sprockets, Spring, listenを使用しない
-J JavaScript, turbolinksを使用しない
-B bundle installを実行しない


docker-composeでコンテナを起動します。

docker-compose up


localhost:3000にアクセスします。起動画面が表示されれば成功です。
スクリーンショット 2021-03-15 11.06.35.png


APIの動作確認

起動中のコンテナにログインします。

docker-compose exec api sh


今回は簡単にするためscaffoldを使ってcontrollerとmodelを作成します。

rails g scaffold User name:string


/db/seeds.rbに以下を追記してテストデータを作成します。

seeds.rb
User.create name: "Euclid"


DBを初期化し、テストデータを反映させます。

rails db:create
rails db:migrate
rails db:seed


/app/controllers/users_controller.rbのindexアクションを以下に変更します。

users_controller.rb
def index
  @users = User.all
  render json: @users
end

localhost:3000/usersにアクセスして以下が表示されれば成功です。

スクリーンショット 2021-03-15 11.32.19.png


読んでいただきありがとうございました!ご指摘やご意見などありましたらコメントしていただけると嬉しいです?

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

Ruby初心者の自分がmruby触ってみた

こんにちは、smpeotnです。
今回は、mruby3.0がリリースされたとういことなので、ちょろっと触ってみようかなと思います。

mrubyってなんでしょう?

正直、自分も今日まで知らなかった。
朝、mruby3.0リリースされたってよって記事を見て初めてこうゆうものがあるんだと知りました。

  • 省メモリ
  • 言語仕様が小さい
  • 軽量なRuby言語処理系言語
  • LuaのようにかんたんにC・C++に組み込むことができる

なるほど。。。。使い方によっては色々できそうだ!

環境構築してみる

DockerでRuby環境をまずは:こうゆうときDockerって便利ですよね

Dockerfile
FROM ruby:2.5
RUN mkdir /data
docker-compose.yml
version: '3'
services:
  ruby:
    build: .
    tty: true #コンテナを起動しっぱなしにする
    volumes:
      - .:/data
# 起動 !!
% docker-compose up -d

https://github.com/mruby/mruby/blob/master/doc/guides/compile.md
ここに書かれてる内容を確認して必要なミドルウェアのインストールとかする
- ruby 2.5
- gcc
- ar

% docker-compose exec ruby /bin/bash
root@4c1ad477fc54:/# which gcc
/usr/bin/gcc
root@4c1ad477fc54:/# which ar
/usr/bin/ar
root@4c1ad477fc54:/# which ruby
/usr/local/bin/ruby

root@4c1ad477fc54:/# gcc --version
gcc (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

root@4c1ad477fc54:/# ar --version
GNU ar (GNU Binutils for Debian) 2.31.1
Copyright (C) 2018 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.

root@4c1ad477fc54:/# ruby --version
ruby 2.5.8p224 (2020-03-31 revision 67882) [x86_64-linux]

Build Compile.

root@4c1ad477fc54:/data/data/mruby-3.0.0# rake -v
.....
root@4c1ad477fc54:/data/data/mruby-3.0.0# ls -al ./bin/
total 23296
drwxr-xr-x  7 root root     224 Mar 12 15:26 .
drwxrwxr-x 38 root root    1216 Mar 12 15:25 ..
-rwxr-xr-x  1 root root 5990688 Mar 12 15:25 mirb
-rwxr-xr-x  1 root root 3773904 Mar 12 15:25 mrbc
-rwxr-xr-x  1 root root 5970456 Mar 12 15:26 mruby
-rwxr-xr-x  1 root root    1031 Mar 12 15:25 mruby-config
-rwxr-xr-x  1 root root 6040224 Mar 12 15:26 mruby-strip

root@4c1ad477fc54:/data/data/mruby-3.0.0# ./bin/mruby --version
mruby 3.0.0 (2021-03-05)

# パス通す
root@4c1ad477fc54:~# export PATH=/data/data/mruby-3.0.0/bin:$PATH

root@4c1ad477fc54:~# mruby --version
mruby 3.0.0 (2021-03-05)

これはDockerfileに書けばいいよね...

Dockerfile
FROM ruby:2.5

RUN mkdir /data
RUN apt-get update && apt-get install -y vim
RUN apt-get install -y wget

RUN mkdir -p /usr/src/mruby
WORKDIR /usr/src/mruby
RUN wget https://github.com/mruby/mruby/archive/3.0.0.zip -O mruby-3.0.0.zip && \
unzip mruby-3.0.0.zip && \
cd ./mruby-3.0.0 && \
rake -v

ENV PATH $PATH:/usr/src/mruby/mruby-3.0.0/bin
WORKDIR /usr/src/mruby/mruby-3.0.0

Hello World.(https://github.com/mruby/mruby/wiki/Hello-World)

hello.c
#include <stdio.h>
#include <mruby.h>
#include <mruby/compile.h>

int
main(void)
{
  mrb_state *mrb = mrb_open();
  if (!mrb) { /* handle error */ }
  puts("Executing Ruby code from C!");
  mrb_load_string(mrb, "p 'hello world on mruby! this is ruby code.'");
  mrb_close(mrb);
  return 0;
}
root@ddd2a0d85a35:/usr/src/mruby/mruby-3.0.0# gcc -Iinclude hello.c build/host/lib/libmruby.a -lm -o hello.out
root@ddd2a0d85a35:/usr/src/mruby/mruby-3.0.0# ./hello.out
Executing Ruby code from C!
"hello world on mruby! this is ruby code."

できた!!!!!
Docker簡単。ここまでできれば色々検証できるで

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

Ruby初心者の自分がmruby触ってみた(環境構築)

こんにちは、smpeotnです。
今回は、mruby3.0がリリースされたとういことなので、ちょろっと触ってみようかなと思います。

mrubyってなんでしょう?

正直、自分も今日まで知らなかった。
朝、mruby3.0リリースされたってよって記事を見て初めてこうゆうものがあるんだと知りました。

  • 省メモリ
  • 言語仕様が小さい
  • 軽量なRuby言語処理系言語
  • LuaのようにかんたんにC・C++に組み込むことができる

なるほど。。。。使い方によっては色々できそうだ!

環境構築してみる

DockerでRuby環境をまずは:こうゆうときDockerって便利ですよね

Dockerfile
FROM ruby:2.5
RUN mkdir /data
docker-compose.yml
version: '3'
services:
  ruby:
    build: .
    tty: true #コンテナを起動しっぱなしにする
    volumes:
      - .:/data
# 起動 !!
% docker-compose up -d

https://github.com/mruby/mruby/blob/master/doc/guides/compile.md
ここに書かれてる内容を確認して必要なミドルウェアのインストールとかする
- ruby 2.5
- gcc
- ar

% docker-compose exec ruby /bin/bash
root@4c1ad477fc54:/# which gcc
/usr/bin/gcc
root@4c1ad477fc54:/# which ar
/usr/bin/ar
root@4c1ad477fc54:/# which ruby
/usr/local/bin/ruby

root@4c1ad477fc54:/# gcc --version
gcc (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

root@4c1ad477fc54:/# ar --version
GNU ar (GNU Binutils for Debian) 2.31.1
Copyright (C) 2018 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.

root@4c1ad477fc54:/# ruby --version
ruby 2.5.8p224 (2020-03-31 revision 67882) [x86_64-linux]

Build Compile.

root@4c1ad477fc54:/data/data/mruby-3.0.0# rake -v
.....
root@4c1ad477fc54:/data/data/mruby-3.0.0# ls -al ./bin/
total 23296
drwxr-xr-x  7 root root     224 Mar 12 15:26 .
drwxrwxr-x 38 root root    1216 Mar 12 15:25 ..
-rwxr-xr-x  1 root root 5990688 Mar 12 15:25 mirb
-rwxr-xr-x  1 root root 3773904 Mar 12 15:25 mrbc
-rwxr-xr-x  1 root root 5970456 Mar 12 15:26 mruby
-rwxr-xr-x  1 root root    1031 Mar 12 15:25 mruby-config
-rwxr-xr-x  1 root root 6040224 Mar 12 15:26 mruby-strip

root@4c1ad477fc54:/data/data/mruby-3.0.0# ./bin/mruby --version
mruby 3.0.0 (2021-03-05)

# パス通す
root@4c1ad477fc54:~# export PATH=/data/data/mruby-3.0.0/bin:$PATH

root@4c1ad477fc54:~# mruby --version
mruby 3.0.0 (2021-03-05)

これはDockerfileに書けばいいよね...

Dockerfile
FROM ruby:2.5

RUN mkdir /data
RUN apt-get update && apt-get install -y vim
RUN apt-get install -y wget

RUN mkdir -p /usr/src/mruby
WORKDIR /usr/src/mruby
RUN wget https://github.com/mruby/mruby/archive/3.0.0.zip -O mruby-3.0.0.zip && \
unzip mruby-3.0.0.zip && \
cd ./mruby-3.0.0 && \
rake -v

ENV PATH $PATH:/usr/src/mruby/mruby-3.0.0/bin
WORKDIR /usr/src/mruby/mruby-3.0.0

Hello World.(https://github.com/mruby/mruby/wiki/Hello-World)

hello.c
#include <stdio.h>
#include <mruby.h>
#include <mruby/compile.h>

int
main(void)
{
  mrb_state *mrb = mrb_open();
  if (!mrb) { /* handle error */ }
  puts("Executing Ruby code from C!");
  mrb_load_string(mrb, "p 'hello world on mruby! this is ruby code.'");
  mrb_close(mrb);
  return 0;
}
root@ddd2a0d85a35:/usr/src/mruby/mruby-3.0.0# gcc -Iinclude hello.c build/host/lib/libmruby.a -lm -o hello.out
root@ddd2a0d85a35:/usr/src/mruby/mruby-3.0.0# ./hello.out
Executing Ruby code from C!
"hello world on mruby! this is ruby code."

できた!!!!!
Docker簡単。ここまでできれば色々検証できるで

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

Dockerサーバーの余ったリソースをXMRigでマイニングしてみた

前書き的なもの

自宅サーバーとしてXeon E5-2630Lを積んだラックサーバー(FUJITSU PRIMERGY RX200S7)の運用を始めて早3か月、Web、アプリケーション、NASと色々な用途で使用していましたがマシンパワーの割に小規模でリソースの1割を使用できているかどうかな状況だったので、余ったリソースでマイニングしてみました。

備忘録的なもの...(笑)

Docker上で構築することで環境に左右されずにとりあえず動くのと、マシンリソースの明確な制限と区分けがDockerで簡単にできるので今回構築してみました。

内容としてはUbuntu18.04のベースイメージ上にXMRigを引っ張ってきてコンパイルするだけ。

Dockerのインストール

異なるマシン環境、OSでも動いてくれる!素晴らしい!!

ということで、Dockerのインストールから始めましょう。

Docker導入済みな方は次の項目へ。

手順は特に変わったこともなく公式通りにインストールします。

以下、公式の手順通り → https://docs.docker.com/engine/install/debian/

↓ 作業に必要なパッケージのインストール

apt Install
$ sudo apt update

$ sudo apt -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    gnupg-agent \
    software-properties-common

*[-y]オプションでインストール時の確認スキップ、後の工程で" gnupg "がインストールされてないと怒られる事が多いので追加。

↓ Docker公式からGPG Keyの取得

Add GPG Key
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

↓ 公式がkeyを確認しろと言ってるので一応確認

Key check
$ sudo apt-key fingerprint 0EBFCD88

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22

↓ aptにリポジトリ追加、環境によって2行目の[arch=amd64]を[arch=arm64]とかに書き換える

Intel,AMD CPU
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
ARM CPU
$ sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

↓ Dockerのインストール

Docker Install (1)
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

*バージョン指定したい場合は以下のコマンドで調べて各パッケージ名の後に[ =Version ]指定でインストール
詳細については公式へ

Docker Install (2)
$ apt-cache madison docker-ce

$ apt-cache madison docker-ce-cli

$ sudo apt install docker-ce=<VERSION_STRING> \
   docker-ce-cli=<VERSION_STRING> \
   containerd.io

↓ お約束のHello Worldで確認、特に怒られなければ問題ない。

Docker Check
$ sudo docker run hello-world

DockerFileを用意してイメージ作成

今回利用するXMRigをUbuntu18.04のベースイメージ上でソースからコンパイルしてイメージ作成、コンテナ作成して実行するだけでマイニングできるようにします。

XMRigのソースはGithubから→https://github.com/xmrig/xmrig

↓ DockerFileを好きなように書く

Dockerfile
FROM ubuntu:18.04

# Default git repository
ENV GIT_REPOSITORY https://github.com/xmrig/xmrig.git

# Innstall packages
RUN apt-get update \
    && set -x \
    && apt install -qq --no-install-recommends -y build-essential ca-certificates cmake git libhwloc-dev libuv1-dev libssl-dev \
    && git clone $GIT_REPOSITORY \
    && echo "#ifndef XMRIG_DONATE_H" | tee /xmrig/src/donate.h \
    && echo "#define XMRIG_DONATE_H" | tee -a /xmrig/src/donate.h \
    && echo "constexpr const int kDefaultDonateLevel = 0;" | tee -a /xmrig/src/donate.h \
    && echo "constexpr const int kMinimumDonateLevel = 0;" | tee -a /xmrig/src/donate.h \
    && echo "#endif /* XMRIG_DONATE_H */" | tee -a /xmrig/src/donate.h \
    && cd /xmrig \
    && cmake . \
    && make \
    && cd - \
    && mv /xmrig/xmrig /usr/local/bin/ \
    && rm -rf /xmrig \
    && apt purge -y -qq build-essential cmake git libhwloc-dev libuv1-dev libssl-dev \
    && apt clean -qq

ENTRYPOINT ["/usr/local/bin/xmrig"]
CMD ["--donate-level","0","-o","monerohash.com:2222","-u","WALLET_ADDRESS","-p","x","-k"]

今回はUbuntu18.04のベースイメージ上にgitでXMRigのソースを引っ張て来てコンパイルし、実行に不要なファイルをきれいにするだけ。

一応使い方としては、CMD行の" -o "オプションの値" monerohash.com:2222 "に自分の参加したいマイニングプールの指定するアドレス:ポートを、" -u "オプションの値" WALLET_ADDRESS "をMoneroの場合はMyMoneroなどで作成した自分のウォレットのアドレスを入力するだけ。

途中の" echo | tee "はXMRigの作者が寄付としてデフォルトで1%(1%なら100分に1分程度)の時間ごとに作者のアカウントでマイニングするようになっており、ソースのヘッダーファイルを書き換えてデフォルト寄付を無効にしている。

寄付を無効にしている理由としては、マイニングプールによってはブロックを掘り当てた際にプールに参加してマイニングしていないと報酬を得られないので、寄付マイニング中にプールでブロックを掘り当てると報酬が得られない可能性がある為。

↓ 作成したDockerFileをサーバーに何かしらで送る

DockerFile Send
$ scp Dockerfile User@ServerAddless:/xmrig

↓ scpで転送が面倒ならsshでvimコピペも可

DockerFile vim
$ mkdir /xmrig
$ vi /xmrig/Dockerfile

↓ DockerFileをBuildしてイメージ作成、build中にmakeしてるので結構時間かかる

Docker Build
$ cd /xmrig
$ docker build -t xmrig .

↓ 作成したイメージの確認、作成した名前のイメージが表示されればOK

Docker Image List
$ docker image ls
 REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
 xmrig            latest    74e3b5a9434b   10 seconds ago   354MB

イメージからコンテナ作成して実行

作成したイメージを指定してdocker runすれば自動的にXMRigがマイニングしてくれます。

↓ docker runでコンテナ作成して実行

Docker Run
$ docker run -d --name xmrig --restart=always xmrig

XMRigの稼働状況など見たい場合はDockerのログから参照

↓ dockerのコンテナログからXMRigの出力確認

Docker Logs
$ docker logs xmrig
* ABOUT        XMRig/6.10.0 gcc/7.5.0
 * LIBS         libuv/1.18.0 OpenSSL/1.1.1 hwloc/1.11.9
 * HUGE PAGES   supported
 * 1GB PAGES    disabled
 * CPU          Intel(R) Xeon(R) CPU E5-2630L 0 @ 2.00GHz (1) 64-bit AES
                L2:1.5 MB L3:15.0 MB 6C/12T NUMA:1
 * MEMORY       4.8/15.6 GB (31%)
 * DONATE       0%
 * ASSEMBLY     auto:intel
 * POOL #1      monerohash.com:2222 algo auto
 * COMMANDS     hashrate, pause, resume, results, connection
 * OPENCL       disabled
 * CUDA         disabled
[2021-03-14 18:22:15.660]  net      use pool monerohash.com:2222  107.191.99.221
[2021-03-14 18:22:15.660]  net      new job from monerohash.com:2222 diff 50000 algo rx/0 height 2316997
[2021-03-14 18:22:15.660]  cpu      use argon2 implementation SSSE3
[2021-03-14 18:22:15.662]  msr      msr kernel module is not available
[2021-03-14 18:22:15.662]  msr      FAILED TO APPLY MSR MOD, HASHRATE WILL BE LOW
[2021-03-14 18:22:15.663]  randomx  init dataset algo rx/0 (12 threads) seed c065bc1e5406f242...
[2021-03-14 18:22:15.663]  randomx  allocated 2336 MB (2080+256) huge pages 0% 0/1168 +JIT (0 ms)
[2021-03-14 18:22:25.066]  randomx  dataset ready (9403 ms)
[2021-03-14 18:22:25.066]  cpu      use profile  rx  (6 threads) scratchpad 2048 KB
[2021-03-14 18:22:25.069]  cpu      READY threads 6/6 (6) huge pages 0% 0/6 memory 12288 KB (3 ms)
[2021-03-14 18:22:27.353]  cpu      accepted (1/0) diff 50000 (265 ms)
[2021-03-14 18:22:46.715]  net      new job from monerohash.com:2222 diff 75000 algo rx/0 height 2316997
[2021-03-14 18:22:49.526]  cpu      accepted (2/0) diff 75000 (233 ms)
[2021-03-14 18:23:16.935]  net      new job from monerohash.com:2222 diff 112501 algo rx/0 height 2316997
[2021-03-14 18:23:25.040]  cpu      accepted (3/0) diff 112501 (191 ms)
[2021-03-14 18:23:25.102]  miner    speed 10s/60s/15m 1845.8 n/a n/a H/s max 1846.2 H/s

"new job"でプールからジョブが降ってきて"accepted (1/0) diff 50000 (265 ms)"のように承認されていれば正常に稼働してマイニングできています。

デフォルトで1分毎にハッシュレートが表示されるようになっているので、それを見ながらチューニングするのが普通なのですが自動で最適化されるようでなかなかの数字出ているのでそのまま使えると思います。

ちなみに上記ログを見てもらうとわかるように当環境では6コア/12スレッドCPUを使用しており、自動で最適化され半分の6スレッドしか使用していませんがこれ以上スレッドを割り当ててもハッシュレートがそこまで伸びませんでした。

↓ docker statsでコンテナのCPU使用率などを確認

Docker Stats
$ docker stats --no-stream
 CONTAINER ID   NAME    CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O   PIDS
 97b858fafab4   xmrig   599.88%   2.305GiB / 15.57GiB   14.80%    40.1kB / 19.3kB   0B / 0B     12

CPUは6コア/12スレッドなので1200%が上限ですが半分の600%前後で推移しています。

後書き的なもの

とりあえず数日運用してみましたが、他のサービスやアプリケーションにも影響与えずに安定してくると平均2kH/s出ているので様子見しようと思います。

稼働時のサーバー消費電力が平均125Wなので赤字ではありますが、この消費電力で2kH/s出ていればまぁ上々かと。

余裕があれば後日、XMR-Stakと比較もしてみます。

そのうちサーバー増設しようかなと思ってるので、その際にはk8s環境も構築して試してみたいです。

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

ROS2Javaをビルドする

はじめに

とある研修の教材作りにROS2を使用してはどうか、たまたま周りにJavaできる人多いよねという事で、私が手始めにROS2Javaを触ってみることにしました。
(この記事は身内向けの記事ですが、他にROS2Javaを試してみたい方にも参考になるかもしれないので投稿しました。)
まずはROS2Javaのリポジトリを見て、自分のMacBook Airにインストールしてみようと思いましたがbrew/pipで入れる依存モジュールやROS/ROS2の依存モジュールのバージョンの組み合わせが悪いのかビルドがうまくいきませんでした。
今回はいろいろ試行錯誤してできたビルド手順をまとめておきたいと思います。
macのローカルではなくUbuntu18.04のDockerコンテナ内でのビルドになります。

環境

  • OS : macOS 10.15.7
  • CPU : 1.2 GHz クアッドコアIntel Core i7
  • Docker : 20.10.0

ビルド手順

Docker Imageのダウンロード

これを研修で使うにあたり、参加者のそれぞれのPCのローカルでROS2Javaをビルドするものならば環境の違いでビルドが通らないことが往々にして発生しうるだろうということで、Dockerコンテナ内でビルド環境を作ってこれを配布した方がいいと思いました。
既にビルド環境が整っているUbuntuのImageを見つけたので、これを使用することにします。

docker pull theosakamg7/ros2_java_docker:ubuntu-ros2java

コンテナ起動

念のためコンテナ内のビルドに使用するディレクトリをローカルにマウントしておきます。
ローカルにマウント用のディレクトリを作っておきます。

mkdir volume

起動のための
docker-compose.ymlを用意します。

docker-compose.yml
version: '3'
services:
  ros2java_ubuntu:
    image: theosakamg7/ros2_java_docker:ubuntu
    command: bash -c "/bin/bash"
    tty: true
    stdin_open: true
    volumes:
      - ./volume:/home/travis

コンテナ内に入りましょう。

docker-compose up -d
docker-compose exec ros2java_ubuntu bash 

ビルド作業

amentのビルド

amentとはcmakeベースのビルドツールです。
ROS2をビルドする際に使用します。
まずは作業ディレクトリを作っておきましょう。

cd /home/travis/
mkdir ament_ws/src
cd ament_ws
touch ament_java.repos

ament_java.reposに以下を記述します。

ament_java.repos
repositories:
  ament/ament_cmake:
    type: git
    url: https://github.com/ament/ament_cmake.git
    version: 0.5.1
  ament/ament_index:
    type: git
    url: https://github.com/ament/ament_index.git
    version: 0.5.1
  ament/ament_lint:
    type: git
    url: https://github.com/ament/ament_lint.git
    version: 0.5.2
  ament/ament_package:
    type: git
    url: https://github.com/ament/ament_package.git
    version: 0.5.2
  ament/ament_tools:
    type: git
    url: https://github.com/esteve/ament_tools.git
    version: win32-platform
  ament/googletest:
    type: git
    url: https://github.com/ament/googletest.git
    version: 4b6e624e78ba3d43c1602ffc80478ee7253e0b04
  ament/osrf_pycommon:
    type: git
    url: https://github.com/osrf/osrf_pycommon.git
    version: 0.1.5
  ament/uncrustify:
    type: git
    url: https://github.com/ament/uncrustify.git
    version: 0.66.1
  ament_java/ament_java:
    type: git
    url: https://github.com/esteve/ament_java.git
    version: master

vcsを用いてソースコード一式をダウンロードし、amentをビルドします。
なお、vcsはDocker Imageにプリインストール済みなのでいきなり使えます。

vcs import src < ament_java.repos
src/ament/ament_tools/scripts/ament.py build --symlink-install --isolated

ROS2Javaのビルド

cd /home/travis
mkdir ros2java_ws/src
cd ros2java_ws
touch ros2_java_desktop.repos

公式リポジトリのREADME通りではビルドエラー吐きまくるので、試行錯誤しました。。。
2021/03/13現在以下の依存モジュールのバージョンでビルドできました。
ros2_java_desktop.reposに以下を記述します。

ros2_java_desktop.repos
repositories:
  eProsima/Fast-CDR:
    type: git
    url: https://github.com/eProsima/Fast-CDR.git
    version: v1.0.7
  eProsima/Fast-RTPS:
    type: git
    url: https://github.com/eProsima/Fast-RTPS.git
    version: 7a0b0fe7ca8d2c4ea41e36744c6024c263a6505a
  ros/class_loader:
    type: git
    url: https://github.com/ros/class_loader.git
    version: 1.1.0
  ros/console_bridge:
    type: git
    url: https://github.com/ros/console_bridge.git
    version: ad25f7307da76be2857545e7e5c2a20727eee542
  ros2/console_bridge_vendor:
    type: git
    url: https://github.com/ros2/console_bridge_vendor.git
    version: 1.3.0
  ros2/ament_cmake_ros:
    type: git
    url: https://github.com/ros2/ament_cmake_ros.git
    version: 0.5.0
  ros2/common_interfaces:
    type: git
    url: https://github.com/ros2/common_interfaces.git
    version: 0.5.0
  ros2/example_interfaces:
    type: git
    url: https://github.com/ros2/example_interfaces.git
    version: 0.5.0
  ros2/launch:
    type: git
    url: https://github.com/ros2/launch.git
    version: 0.5.2
  ros2/libyaml_vendor:
    type: git
    url: https://github.com/ros2/libyaml_vendor.git
    version: 1.0.0
  ros2/poco_vendor:
    type: git
    url: https://github.com/ros2/poco_vendor.git
    version: 1.1.1
  ros2/tinydir_vendor:
    type: git
    url: https://github.com/ros2/tinydir_vendor.git
    version: v1.0.0
  ros2/rcl:
    type: git
    url: https://github.com/ros2/rcl.git
    version: 0.5.1
  ros2/rcl_interfaces:
    type: git
    url: https://github.com/ros2/rcl_interfaces.git
    version: 0.5.0
  ros2/rclpy:
    type: git
    url: https://github.com/ros2/rclpy.git
    version: 0.5.3
  ros2/rcutils:
    type: git
    url: https://github.com/ros2/rcutils.git
    version: 0.5.1
  ros2/rmw:
    type: git
    url: https://github.com/ros2/rmw.git
    version: 0.5.0
  ros2/rmw_fastrtps:
    type: git
    url: https://github.com/ros2/rmw_fastrtps.git
    version: 0.5.1
  ros2/rmw_implementation:
    type: git
    url: https://github.com/ros2/rmw_implementation.git
    version: 0.5.1
  ros2/rmw_opensplice:
    type: git
    url: https://github.com/ros2/rmw_opensplice.git
    version: 0.5.2
  ros2/ros2cli:
    type: git
    url: https://github.com/ros2/ros2cli.git
    version: 0.5.3
  ros2/rosidl:
    type: git
    url: https://github.com/ros2/rosidl.git
    version: 0.5.1
  ros2/rosidl_typesupport_opensplice:
    type: git
    url: https://github.com/ros2/rosidl_typesupport_opensplice.git
    version: 0.5.0
  ros2/rosidl_typesupport:
    type: git
    url: https://github.com/ros2/rosidl_typesupport
    version: 0.5.0
  ros2/rosidl_dds:
    type: git
    url: https://github.com/ros2/rosidl_dds.git
    version: 0.5.0
  ros2/rosidl_defaults:
    type: git
    url: https://github.com/ros2/rosidl_defaults.git
    version: 0.5.0
  ros2/rosidl_python:
    type: git
    url: https://github.com/ros2/rosidl_python.git
    version: 0.5.2
  ros2_java/ros2_java:
    type: git
    url: https://github.com/esteve/ros2_java.git
    version: 62918477f4fb8810d4df0ac9c9e67b885b635d01
  ros2_java/ros2_java_examples:
    type: git
    url: https://github.com/esteve/ros2_java_examples.git
    version: 4305e58493bfa37484457b3fe12525cbc0f87319
  ros2/unique_identifier_msgs:
    type: git
    url: https://github.com/ros2/unique_identifier_msgs.git
    version: 2.2.0
  ros2/test_interface_files:
    type: git
    url: https://github.com/ros2/test_interface_files.git
    version: 124823291a0a7d35e983b2e00abc8803ec4cdbb2

ROS2Javaをビルドします。
まだまだ付け焼き刃的な対応が入っているので、追々根本的な調査と修正を行ってから追記する予定です。

vcs import src < ros2_java_desktop.repos
. ../ament_ws/install_isolated/local_setup.sh
# 途中Javaソースコードのコンパイルエラーが起きるので、一旦回避するため変えておく
sed -ie 's/client\.waitForService()/true/' ./src/ros2_java/ros2_java_examples/rcljava_examples/src/main/java/org/ros2/rcljava/examples/client/AddTwoIntsClient.java
# test_msgsだけビルドエラーが消えなかったので一旦スキップ
ament build --symlink-install --isolated --skip-packages test_msgs
. ./install_isolated/local_setup.sh

これでビルドが完了すればros2コマンドが使用できるはずです。

最後に

ここのリポジトリに作業用のワークスペースを作ったので、よかったら使ってみてください。
https://github.com/sho-hama/building_ros2_java

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