20200923のdockerに関する記事は12件です。

WSL2 + Docker + VSCode の環境構築をしてみた

どういう記事か

WSL2 等の詳細については他の方々にお任せするとして、ひとまずインストール等で詰まったこと等をまとめてみました。

私は手順をちゃんと確認せずに困ったりしてたので、公式の手順の後に私が困ったこととかをいくつか書いておきます。(皆さんはドキュメントをちゃんと読むことをお勧めします)

なお、細かい部分等はそれぞれ英語の Docs にはなりますが、やはり公式のを見ていただいた方が良いかと思います。参考資料が目的な方は一番下の参考資料の項目だけご確認いただけたらと存じます。

前提条件

Windows のビルドのバージョンを確認する必要があります。

windows + R でコマンドから実行を開いて以下のコマンドを入力します。

winver

以下のように表示されます。

image.png

このバージョンの値が 1903 以上であることを確認してください。(後ほどまたこのナンバーは関係してきます。)

WSL2 の準備

英語のリンクを以下に用意しましたが、日本語に直したりはしないでください。
というのも、現状(2020/9/23 現在)、英語のドキュメントが先に更新されているので、少し日本語のものと内容が違います。たぶん最近のアップデートがあってそれをまだ日本語では更新していないのかなと思います(2020/9/15 に英語版がアップデートされてます。)

https://docs.microsoft.com/en-us/windows/wsl/install-win10

Power Shell を管理者権限で開いて以下のコマンドを実行します。
以下のコマンドで WSL が有効になります。

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

(もしかしたら先にここで再起動が必要かもです)
次に "仮想マシン プラットフォーム" オプション機能を有効にします。

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

ここで一旦 PC を再起動します。

以下のリンクより msi ファイルを落として実行して Linux のカーネルを更新します。
(ここが日本語の docs だとまだ新しいのになっていなかったのでちょい詰まりました)

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

最後に WSL の規定のバージョンを WSL2 にしておきます。

wsl --set-default-version 2

これで以降に追加される WSL は WSL2 になるのかもです。

Ubuntu の準備

Microsoft Store で Ubuntu を入れます。
image.png

左の 3 つほどから選択でよいかなと思います。
ここでは Ubuntu-20.04 を使ってます。特に理由はありません。

VS Code の準備

拡張機能をインストールしましょう。

image.png

ご希望の linux (Microsoft Store でダウンロードしたもの)を右クリックして「connect WSL」を選択します。
image.png

なんかいけたっぽいです。image.png

以降は WSL 側での操作とかはここからしたりしました。

Docker の準備

以下に沿って進めていきます。
https://docs.docker.com/docker-for-windows/wsl/

最初と同様に winver コマンドを実行して、それぞれのバージョンにあった Docker Desktop をインストールします。
- 1903 以上 : Edge 版
- 2004 以上 : Stable 版

ダウンロード サイト
https://hub.docker.com/editions/community/docker-ce-desktop-windows/

設定から General のページへ移動。

image.png

Use WSL 2 based engine にチェックを入れて Apply & Restart します。

WSL integration とやらの設定をします。
Docker Desktop の設定から以下のような項目をON にして Apply & Restart。
image.png

VSCode で繋いでみたら無事に docker コマンドが打てた!
image.png

詰まったポイント

以前に少しだけ触ってたりでちゃんと完全に公式の順番通りにしなかった結果招いたエラー達(笑)

wsl コマンドが通らない

そもそも wsl コマンドが通らない時がありました。
特に直す際に環境変数の path とかはいじってません。再起動しなおしてみたり、コマンドを再度入れなおしてみたりをしてたらコマンド通るようになりました。なので、どこかの手順が抜けてただけかもですね。

WSL のバージョン

wsl(1) になっていて docker のコマンドが打てない等がありました。(手順をアレしてたせい)
大元のマシンで管理者権限で Powershell を開いて以下のコマンドを打つと

wsl -l -v

こんな感じでバージョンが分かりました。
image.png

もしも狙いの WSL が ver1 だった場合は以下のコマンドで ver を上げましょう。

wsl --set-version Ubuntu-20.04 2

上記のコマンドでは Ubuntu-20.04 のバージョンを WSL2 にしています(上記の画像参照)

詰まった時に確認したポイント

順番通りにやるのはやっぱり(ちゃんと読まない私には)難しいところがあります。
そうなった時にどうしたかをちょろっと書いてみました。

どこ由来のエラー(?)かを当たりをつける

今回は VSCode, Docker Desktop, WSL2 という要素が絡んできてます。
なので、エラーが起きた際に、どれから確認するかが大事でした。
恐らくなんらかのエラーが出ていると思うので、慌てずエラー メッセージを確認しましょう。
(今回は具体的にはエラーメッセから wsl のバージョンが違う等を確認してみることに繋がりました)

公式のドキュメント(できるだけ英語)を信じる

結局、こういう構築関連で公式を参考にしてエラーが出るパターンってやっぱり自分の手順ミスが多いんだなって感じました。なので、どこか抜けてないかエラーメッセージから確認してみる、手順の最初から追いなおしてみる等がなんやかんや有効だなって感じました。

それでも情報がない時には別途エラーメッセージで Web 検索にかけてみるのが良いかなと感じました。

参考資料

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

[初心者]Rails6 Vue Postgres開発環境をDocker-Composeを使って構築する方法

はじめに

Dockerを用いてRails,Vue,Posgre環境下で開発したいなと思った時に、
Rails,Vueの環境作りに手こずりましたので自分のメモとして保存します。

この記事で分かること

・Rails6とVueとPostgresのDocker環境が構築できる
・RailsとVueの連動ができる
・PryにてインスタンスとDBの操作ができる

環境

MacOS Mojave
Ruby 2.6.4
Rails 6.0.3.3
Vue 2.6.12
Webpack 4.44.2
yarn 1.22.5
Docker 2.3.0.5
VScode

Githubのリンク

僕のGithubのDocker-Start-Kitです。よろしければご活用ください。
Whiro0501/Docker_Rails6_Vue

Docker環境をMacに構築

ターミナルを開く
mkdirで任意の名前のディレクトリを作成
cdで作成したディレクトリに移動
code.でVScodeを開く

terminal
mkdir qiita
cd qiita
code .

VScodeが起動
VScode上のターミナルで作業していくので
ターミナルが起動していなければ⬆︎+Control+@でターミナルを開く

VScodeのターミナル上で以下コマンドを入力してリモートリポジトリのファイルをローカルにコピー

VScode
git clone https://github.com/Whiro0501/Docker_Rails6_Vue.git

cdでDocker_Rails6_Vue/ディレクトリに移動

VScode
cd Docker_Rails6_Vue/

以下コマンドを実行してDockerイメージをビルド

VScode
docker-compose build

以下を実行して、必要なノードモジュールを取得

VScode
docker-compose run web yarn install --check-files

以下を実行して DB(Postgres)を作成

VScode
docker-compose run web rake db:create

別のターミナルを開く
以下を実行してレールズアプリケーションを起動

VScode
#別ターミナルが億劫なら、docker-compose up -dでも良い 
docker-compose up

さらに別のターミナルを開く
Viewを更新するたび毎回コンパイルが発生し、時間がかかるため以下を実行

VScode
docker-compose exec web ./bin/webpack-dev-server

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

Railsアプリケーションが起動することを確認

スクリーンショット 2020-09-23 20.42.47.png

VueとRailsの連動ってどうやるの?

初期構築時点ではRailsとVueが連動されておりませんので連動させていく。

以下でhomeコントローラを作成する(コントローラー名はなんでも良い)。

VScode
docker-compose exec web rails g controller home index

index.html.erbが作成

index.html.erb
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

以下ファイルに"root to: 'home#index'"を追加

routes.rb
Rails.application.routes.draw do
  root to:  'home#index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

まずはindex.html.erbに記述されている内容が表示

スクリーンショット 2020-09-23 21.07.31.png

Rails側で下地ができたので、次にVueとの連動の設定
app.vueの初期設定

app.vue
<template>
  <div id="app">
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      message: "Hello Vue!"
    }
  }
}
</script>

<style scoped>
p {
  font-size: 2em;
  text-align: center;
}
</style>

hello_vue.jsの初期設定

hello_vue.js
import Vue from 'vue'
import App from '../app.vue'

document.addEventListener('DOMContentLoaded', () => {
  const app = new Vue({
    render: h => h(App)
  }).$mount()
  document.body.appendChild(app.$el)

  console.log(app)
})

app.vueが単一ファイルコンポーネントであり、
hello_vue.jsにオブジェクトとして渡される。
それをindex.html.erbに表示させるよう設定する。

index.html.erbを以下の通り設定

index.html.erb
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

<%= javascript_pack_tag 'hello_vue.js' %>
<%= stylesheet_pack_tag 'hello_vue.js' %>

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

Vueとの連動が完了!!

スクリーンショット 2020-09-23 21.23.06.png

Githubののファイルの説明

Whiro0501/Docker_Rails6_Vue
まず上記リンクのGithubの状態から説明する
端的に説明すると以下2つを設定した後の状態となる
従ってRails6とVueとPostgresが使用できる環境を整えることができるという理屈である。

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

加えて上記の状態だとPostgresがうまくRailsと連動できないため以下のように設定する。
こちらも公式ドキュメントを参考とした。

database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test


production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

Dockerfile

公式ドキュメントのベストプラクティスを参照にした。
DockerはFROM, RUN, COPY毎にレイヤーが作成されるため
RUNやCOPYはできるだけまとめると少ないレイヤーで収めることができるとのこと。

Dockerfile
FROM ruby:2.6

# `apt-get install yarn`とするとエラーになる
# プロジェクトに必要なツールをインストール
# &&で繋げてコマンドを実行することによりレイヤーを1つとする
#apt-get update と apt-get installは同一RUN上で行う(分けると最新版を使用できない)
#RUNはイメージの作成次に実行(CMDはコンテナ起動時に実行)
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update -qq && apt-get install -y nodejs postgresql-client vim && \
    apt-get install -y yarn

# ディレクトリの作成
RUN mkdir /myapp

# 作業ディレクトリの指定
#RUN ,  COPY,  ADD 命令のみレイヤを作成するためWORKDIRは気にしなくて良い
# 絶対パスとする
WORKDIR /myapp

# Gemfileが更新された時のみ、レイヤを再構築
#先にプロジェクト全体をコピーしないのはレイヤーを分けるため
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
# ライブラリの依存関係をインストール
RUN bundle install

# プロジェクト全体をコピー(Gemfile/Gemfile.lockはコピーされない)
COPY . /myapp

#コンテナを起動する毎に実行されるスクリプトを追加
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

#コンテナの公開ポート番号の指定
EXPOSE 3000

#指定しなければコンテナ起動時にデフォルトで実行する処理
#Dockerfile では CMD 命令を 1 つしか記述できない
#ENTRYPOINT 命令に対するデフォルト引数としてCMDを使用可能
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose

docker-compose.ymlもDocker公式ドキュメントを参考にした。

docker-compose.yml
version: '3'
services:
    db:
        # DBにpostgresを使用
        image: postgres
        # ホストの./tmp/dbと/var/lib/postgresql/dataを同期させる
        volumes:
            - ./tmp/db:/var/lib/postgresql/data
        # 環境変数の指定
        environment:
            POSTGRES_PASSWORD: password
    web:
        build: .
        # コンテナ起動時にserver.pidを削除し、rails sを実行する
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
        # ホストのカレントディレクトリをコンテナの/myappと同期させる
        volumes:
            - .:/myapp
        # ホストとコンテナ間をポートフォワードする
        ports:
            - '3000:3000'
        # サービス間の依存関係
        depends_on:
            - db
        # Docker環境でByebugを使用
        stdin_open: true
        tty: true

Gemfile

Gemfileに関してはデフォルトで入っているもの主となる。
追加したパッケージはコメントしているため不要であれば削除して構わない

Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }


ruby '2.6.6'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.3', '>= 6.0.3.3'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 4.1'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  #デバックツールの導入
  gem 'pry-rails'
  gem 'pry-byebug'
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '~> 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  #自動補完用ツールの導入
  gem 'solargraph'
  #静的コード解析ツールの導入
  gem 'rubocop'
  gem 'rubocop-rails'
  #erbのフォーマットツールの導入
  gem 'htmlbeautifier'
end

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

package.json

package.jsonについてはvue-routerとvuexを使いたいため追加している
Vuetify等、UIフレームワークを使用したいようであれば追加する。

package.json
{
    "name": "myapp",
    "private": true,
    "dependencies": {
        "@rails/actioncable": "^6.0.0",
        "@rails/activestorage": "^6.0.0",
        "@rails/ujs": "^6.0.0",
        "@rails/webpacker": "4.3.0",
        "turbolinks": "^5.2.0",
        "vue": "^2.6.12",
        "vue-loader": "^15.9.3",
        "vue-template-compiler": "^2.6.12",
        "vue-router": "^3.0.1",
        "vuex": "^3.0.1"
    },
    "version": "0.1.0",
    "devDependencies": {
        "webpack-dev-server": "^3.11.0"
    }
}

Railsでデバッグする

VScode上のターミナルを開く
以下をターミナルで実行

VScode
docker-compose exec web rails console

pry が起動

VScode
[1] pry(main)> 

postコントローラーを作成

docker-compose exec web rails g controller post index

post_controller.rbを修正

post_controller.rb
class PostController < ApplicationController
  def index
    @post = Post.all
  end
end

postのモデルを作成

VScode
docker-compose exec web rails g model post name:string age:integer

DBにモデルを反映させる

VScode
docker-compose exec web rails db:migrate

index.html.erbを以下に書き換え

index.html.erb
<%= @post.name %>
<%= @post.age %>

routes.rbを以下に修正

routes.rb
Rails.application.routes.draw do
  root to:  'post#index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

pryでPostモデルのインスタンスを作成

VScode
@post = Post.new
=> #<Post:0x00005589bc4beb78 id: nil, name: nil, age: nil, created_at: nil, updated_at: nil>

#まだnameやageにはデータを入れていない
#DBに保存もされていない
Post.all
=>   Post Load (2.2ms)  SELECT "posts".* FROM "posts"
[]

#DBにインスタンスを保存する
@post.save
   (0.7ms)  BEGIN
  Post Create (5.9ms)  INSERT INTO "posts" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", "2020-09-23 13:06:47.962085"], ["updated_at", "2020-09-23 13:06:47.962085"]]
   (3.1ms)  COMMIT
=> true

#もう一度Post.allをしてデータをDBから取得すると保存したインスタンスが呼び出される
Post.all
=>   Post Load (2.2ms)  SELECT "posts".* FROM "posts"
[#<Post:0x00005589bceec5f0
  id: 1,
  name: nil,
  age: nil,
  created_at: Wed, 23 Sep 2020 13:06:47 UTC +00:00,
  updated_at: Wed, 23 Sep 2020 13:06:47 UTC +00:00>]

#@postインスタンスにデータを入れてみる
@post.name = "Hiro"
=> "Hiro"

@post.age = "29"
=> "29"

#再び保存
@post.save
Post Update (4.0ms)  UPDATE "posts" SET "name" = $1, "updated_at" = $2 WHERE "posts"."id" = $3  [["name", "Hiro"], ["updated_at", "2020-09-23 13:10:26.486888"], ["id", 1]]
Post Update (2.0ms)  UPDATE "posts" SET "age" = $1, "updated_at" = $2 WHERE "posts"."id" = $3  [["age", 29], ["updated_at", "2020-09-23 13:10:56.785029"], ["id", 1]]
   (1.0ms)  COMMIT
=> true

#データが保存されている
Post.all
=>   Post Load (1.4ms)  SELECT "posts".* FROM "posts"
[#<Post:0x00007f1ddc7a77a8
  id: 1,
  name: "Hiro",
  age: 29,
  created_at: Wed, 23 Sep 2020 13:06:47 UTC +00:00,
  updated_at: Wed, 23 Sep 2020 13:10:56 UTC +00:00>]

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

以下のようにDBからデータを取得できればOK

スクリーンショット 2020-09-23 22.27.01.png

Binding.pryを試してみる

post_controller.rbを修正

class PostController < ApplicationController
  def index
    binding.pry
    @post = Post.all
  end
end

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

以下の画面でフリーズする(正しい挙動)
スクリーンショット 2020-09-23 22.30.19.png

pryのターミナルに戻る

pry(main)> 

以上で、pryでデバッグする環境が整った

参考

以下のサイトを参考にさせていただきました。
Docker ドキュメント日本語化プロジェクト
クィックスタート: Compose と Rails
Dockerfile のベストプラクティス
Webpacker の基本的な仕組み
Dockerを使って「Rails / PostgreSQL」の開発環境を作ろう!

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

Rails6 Vue Postgres開発環境をDocker-Composeを使って構築する方法

はじめに

Dockerを用いてRails,Vue,Posgre環境下で開発したいなと思った時に、
Rails,Vueの環境作りに手こずりましたので自分のメモとして保存します。

この記事で分かること

・Rails6とVueとPostgresのDocker環境が構築できる
・RailsとVueの連動ができる
・PryにてインスタンスとDBの操作ができる

環境

MacOS Mojave
Ruby 2.6.4
Rails 6.0.3.3
Vue 2.6.12
Webpack 4.44.2
yarn 1.22.5
Docker 2.3.0.5
VScode

Githubのリンク

僕のGithubのDocker-Start-Kitです。よろしければご活用ください。
Whiro0501/Docker_Rails6_Vue

Docker環境をMacに構築

ターミナルを開く
mkdirで任意の名前のディレクトリを作成
cdで作成したディレクトリに移動
code.でVScodeを開く

terminal
mkdir qiita
cd qiita
code .

VScodeが起動
VScode上のターミナルで作業していくので
ターミナルが起動していなければ⬆︎+Control+@でターミナルを開く

VScodeのターミナル上で以下コマンドを入力してリモートリポジトリのファイルをローカルにコピー

VScode
git clone https://github.com/Whiro0501/Docker_Rails6_Vue.git

cdでDocker_Rails6_Vue/ディレクトリに移動

VScode
cd Docker_Rails6_Vue/

以下コマンドを実行してDockerイメージをビルド

VScode
docker-compose build

以下を実行して、必要なノードモジュールを取得

VScode
docker-compose run web yarn install --check-files

以下を実行して DB(Postgres)を作成

VScode
docker-compose run web rake db:create

別のターミナルを開く
以下を実行してレールズアプリケーションを起動

VScode
#別ターミナルが億劫なら、docker-compose up -dでも良い 
docker-compose up

さらに別のターミナルを開く
Viewを更新するたび毎回コンパイルが発生し、時間がかかるため以下を実行

VScode
docker-compose exec web ./bin/webpack-dev-server

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

Railsアプリケーションが起動することを確認

スクリーンショット 2020-09-23 20.42.47.png

VueとRailsの連動ってどうやるの?

初期構築時点ではRailsとVueが連動されておりませんので連動させていく。

以下でhomeコントローラを作成する(コントローラー名はなんでも良い)。

VScode
docker-compose exec web rails g controller home index

index.html.erbが作成

index.html.erb
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

以下ファイルに"root to: 'home#index'"を追加

routes.rb
Rails.application.routes.draw do
  root to:  'home#index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

まずはindex.html.erbに記述されている内容が表示

スクリーンショット 2020-09-23 21.07.31.png

Rails側で下地ができたので、次にVueとの連動の設定
app.vueの初期設定

app.vue
<template>
  <div id="app">
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      message: "Hello Vue!"
    }
  }
}
</script>

<style scoped>
p {
  font-size: 2em;
  text-align: center;
}
</style>

hello_vue.jsの初期設定

hello_vue.js
import Vue from 'vue'
import App from '../app.vue'

document.addEventListener('DOMContentLoaded', () => {
  const app = new Vue({
    render: h => h(App)
  }).$mount()
  document.body.appendChild(app.$el)

  console.log(app)
})

app.vueが単一ファイルコンポーネントであり、
hello_vue.jsにオブジェクトとして渡される。
それをindex.html.erbに表示させるよう設定する。

index.html.erbを以下の通り設定

index.html.erb
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

<%= javascript_pack_tag 'hello_vue.js' %>
<%= stylesheet_pack_tag 'hello_vue.js' %>

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

Vueとの連動が完了!!

スクリーンショット 2020-09-23 21.23.06.png

Githubののファイルの説明

Whiro0501/Docker_Rails6_Vue
まず上記リンクのGithubの状態から説明する
端的に説明すると以下2つを設定した後の状態となる
従ってRails6とVueとPostgresが使用できる環境を整えることができるという理屈である。

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

加えて上記の状態だとPostgresがうまくRailsと連動できないため以下のように設定する。
こちらも公式ドキュメントを参考とした。

database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test


production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

Dockerfile

公式ドキュメントのベストプラクティスを参照にした。
DockerはFROM, RUN, COPY毎にレイヤーが作成されるため
RUNやCOPYはできるだけまとめると少ないレイヤーで収めることができるとのこと。

Dockerfile
FROM ruby:2.6

# `apt-get install yarn`とするとエラーになる
# プロジェクトに必要なツールをインストール
# &&で繋げてコマンドを実行することによりレイヤーを1つとする
#apt-get update と apt-get installは同一RUN上で行う(分けると最新版を使用できない)
#RUNはイメージの作成次に実行(CMDはコンテナ起動時に実行)
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update -qq && apt-get install -y nodejs postgresql-client vim && \
    apt-get install -y yarn

# ディレクトリの作成
RUN mkdir /myapp

# 作業ディレクトリの指定
#RUN ,  COPY,  ADD 命令のみレイヤを作成するためWORKDIRは気にしなくて良い
# 絶対パスとする
WORKDIR /myapp

# Gemfileが更新された時のみ、レイヤを再構築
#先にプロジェクト全体をコピーしないのはレイヤーを分けるため
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
# ライブラリの依存関係をインストール
RUN bundle install

# プロジェクト全体をコピー(Gemfile/Gemfile.lockはコピーされない)
COPY . /myapp

#コンテナを起動する毎に実行されるスクリプトを追加
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

#コンテナの公開ポート番号の指定
EXPOSE 3000

#指定しなければコンテナ起動時にデフォルトで実行する処理
#Dockerfile では CMD 命令を 1 つしか記述できない
#ENTRYPOINT 命令に対するデフォルト引数としてCMDを使用可能
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose

docker-compose.ymlもDocker公式ドキュメントを参考にした。

docker-compose.yml
version: '3'
services:
    db:
        # DBにpostgresを使用
        image: postgres
        # ホストの./tmp/dbと/var/lib/postgresql/dataを同期させる
        volumes:
            - ./tmp/db:/var/lib/postgresql/data
        # 環境変数の指定
        environment:
            POSTGRES_PASSWORD: password
    web:
        build: .
        # コンテナ起動時にserver.pidを削除し、rails sを実行する
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
        # ホストのカレントディレクトリをコンテナの/myappと同期させる
        volumes:
            - .:/myapp
        # ホストとコンテナ間をポートフォワードする
        ports:
            - '3000:3000'
        # サービス間の依存関係
        depends_on:
            - db
        # Docker環境でByebugを使用
        stdin_open: true
        tty: true

Gemfile

Gemfileに関してはデフォルトで入っているもの主となる。
追加したパッケージはコメントしているため不要であれば削除して構わない

Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }


ruby '2.6.6'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.3', '>= 6.0.3.3'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 4.1'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  #デバックツールの導入
  gem 'pry-rails'
  gem 'pry-byebug'
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '~> 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  #自動補完用ツールの導入
  gem 'solargraph'
  #静的コード解析ツールの導入
  gem 'rubocop'
  gem 'rubocop-rails'
  #erbのフォーマットツールの導入
  gem 'htmlbeautifier'
end

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

package.json

package.jsonについてはvue-routerとvuexを使いたいため追加している
Vuetify等、UIフレームワークを使用したいようであれば追加する。

package.json
{
    "name": "myapp",
    "private": true,
    "dependencies": {
        "@rails/actioncable": "^6.0.0",
        "@rails/activestorage": "^6.0.0",
        "@rails/ujs": "^6.0.0",
        "@rails/webpacker": "4.3.0",
        "turbolinks": "^5.2.0",
        "vue": "^2.6.12",
        "vue-loader": "^15.9.3",
        "vue-template-compiler": "^2.6.12",
        "vue-router": "^3.0.1",
        "vuex": "^3.0.1"
    },
    "version": "0.1.0",
    "devDependencies": {
        "webpack-dev-server": "^3.11.0"
    }
}

Railsでデバッグする

VScode上のターミナルを開く
以下をターミナルで実行

VScode
docker-compose exec web rails console

pry が起動

VScode
[1] pry(main)> 

postコントローラーを作成

docker-compose exec web rails g controller post index

post_controller.rbを修正

post_controller.rb
class PostController < ApplicationController
  def index
    @post = Post.all
  end
end

postのモデルを作成

VScode
docker-compose exec web rails g model post name:string age:integer

DBにモデルを反映させる

VScode
docker-compose exec web rails db:migrate

index.html.erbを以下に書き換え

index.html.erb
<%= @post.name %>
<%= @post.age %>

routes.rbを以下に修正

routes.rb
Rails.application.routes.draw do
  root to:  'post#index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

pryでPostモデルのインスタンスを作成

VScode
@post = Post.new
=> #<Post:0x00005589bc4beb78 id: nil, name: nil, age: nil, created_at: nil, updated_at: nil>

#まだnameやageにはデータを入れていない
#DBに保存もされていない
Post.all
=>   Post Load (2.2ms)  SELECT "posts".* FROM "posts"
[]

#DBにインスタンスを保存する
@post.save
   (0.7ms)  BEGIN
  Post Create (5.9ms)  INSERT INTO "posts" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", "2020-09-23 13:06:47.962085"], ["updated_at", "2020-09-23 13:06:47.962085"]]
   (3.1ms)  COMMIT
=> true

#もう一度Post.allをしてデータをDBから取得すると保存したインスタンスが呼び出される
Post.all
=>   Post Load (2.2ms)  SELECT "posts".* FROM "posts"
[#<Post:0x00005589bceec5f0
  id: 1,
  name: nil,
  age: nil,
  created_at: Wed, 23 Sep 2020 13:06:47 UTC +00:00,
  updated_at: Wed, 23 Sep 2020 13:06:47 UTC +00:00>]

#@postインスタンスにデータを入れてみる
@post.name = "Hiro"
=> "Hiro"

@post.age = "29"
=> "29"

#再び保存
@post.save
Post Update (4.0ms)  UPDATE "posts" SET "name" = $1, "updated_at" = $2 WHERE "posts"."id" = $3  [["name", "Hiro"], ["updated_at", "2020-09-23 13:10:26.486888"], ["id", 1]]
Post Update (2.0ms)  UPDATE "posts" SET "age" = $1, "updated_at" = $2 WHERE "posts"."id" = $3  [["age", 29], ["updated_at", "2020-09-23 13:10:56.785029"], ["id", 1]]
   (1.0ms)  COMMIT
=> true

#データが保存されている
Post.all
=>   Post Load (1.4ms)  SELECT "posts".* FROM "posts"
[#<Post:0x00007f1ddc7a77a8
  id: 1,
  name: "Hiro",
  age: 29,
  created_at: Wed, 23 Sep 2020 13:06:47 UTC +00:00,
  updated_at: Wed, 23 Sep 2020 13:10:56 UTC +00:00>]

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

以下のようにDBからデータを取得できればOK

スクリーンショット 2020-09-23 22.27.01.png

Binding.pryを試してみる

post_controller.rbを修正

class PostController < ApplicationController
  def index
    binding.pry
    @post = Post.all
  end
end

Webブラウザで以下にアクセス

Webブラウザ
http://localhost:3000

以下の画面でフリーズする(正しい挙動)
スクリーンショット 2020-09-23 22.30.19.png

pryのターミナルに戻る

pry(main)> 

以上で、pryでデバッグする環境が整った

参考

以下のサイトを参考にさせていただきました。
Docker ドキュメント日本語化プロジェクト
クィックスタート: Compose と Rails
Dockerfile のベストプラクティス
Webpacker の基本的な仕組み
Dockerを使って「Rails / PostgreSQL」の開発環境を作ろう!

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

Ubuntu Server 20.04 に Docker をインストールする

環境

macOS 上で動く仮想マシン(Ubuntu Server 20.04)に Docker を入れます。基本的には、公式ガイドに記載のとおりに入れていきます。

  • macOS Catalina 10.15.6 (Intel Core i7 3.2GHz, 32GB DDR4)
  • VirtualBox 6.1.14
  • Ubuntu Server 20.04.1 LTS(ゲストOS)
  • Docker 19.03.13
  • Docker Compose 1.27.3

ちなみに、なんで Mac に直接 Docker を入れないかというと、「Docker for Mac は遅い!」と悪名が高いらしいから。

手順

私の場合、SSH で tonga(ゲストOSのホスト名)と bali(同じくゲストOSのホスト名)に接続して、次の作業を行いました(参考:ホスト名に南の島の名前を付けるとおもしろいよ

レポジトリの設定

update でパッケージインデクスを更新してから、apt が HTTPS 経由でレポジトリを使えるようにします。

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

次に、Docker 公式の GPG 鍵を apt に追加します。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

フィンガープリントが正しいかどうか、一応確認しておきましょう。
下記のとおり 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 が表示されたら OK です。

$ sudo apt-key fingerprint 0EBFCD88

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

次に、stable のレポジトリを apt に追加します。

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Docker CE のインストール

Docker CE と containerd の最新版をインストールします。
先ほどレポジトリを追加しているので、update を忘れずに。

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

Hello World のコンテナを走らせて、下記のように表示されたら成功です。

$ sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

簡単に翻訳すると次のとおり。

Docker へようこそ!
このメッセージが見えているなら、インストールはうまくいっています。

このメッセージを出力するために、Docker は次のステップを踏んでいます。
1. Docker クライアントが Docker デーモンに接続する。
2. Docker デーモンが DockerHub から "hello-world" イメージを取得する。
3. 取得したイメージが、あなたがいま見ている出力を生成する実行ファイルを走らせ、
  Docker デーモンが、このイメージから新しいコンテナを作成する。
4. Docker デーモンが、この出力を Docker クライアントに渡し、
  Docker クライアントが、あなたのターミナルにこの出力を送る。

なんのこっちゃよく分かりませんが、要するに、ユーザとのインターフェースである Docker クライアントと Docker デーモンとが通信し、Docker デーモンが指定されたイメージからコンテナを作って走らせ、クライアント経由でその結果を見せているよ、というところでしょうか。

一般ユーザで Docker を使えるようにする

Docker のインストールに成功したなら、Docker のグループが作られているはずなので、まずはそれを確認します。

$ cat /etc/group | grep docker
docker:x:998:

「docker」グループに自分自身を追加します。

$ sudo usermod -aG docker hajime-f

ログインしなおせば、sudo しなくても、$ docker run hello-world が走るようになっているはず。

Docker Compose のインストール

GitHub から Docker Compose の安定版をダウンロードします。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" \
>    -o /usr/local/bin/docker-compose

Docker Compose に実行権限を付与します。

$ sudo chmod +x /usr/local/bin/docker-compose

やれやれ。これでようやく Docker が使える。
次は Dockerfile でも書いて遊んでみよう。

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

【自分用メモ】Dockerでつまったことを振り返る...Linuxの知識も含む

目的

docker pushを拒否されたので、それを回避しようとしたことを振り返ります。

結論

docker tagでイメージ名を変更したところ、docker pushできた。

docker pushしようとしてもdocker tagでイメージ名を変更しても同事象でした。
「docker ps -a」で確認すると、COMMAND欄が"python3"となっているものが複数ありました。
docker push できないのはこれが原因なのかもと思いました。
「docker ps -a」でCOMMAND欄に表示されるのはdockerコンテナのプロセス名ということがこちらを参考にさせて頂き、わかりました。
下記の記事を参考にプロセスをkillすればpython3から変えられるかもしれないと考えました。
プロセスを終了するkillコマンドの使い方まとめ!【Linux ...
【ps・kill】実行中のプロセス表示と強制終了 - Qiita
dokcerのshell接続するとpython3になっているのは「ps -a」とコマンドを打つとPID1であることがわかりました。
PID1に対して、pkill1としてもプロセスをkillできませんでした。
Docker で node.js を動かすときは PID 1 にしてはいけない ...
Docker/Kubernetes で PID 1 問題を回避する | text ...
上記の記事を参考にさせて頂き、PID 1 問題ということがわかり「docker run --rm -d --init」コマンドでpython3がPID 28とかPID 1 以外で起動させることができました。
「pkill 28(PID)」とかコマンドを打つと、python3のプロセスを終了させることができました。
ここで、「docker ps -a」のコマンドでCOMMAND欄を確認しましたが、"python3"の表記は消えませんでした。
【備忘録】docker pushしたら拒否された - Qiita
上記の記事を参考にさせて頂き、「docker commit」コマンドでansible-baseをインストールしたイメージを作成しました。
コンテナイメージをDockerHubにpushして共有する ...
上記の記事を参考にさせて頂き、「docker tag」コマンドで「ユーザ名/ansible-base」という名前のイメージを作成し「docker push」することができました。

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

OpenVINO の名付け有り顔認識デモを Docker でそのまま使うだけ

前は interactive_face_detection_demo を動かしましたが、同様に face_recognition_demo を動かします。OpenVINO 2020.3 にはあったデモですが、OpenVINO 2020.4 には入ってなさそうでした。なので 2020.3 で実行します。

output-palette.gif

Docker で実行

2020.4 にしたり 2020.3 にしたりが便利なので Docker で実行します。(GUI を操作するのが大変そうなため、Google Colab では試していません。)

X11 サーバのインストール

このデモは不明な顔が出た時、名前を入力するとその場で顔画像と共に保存される機能があります。GUI から入力するため、Docker から窓を立ち上げられるよう設定します。

今回はホスト OS (Windows 10) 側で X11 サーバを立ち上げ、コンテナ (Ubuntu 18) の窓を Windows 10 上に飛ばせるようにしました。Windows 10 なので、VcXsrv の 1.20.8.1 をインストール・起動し、Windows ファイアウォールの設定でプライベートネットワークを許可しておきました。docker コンテナからホスト OS への接続アドレスは localhost ではないので、ipconfig で確認しておきます。

ipconfig
~~~
イーサネット アダプター vEthernet (WSL):

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::6ca1:e659:80eb:a804%18
   IPv4 アドレス . . . . . . . . . . . .: 172.25.64.1 (ココが DISPLAY 接続先)
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .:

上記の例だと 172.25.64.1 が DISPLAY 接続先になります。

Docker 起動・デモの実行

docker run \
  -v /c/Users/${USER}/Downloads:/Downloads \
  -u root \
  -it \
  --rm \
  -e DISPLAY=172.25.64.1:0.0 \
  openvino/ubuntu18_dev:2020.3

172.25.64.1 の部分は↑↑で確認したアドレスです。ライブラリの追加やビルドは不要なため、root じゃなくても動くかもですが、モデルパス等を前回同様にしたかったので root になっています。2020.4 にないデモなので 2020.3 を立ち上げています。

以下コンテナ内で作業

${INTEL_CVSDK_DIR}/deployment_tools/tools/model_downloader/downloader.py \
  --name face-detection-retail-0004,landmarks-regression-retail-0009,face-reidentification-retail-0095 \
  --output_dir /content/model/ \
  --precisions FP32

face_recognition_demo で使いたい学習済モデルを、付属のダウンローダーで落としてきます。

mkdir -p /Downloads/face_gallery/
cd ${INTEL_CVSDK_DIR}/inference_engine/demos/python_demos/face_recognition_demo/
python3 ./face_recognition_demo.py \
  -m_fd /content/model/intel/face-detection-retail-0004/FP32/face-detection-retail-0004.xml \
  -m_lm /content/model/intel/landmarks-regression-retail-0009/FP32/landmarks-regression-retail-0009.xml \
  -m_reid /content/model/intel/face-reidentification-retail-0095/FP32/face-reidentification-retail-0095.xml \
  --input /Downloads/input.mp4 \
  --output /Downloads/output.mp4 \
  -fg /Downloads/face_gallery/ \
  --allow_grow

Python なのでビルドは不要です。また、マニュアルに pip3 install -r requirements.txt の記載がありますが、依存モジュールも既に入っているので不要でした。起動後、--allow_grow をつけているので、不明な顔があれば適宜訊かれるようになります。その際、顔画像は face_gallery に保存されます。

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

ECSでEC2インスタンスを使う

FargateでのECSの方が上手くいったので、今度はEC2インスタンスを用意しようとおもった。
けど、なぜか情報が少なくて一筋縄ではいかなかったのでまとめて見る

Amazon ECS Container Instance IAM Role

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html

  • コンテナインスタンスを起動して、ECSクラスターに登録する前にサービスを起動するためのIAMロールを作る必要がある
  • Amazon ECS-optimized AMI でコンテナが作られている前提
  • ecsInstsanceRole がIAMロールに見つからなければそれを作る!
    • ロールを作成
    • AWSサービスロールタイプを選択し、 Elastic Container Service をさらに選択
    • ユースケースの選択から「EC2 Role for Elastic Container Service」を選択して、次のステップへ
      • image.png
    • 「AmazonEC2ContainerServiceforEC2Role」を選択して、次のステップへ
    • ロール名を ecsInstanceRole としてロールの作成を完了させる
    • S3のフルアクセスが必要なので、ecsInstanceRoleを選択し、ポリシーの追加で「AmazonS3FullAccess」をアタッチする

ECSコンテナを作成

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html

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

開発未経験エンジニアのための開発業務に携わるためのプロジェクト

概要

未経験のエンジニアの方でどうやったら開発に業務に携われることができるかご相談を受けました。相談に対して回答していく中で2人で一緒に何か作っていこうという話になり、それ自体をプロジェクトとして発足しました。

最初に結論から申し上げるとこのプロジェクトの取り組みによって無事に開発現場が決まりました。継続的に活動を続けていくことで1つの成果となり、それらの記録として残すためQiitaの記事としてまとめようと思いました。

なぜプロジェクトとして発足したのか?

今回の場合は未経験のエンジニアの方で目標設定も定めづらそうなイメージがありました。こちらから提案してもよいのですが、できるだけご自身の目標にあったテーマを一緒に考えてモノづくりを取り組むようにしました。

また取り組む際の考え方も一緒に共有できればと考えました。もちろんペアプログラミングなどで技術的なことは共有はしますが、技術だけでなく解決に至るまでの考え方を一緒に共有し、エンジニアとしてお互いに考える力を伸ばすことを大切にしました。

開発手法だけでなく問題に対する解決方法など総合的に取り組むためにプロジェクトとして発足しました。

8/9(水):インセプションデッキの作成

図1.png

まずはプロジェクトとして目標の設定や何をやるべきか方向を定めるため、
Google Drawingでインセプションデッキを作成しました。
実際には2人だけのプロジェクトになるため、できるかぎり未経験のエンジニアの方にアウトプットしてもらえるようにテーマを考えて、2人が同じ方向を向けるように準備します。

キャリアパスのインセプションデッキ (1).png

インセプションデッキの流れ

将来の目標設定

まずは将来の目標をブレストで出していただきました。直近の目標や今後どうしていきたいのか理想像などを書き出してもらい、それらを整理して紐づけることでアプローチ方法を探っていきます。

目標設定からのやりたいこと・やらないといけないこと

「Javaの成果物を作ろう」ということから更に必要なことを相談しながら案を出し合いながらチャレンジすべき内容を決めていきました。

技術的解決策:具体的にやること

具体的に使用する技術を記載しています。Javaの資格をお持ちとのことでJavaを活かすためにSpringを中心にDockerを使ったコンテナを用いたサービスを作ることになりました。

またエンジニアとしてどういったことをPRすべきか伝えるために、ポートフォリオの作成もやることとして設定しました。

ただしポートフォリオはストレッチゴールで成果物ができてから取り組むことにしました。

伝えたかったこと

2人で同じ問題に対して考えて整理することで具体的なやることまで導くことができました。この考えるということ自体が開発における業務でも必要になる場合があると思っています。

自分で解決案を提案してみたり、その提案を他の人と相談しつつよりよい行動に移すことで、1人のエンジニアが組織として動くことができそうです。

8/10(月)~8/16(日):開発環境の構築

図2.png

8/10(月)以降から21:00~24:00にかけてペアプログラミングで作業しました。まずは開発環境の構築でdocker-composeを使ってSpringの基盤を準備しました。

ここらへんの知識はペアプログラミングで全体の構成などを伝えながらメリットとデメリットを共有しました。Springについてはeclipseでガッチリ環境を作ってもよかったのですが、コンテナ化してどこでも動かせるようにしました。

eclipseの場合で環境がおかしくなった場合はお互いの環境で再現できないことも考えられたため、コンテナですぐに環境を構築できるように進めました。

なお、課題管理などはGitLabを使用してIssueとして管理しMerge Requestも使うようにしました。開発からある程度は経過していますが以下の場所で公開されています。

https://gitlab.com/vorwort.k/yasuda-spring

8/17(月)~8/23(日):サービスの構築

図3.png

インセプションデッキでできるだけシンプルなモノを作ることになっています。今回はチャットアプリのようなモノを作っていきます。

実際に開発を進める上でSpringのコンテナをわざわざ起動しなおす必要があったり開発の手間が掛かっていました。
そういった手間もできるだけ改善するように取り組み、今回の場合ではソースのディレクトリとSpringのコンテナの中を同期させ、Gradleで自動的に再ビルドするように対応しました。そのようなナレッジはプロジェクトのReadme.mdに追記して記録するようにしました。

開発や業務において問題に感じていることを改善することで今後のパフォーマンスに大きく影響するため、自分なりに何かアイデアがあれば話してみて取り組むと喜ばれることを共有しました。

週末にはおおよそのチャットアプリが完成したため週末に振り返りを行い、ポートフォリオの作成の準備を進めました。

8/23(日):振り返り

振り返りはKPTで行いました。ここでProblemとしてあがったのがペアプロでドライバーが変わったときに楽しくなってガツガツ勝手につくっちゃうことがあったので注意が必要だと思いました。
あと全体の構成などを共有する際に理解するのに時間が掛かっているようで、ゆっくりと消化する時間は必要だなと感じています。

8_23(日) 振り返り (1).png

ポートフォリオを作成しようということなり、振り返りとは別に実際に学んだことを書き出してもらうことにしました。ポートフォリオの材料にできればと考えて書き出してもらいました。

学んだことを整理する

上記の全体の構成などに理解するのに苦労しているようなので、これまで学んだ技術などを書き出してもらい整理してもらいました。今回はシンプルなチャットアプリサービスですが、実際に使った技術はいろいろとあることがわかります。

Springの学習における振り返り (1).png

上記の図があるだけでポートフォリオができるまでの間、成果物に関する全体構成や学んでいる技術を伝えることができます。来週からポートフォリオの作成に入りますが、作成している期間も企業にPRするための資料として利用できます。

ここでポートフォリオの作成がストレッチゴールに設定したことが効いてきそうです。

8/24(月)~8/30(日):ポートフォリオの作成

図4.png

上記の学んだことを整理した図を元にポートフォリオを作成します。ここで大事なのは自分で作成して自分で説明できるモノを作り上げることです。人と相談していろいろとコンテンツを入れることはできますが、面談などで自分の口で説明できるポートフォリオでないと、自分の武器にならないので注意が必要です。

作成していただいたポートフォリオ

https://yasu-portfolio.netlify.app/

2人で効果的なポートフォリオを考える

基本的には中身については1人で考えてもらい改善点などはアイデア程度でお伝えしました。またアイデアもできるだけ複数案出して自分で選んでもらうようにしました。この手法自体もポートフォリオを作った経緯として別の資料として作成しました。

エンジニアがポートフォリオを作った経緯 (1).png

エンジニアがポートフォリオを作った経緯 (2).png

総評

2人でプロジェクトとして発足してやり切ることがよかったと思います。まずはインセプションデッキで同じ方向を向くことで、やりたいことなどのすれ違いなどがなくなりました。また定期的にペアプロの時間を設けることで考え方なども共有できることがお互いの成長につながったと思います。自分としては相手に伝える上で伝え方などが難しく、できるだけ具体例などを用いて説明するように工夫しました。

一緒に2人で考えるということは2人で同じ問題に取り組むことになるので、その解決におけるプロセスの経験は何事にも代えがたいモノになったと思います。

今回は無事にポートフォリオの作成まで達成することができ、それによって無事に開発の現場が決まったということもお伺いしました。特にSESの営業担当からポートフォリオがあるだけでPRしやすいのは事実で、エンジニアが事前に準備できる武器としては有効だと思います。

9月は9月で上記のプロジェクトを継承して別のプロジェクトとして継続しております。こちらの内容については別の記事で投稿しようと思います。

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

開発未経験のエンジニアでも開発業務に就くことができたプロジェクト

概要

未経験のエンジニアの方でどうやったら開発に業務に携われることができるかご相談を受けました。相談に対して回答していく中で2人で一緒に何か作っていこうという話になり、それ自体をプロジェクトとして発足しました。

最初に結論から申し上げるとこのプロジェクトの取り組みによって無事に開発業務が決まりました。継続的に活動を続けていくことで1つの成果となり、それらの記録として残すためQiitaの記事としてまとめようと思いました。

なぜプロジェクトとして発足したのか?

今回の場合は未経験のエンジニアの方で目標設定も定めづらそうなイメージがありました。こちらから提案してもよいのですが、できるだけご自身の目標にあったテーマを一緒に考えてモノづくりを取り組むようにしました。

また取り組む際の考え方も一緒に共有できればと考えました。もちろんペアプログラミングなどで技術的なことは共有はしますが、技術だけでなく解決に至るまでの考え方を一緒に共有し、エンジニアとしてお互いに考える力を伸ばすことを大切にしました。

開発手法だけでなく問題に対する解決方法など総合的に取り組むためにプロジェクトとして発足しました。

8/9(水):インセプションデッキの作成

図1.png

まずはプロジェクトとして目標の設定や何をやるべきか方向を定めるため、
Google Drawingでインセプションデッキを作成しました。
実際には2人だけのプロジェクトになるため、できるかぎり未経験のエンジニアの方にアウトプットしてもらえるようにテーマを考えて、2人が同じ方向を向けるように準備します。

キャリアパスのインセプションデッキ (1).png

インセプションデッキの流れ

将来の目標設定

まずは将来の目標をブレストで出していただきました。直近の目標や今後どうしていきたいのか理想像などを書き出してもらい、それらを整理して紐づけることでアプローチ方法を探っていきます。

目標設定からのやりたいこと・やらないといけないこと

「Javaの成果物を作ろう」ということから更に必要なことを相談しながら案を出し合いながらチャレンジすべき内容を決めていきました。

技術的解決策:具体的にやること

具体的に使用する技術を記載しています。Javaの資格をお持ちとのことでJavaを活かすためにSpringを中心にDockerを使ったコンテナを用いたサービスを作ることになりました。

またエンジニアとしてどういったことをPRすべきか伝えるために、ポートフォリオの作成もやることとして設定しました。

ただしポートフォリオはストレッチゴールで成果物ができてから取り組むことにしました。

伝えたかったこと

2人で同じ問題に対して考えて整理することで具体的なやることまで導くことができました。この考えるということ自体が開発における業務でも必要になる場合があると思っています。

自分で解決案を提案してみたり、その提案を他の人と相談しつつよりよい行動に移すことで、1人のエンジニアが組織として動くことができそうです。

8/10(月)~8/16(日):開発環境の構築

図2.png

8/10(月)以降から21:00~24:00にかけてペアプログラミングで作業しました。まずは開発環境の構築でdocker-composeを使ってSpringの基盤を準備しました。

ここらへんの知識はペアプログラミングで全体の構成などを伝えながらメリットとデメリットを共有しました。Springについてはeclipseでガッチリ環境を作ってもよかったのですが、コンテナ化してどこでも動かせるようにしました。

eclipseの場合で環境がおかしくなった場合はお互いの環境で再現できないことも考えられたため、コンテナですぐに環境を構築できるように進めました。

なお、課題管理などはGitLabを使用してIssueとして管理しMerge Requestも使うようにしました。開発からある程度は経過していますが以下の場所で公開されています。

https://gitlab.com/vorwort.k/yasuda-spring

8/17(月)~8/23(日):サービスの構築

図3.png

インセプションデッキでできるだけシンプルなモノを作ることになっています。今回はチャットアプリのようなモノを作っていきます。

実際に開発を進める上でSpringのコンテナをわざわざ起動しなおす必要があったり開発の手間が掛かっていました。
そういった手間もできるだけ改善するように取り組み、今回の場合ではソースのディレクトリとSpringのコンテナの中を同期させ、Gradleで自動的に再ビルドするように対応しました。そのようなナレッジはプロジェクトのReadme.mdに追記して記録するようにしました。

開発や業務において問題に感じていることを改善することで今後のパフォーマンスに大きく影響するため、自分なりに何かアイデアがあれば話してみて取り組むと喜ばれることを共有しました。

週末にはおおよそのチャットアプリが完成したため週末に振り返りを行い、ポートフォリオの作成の準備を進めました。

8/23(日):振り返り

振り返りはKPTで行いました。ここでProblemとしてあがったのがペアプロでドライバーが変わったときに楽しくなってガツガツ勝手につくっちゃうことがあったので注意が必要だと思いました。
あと全体の構成などを共有する際に理解するのに時間が掛かっているようで、ゆっくりと消化する時間は必要だなと感じています。

8_23(日) 振り返り (1).png

ポートフォリオを作成しようということなり、振り返りとは別に実際に学んだことを書き出してもらうことにしました。ポートフォリオの材料にできればと考えて書き出してもらいました。

学んだことを整理する

上記の全体の構成などに理解するのに苦労しているようなので、これまで学んだ技術などを書き出してもらい整理してもらいました。今回はシンプルなチャットアプリサービスですが、実際に使った技術はいろいろとあることがわかります。

Springの学習における振り返り (1).png

上記の図があるだけでポートフォリオができるまでの間、成果物に関する全体構成や学んでいる技術を伝えることができます。来週からポートフォリオの作成に入りますが、作成している期間も企業にPRするための資料として利用できます。

ここでポートフォリオの作成がストレッチゴールに設定したことが効いてきそうです。

8/24(月)~8/30(日):ポートフォリオの作成

図4.png

上記の学んだことを整理した図を元にポートフォリオを作成します。ここで大事なのは自分で作成して自分で説明できるモノを作り上げることです。人と相談していろいろとコンテンツを入れることはできますが、面談などで自分の口で説明できるポートフォリオでないと、自分の武器にならないので注意が必要です。

作成していただいたポートフォリオ

https://yasu-portfolio.netlify.app/

2人で効果的なポートフォリオを考える

基本的には中身については1人で考えてもらい改善点などはアイデア程度でお伝えしました。またアイデアもできるだけ複数案出して自分で選んでもらうようにしました。この手法自体もポートフォリオを作った経緯として別の資料として作成しました。

エンジニアがポートフォリオを作った経緯 (1).png

エンジニアがポートフォリオを作った経緯 (2).png

総評

2人でプロジェクトとして発足してやり切ることがよかったと思います。まずはインセプションデッキで同じ方向を向くことで、やりたいことなどのすれ違いなどがなくなりました。また定期的にペアプロの時間を設けることで考え方なども共有できることがお互いの成長につながったと思います。自分としては相手に伝える上で伝え方などが難しく、できるだけ具体例などを用いて説明するように工夫しました。

一緒に2人で考えるということは2人で同じ問題に取り組むことになるので、その解決におけるプロセスの経験は何事にも代えがたいモノになったと思います。

今回は無事にポートフォリオの作成まで達成することができ、それによって無事に開発の現場が決まったということもお伺いしました。特にSESの営業担当からポートフォリオがあるだけでPRしやすいのは事実で、エンジニアが事前に準備できる武器としては有効だと思います。

9月は9月で上記のプロジェクトを継承して別のプロジェクトとして継続しております。こちらの内容については別の記事で投稿しようと思います。

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

開発未経験のエンジニアでも開発業務に就くことができるプロジェクト

概要

未経験のエンジニアの方でどうやったら開発に業務に携われることができるかご相談を受けました。相談に対して回答していく中で2人で一緒に何か作っていこうという話になり、それ自体をプロジェクトとして発足しました。

最初に結論から申し上げるとこのプロジェクトの取り組みによって無事に開発業務が決まりました。継続的に活動を続けていくことで1つの成果となり、それらの記録として残すためQiitaの記事としてまとめようと思いました。

なぜプロジェクトとして発足したのか?

今回の場合は未経験のエンジニアの方で目標設定も定めづらそうなイメージがありました。こちらから提案してもよいのですが、できるだけご自身の目標にあったテーマを一緒に考えてモノづくりを取り組むようにしました。

また取り組む際の考え方も一緒に共有できればと考えました。もちろんペアプログラミングなどで技術的なことは共有はしますが、技術だけでなく解決に至るまでの考え方を一緒に共有し、エンジニアとしてお互いに考える力を伸ばすことを大切にしました。

開発手法だけでなく問題に対する解決方法など総合的に取り組むためにプロジェクトとして発足しました。

8/9(水):インセプションデッキの作成

図1.png

まずはプロジェクトとして目標の設定や何をやるべきか方向を定めるため、
Google Drawingでインセプションデッキを作成しました。
実際には2人だけのプロジェクトになるため、できるかぎり未経験のエンジニアの方にアウトプットしてもらえるようにテーマを考えて、2人が同じ方向を向けるように準備します。

キャリアパスのインセプションデッキ (1).png

インセプションデッキの流れ

将来の目標設定

まずは将来の目標をブレストで出していただきました。直近の目標や今後どうしていきたいのか理想像などを書き出してもらい、それらを整理して紐づけることでアプローチ方法を探っていきます。

目標設定からのやりたいこと・やらないといけないこと

「Javaの成果物を作ろう」ということから更に必要なことを相談しながら案を出し合いながらチャレンジすべき内容を決めていきました。

技術的解決策:具体的にやること

具体的に使用する技術を記載しています。Javaの資格をお持ちとのことでJavaを活かすためにSpringを中心にDockerを使ったコンテナを用いたサービスを作ることになりました。

またエンジニアとしてどういったことをPRすべきか伝えるために、ポートフォリオの作成もやることとして設定しました。

ただしポートフォリオはストレッチゴールで成果物ができてから取り組むことにしました。

伝えたかったこと

2人で同じ問題に対して考えて整理することで具体的なやることまで導くことができました。この考えるということ自体が開発における業務でも必要になる場合があると思っています。

自分で解決案を提案してみたり、その提案を他の人と相談しつつよりよい行動に移すことで、1人のエンジニアが組織として動くことができそうです。

8/10(月)~8/16(日):開発環境の構築

図2.png

8/10(月)以降から21:00~24:00にかけてペアプログラミングで作業しました。まずは開発環境の構築でdocker-composeを使ってSpringの基盤を準備しました。

ここらへんの知識はペアプログラミングで全体の構成などを伝えながらメリットとデメリットを共有しました。Springについてはeclipseでガッチリ環境を作ってもよかったのですが、コンテナ化してどこでも動かせるようにしました。

eclipseの場合で環境がおかしくなった場合はお互いの環境で再現できないことも考えられたため、コンテナですぐに環境を構築できるように進めました。

なお、課題管理などはGitLabを使用してIssueとして管理しMerge Requestも使うようにしました。開発からある程度は経過していますが以下の場所で公開されています。

https://gitlab.com/vorwort.k/yasuda-spring

8/17(月)~8/23(日):サービスの構築

図3.png

インセプションデッキでできるだけシンプルなモノを作ることになっています。今回はチャットアプリのようなモノを作っていきます。

実際に開発を進める上でSpringのコンテナをわざわざ起動しなおす必要があったり開発の手間が掛かっていました。
そういった手間もできるだけ改善するように取り組み、今回の場合ではソースのディレクトリとSpringのコンテナの中を同期させ、Gradleで自動的に再ビルドするように対応しました。そのようなナレッジはプロジェクトのReadme.mdに追記して記録するようにしました。

開発や業務において問題に感じていることを改善することで今後のパフォーマンスに大きく影響するため、自分なりに何かアイデアがあれば話してみて取り組むと喜ばれることを共有しました。

週末にはおおよそのチャットアプリが完成したため週末に振り返りを行い、ポートフォリオの作成の準備を進めました。

8/23(日):振り返り

振り返りはKPTで行いました。ここでProblemとしてあがったのがペアプロでドライバーが変わったときに楽しくなってガツガツ勝手につくっちゃうことがあったので注意が必要だと思いました。
あと全体の構成などを共有する際に理解するのに時間が掛かっているようで、ゆっくりと消化する時間は必要だなと感じています。

8_23(日) 振り返り (1).png

ポートフォリオを作成しようということなり、振り返りとは別に実際に学んだことを書き出してもらうことにしました。ポートフォリオの材料にできればと考えて書き出してもらいました。

学んだことを整理する

上記の全体の構成などに理解するのに苦労しているようなので、これまで学んだ技術などを書き出してもらい整理してもらいました。今回はシンプルなチャットアプリサービスですが、実際に使った技術はいろいろとあることがわかります。

Springの学習における振り返り (1).png

上記の図があるだけでポートフォリオができるまでの間、成果物に関する全体構成や学んでいる技術を伝えることができます。来週からポートフォリオの作成に入りますが、作成している期間も企業にPRするための資料として利用できます。

ここでポートフォリオの作成がストレッチゴールに設定したことが効いてきそうです。

8/24(月)~8/30(日):ポートフォリオの作成

図4.png

上記の学んだことを整理した図を元にポートフォリオを作成します。ここで大事なのは自分で作成して自分で説明できるモノを作り上げることです。人と相談していろいろとコンテンツを入れることはできますが、面談などで自分の口で説明できるポートフォリオでないと、自分の武器にならないので注意が必要です。

作成していただいたポートフォリオ

https://yasu-portfolio.netlify.app/

2人で効果的なポートフォリオを考える

基本的には中身については1人で考えてもらい改善点などはアイデア程度でお伝えしました。またアイデアもできるだけ複数案出して自分で選んでもらうようにしました。この手法自体もポートフォリオを作った経緯として別の資料として作成しました。

エンジニアがポートフォリオを作った経緯 (1).png

エンジニアがポートフォリオを作った経緯 (2).png

総評

2人でプロジェクトとして発足してやり切ることがよかったと思います。まずはインセプションデッキで同じ方向を向くことで、やりたいことなどのすれ違いなどがなくなりました。また定期的にペアプロの時間を設けることで考え方なども共有できることがお互いの成長につながったと思います。自分としては相手に伝える上で伝え方などが難しく、できるだけ具体例などを用いて説明するように工夫しました。

一緒に2人で考えるということは2人で同じ問題に取り組むことになるので、その解決におけるプロセスの経験は何事にも代えがたいモノになったと思います。

今回は無事にポートフォリオの作成まで達成することができ、それによって無事に開発の現場が決まったということもお伺いしました。特にSESの営業担当からポートフォリオがあるだけでPRしやすいのは事実で、エンジニアが事前に準備できる武器としては有効だと思います。

9月は9月で上記のプロジェクトを継承して別のプロジェクトとして継続しております。こちらの内容については別の記事で投稿しようと思います。

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

NUXTJS公式のS3とCloudFrontを使用してAWSへデプロイするには?をdocker-composeで実行する

はじめに

公式ドキュメント内のAWS: S3 バケットと CloudFront Distribution の設定をdocker-composeで簡単にデプロイする方法をまとめたいと思います。

(公式ドキュメント)S3 と CloudFront を使用して AWS へデプロイするには?

AWS(S3,CloudFront)の設定についてはこちらを参考に作成してください。

1.ファイル構成

nuxtapp/docker-compose.yml
nuxtapp/Dockerfile
nuxtapp/deploy.sh
nuxtapp/gulpfile.js

deploy.shgulpfile.jsは公式の手順通り作成してください。

2.Docker化に必要なファイル準備

Dockerfile
FROM node:12.18.3-alpine3.9
RUN apk add --no-cache openssh bash python make
RUN npm install -g gulp
RUN npm install --save-dev gulp gulp-awspublish gulp-cloudfront-invalidate-aws-publish concurrent-transform
docker-compose.yml
version: '3'

services:
  node: &app_base
    build: .
    # tty: true
    working_dir: /var/www
    volumes:
      - .:/var/www
    environment:
      PORT: 3000
      HOST: 0.0.0.0
  install:
    <<: *app_base
    command: npm ci
  dev:
    <<: *app_base
    ports:
      - "3000:3000"
    command: npm run dev
  generate:
    <<: *app_base
    command: npm run generate
  dev_static:
    image: httpd
    volumes:
      - ./dist:/usr/local/apache2/htdocs/
    ports:
      - "80:80"
  s3deploy:
    <<: *app_base
    command: ./deploy.sh

docker-compose.ymlこちらの記事をyarnからnpmに変更し、コンテナに手動でインストールしていた手順をDockerfileで準備したものです。

3.使用方法

各コンテナは必要に応じでdocker-compose.ymlに定義してください。

アプリの開発環境起動

$ docker-compose up dev

コンテナ内部でnpm run devを実行します。

静的ファイル生成

$ docker-compose up generate

コンテナ内部でnpm run generateを実行します。
出力結果はデフォルトだとnuxtapp/distに出力されます。

出力された静的ファイルのローカルでの動作確認

$ docker-compose up dev_static

ローカルでTomcatコンテナでdistを公開します。
http://localhostにアクセスするとアプリを確認できます。

デプロイ

$ docker-compose up s3deploy

コンテナ内でdeploy.shを実行します。

公式の手順の成功イメージ通りになれば完了です。

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

Couchbaseローカル環境をDockerで構築

概要

Couchbaseのローカル環境をDockerで構築した時のメモ

背景

Vagrantのローカル環境があったが、
- 起動、ビルドが重い
- コードがない(ブラックボックス化してる)
- Vagrantわかる人がチームにいない(退社した人が作った環境の為)
などの問題がある。

目的

ローカル環境をDockerでリプレイスする。

作業ログ

couchbaseイメージを動かしてみる。

まず、細かい設定とかは抜きにして、Couchbaseのコンテナを立ち上げてみる。

→本番環境のバージョンが、4.5.1なので、community-4.5.1 を使う。

  • コンテナを起動

とりあえずDescriptionに書いてある通り起動

$ docker run -d --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase:community-4.5.1
  • コンテナ起動確認
$ docker ps

↓起動OK
スクリーンショット 2020-09-20 13.57.20.png

  • コンソール動作確認

ブラウザでhttp://0.0.0.0:8091/にアクセスし、Couchbaseのコンソールが表示されることを確認。
0_0_0_0_8091_ui_index_html__.jpg
Setupを押下し、手動でアカウント、バケットの設定なども可能ですが、コード化が目的なのでここではスルーします。

とりあえず動作を確認。。

コード化

Dockerfile, docker-compose.yamlを作成

ローカル環境の設定を行うにあたり、以下の設定が必要になる。
- クラスタ作成
- サービス設定
- Couchbaseサーバーの認証情報設定
- バケット作成
- View設定

上記の設定をコードにおとすため、Dockerfile(ついでにdocker-compose.yamlも)を記載

# ディレクトリ構成
local-env
├ docker-compose.yaml
└ mbe-couchbase-container
  ├ byfield      
  │ └ all.ddoc   # viewの定義ファイル
  ├ Dockerfile   # CouchbaseのDockerファイル
  └ configure.sh # Couchbaseの設定を行うbashスクリプト
# docker-compose.yaml
version: "3.7"
services:
  mbe-couchbase:
    build: ./mbe-couchbase-container
    ports:
      - 8091:8091
      - 8092:8092
      - 8093:8093
      - 8094:8094
      - 11210:11210
      - 11211:11211
    environment:
      - COUCHBASE_ADMINISTRATOR_USERNAME=couchbase
      - COUCHBASE_ADMINISTRATOR_PASSWORD=lcouchbase1
  • COUCHBASE_ADMINISTRATOR_USERNAME,COUCHBASE_ADMINISTRATOR_PASSWORDでCouchbaseの認証情報を設定
  • build: ./mbe-couchbase-containerで、↓Dockerfileを指定
#Dockerfile作成
FROM couchbase:community-4.5.1

# Couchbase初期化シェルをコンテナ内にコピー
COPY ./configure.sh /opt/couchbase
COPY ./byfield/ /opt/couchbase

# Couchbase設定実行シェル
CMD [ "/opt/couchbase/configure.sh" ]
# Couchbase設定シェル
set -m

# サーバ起動
/entrypoint.sh couchbase-server &

# APIサーバ起動までの待ち時間をざっくり設定 TODO:サーバ起動を検知して処理を進めるようにしたい。
sleep 30

# クラスタのメモリ割り当て
curl -v -X POST http://127.0.0.1:8091/pools/default -d memoryQuota=4096 -d indexMemoryQuota=4096

# サービス設定
curl -v http://127.0.0.1:8091/node/controller/setupServices -d services=kv%2cn1ql%2Cindex

# Couchbaseサーバーの認証情報設定
curl -v http://127.0.0.1:8091/settings/web -d port=8091 -d username=$COUCHBASE_ADMINISTRATOR_USERNAME -d password=$COUCHBASE_ADMINISTRATOR_PASSWORD

# バケット上限解除(バケットの上限数はデフォルトで10個,,それ以上作成する場合は以下設定で変更が必要)
curl -v -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X POST http://127.0.0.1:8091/internalSettings -d maxBucketCount=20

# バケット作成
curl -v -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X POST http://127.0.0.1:8091/pools/default/buckets -d name=bucket_name -d bucketType=couchbase -d ramQuotaMB=100 -d authType=sasl -d saslPassword=ladd_personal_info1

echo "please wait 30 sec..."
sleep 30
# View設定
curl -v -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X PUT -H "Content-Type: application/json" http://127.0.0.1:8092/bucket_name/_design/api%2Ftest -d @/opt/couchbase/all.ddoc


sleep 15

# フォアグランド実行
fg 1
  • docker-composeでコンテナ実行
$ docker-compose up -d mbe-couchbase

バケット起動を確認。

所感

Couchbaseは、ググってもあまり記事見つからない。
公式リファレンスはしっかりしてるし、簡単な実装だけだったので特に困らなかったけど。。Couchbaseって人気ない?
ちょっと前にクラウド版が出たらしいけど、クラウド移設する際は使わないと思う。

参考

https://blog.couchbase.com/docker-deploy-containerized-java-couchbase-web-application/

※もう1つQittaの記事を参考にしたが、URL無くしてわからん。。

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