20200527のdockerに関する記事は15件です。

WSL2(Ubuntu18.04 LTS)でDockerとCypressの開発環境を整える

はじめに

私はWSL2がInsider Previewに入ってからずっと業務の開発で利用してきましたが、もうすぐ正式リリースというのと、社内でも利用する人が増えてきたので知識の整理も含めて記事にしてみました。

localhostとか使えなかったのがもはや懐かしい...

WSL2

WSL2について

Windows上のWindowsサブシステムでLinuxを実行できるようにする技術です。
WSL1と異なり、VM(Hyper-V)を利用して実装されています。しかし通常のVMと異なり高速な起動とWindowsとLinuxの連携、VMの管理が不要な点を利点としています。

WSL有効化

ドキュメントを参考にセットアップをすすめていきましょう。


# Windows Subsystem for Linuxのインストール
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 仮想マシンプラットフォームの有効化
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

# 再起動後、wslコマンドが利用可能になるはずなのでWSLのデフォルトバージョンを2に設定
wsl --set-default-version 2

OSの選定

Microsoft Storeもしくはインターネット上からWSL用イメージを取得します。

Awesome WSL Supported Distributions

今回記事で取り上げるUbuntu18.04 LTSが現状情報が多く感じます。Ubuntu20.04LTSもストアにリリースされているようです。

個人的には非公式にはなりますが、 ArchWSL が結構動いてくれて開発する分にはあまり困ることもなかったので推したいです。

WSL設定(.wslconfig)

C:\\User\ユーザー名\.wslconfigにwsl2の設定を記述できます。

私はlocalhostの設定と、メモリ制限、SWAPの有効化を入れています。

設定項目については、Manage Linux Distributions が詳しいかなと思います。

[wsl2]
localhostForwarding=true
memory=8G
swap=4G

Windows Terminal

WSL2の発表と同時期に発表されたMicrosoft開発のターミナルです。既存のビルトインのターミナルを置き換えるべく開発をすすめているとかなんとか...

こちらもPreview版のリリース直後は突然クラッシュしたり、表示が崩れたりなどのバグが多かったですがリリースされた現在では安定しています。

描画は高速で綺麗なためVimなどのリッチなCUIプログラム扱うのも非常に快適です。
PowerShell, WSL, Azureとの親和性は高く、WSLのディストリビューションを追加すると勝手に起動オプションを追加してくれて非常に便利です。

私の設定はデフォルトプロファイルをUbuntuに設定したり、カラースキームは個人的に鉄板な Draculaを利用しています。

ペイン分割も設定していますが、私はtmuxを使うのであまり使いません。

{
    "$schema": "https://aka.ms/terminal-profiles-schema",

    "defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",

    "profiles":
    {
        "defaults":
        {
            // Put settings here that you want to apply to all profiles
            "fontFace": "Hackgen Console",
            "fontSize": 14,
            "colorScheme": "Dracula"
        },
        "list":
        [
            {
                // Make changes here to the powershell.exe profile
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "hidden": false
            },
            {
                // Make changes here to the cmd.exe profile
                "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
                "name": "cmd",
                "commandline": "cmd.exe",
                "hidden": false
            },
            {
                "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
                "hidden": false,
                "name": "Ubuntu",
                "source": "Windows.Terminal.Wsl",
                "commandline": "wsl ~ -d Ubuntu"
            },
            {
                "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
                "hidden": false,
                "name": "Azure Cloud Shell",
                "source": "Windows.Terminal.Azure"
            },
            {
                "guid": "{a5a97cb8-8961-5535-816d-772efe0c6a3f}",
                "hidden": false,
                "name": "Arch",
                "source": "Windows.Terminal.Wsl"
            }
        ]
    },

    // Add custom color schemes to this array
    "schemes": [
        // 個人的に
        {
            "name" : "Dracula",
            "background" : "#282A36",
            "black" : "#21222C",
            "blue" : "#BD93F9",
            "brightBlack" : "#6272A4",
            "brightBlue" : "#D6ACFF",
            "brightCyan" : "#A4FFFF",
            "brightGreen" : "#69FF94",
            "brightPurple" : "#FF92DF",
            "brightRed" : "#FF6E6E",
            "brightWhite" : "#FFFFFF",
            "brightYellow" : "#FFFFA5",
            "cyan" : "#8BE9FD",
            "foreground" : "#F8F8F2",
            "green" : "#50FA7B",
            "purple" : "#FF79C6",
            "red" : "#FF5555",
            "white" : "#F8F8F2",
            "yellow" : "#F1FA8C"
        }
    ],

    "keybindings": [
        // ペイン分割と移動。Vim風にしています。
        { "command": { "action": "splitPane", "split": "vertical" }, "keys": "ctrl+shift+e" },
        { "command": { "action": "splitPane", "split": "horizontal" }, "keys": "ctrl+shift+d" },
        { "command": { "action": "splitPane", "split": "auto" }, "keys": "alt+shift+|" },
        { "command": { "action": "moveFocus", "direction": "down" }, "keys": "ctrl+shift+j" },
        { "command": { "action": "moveFocus", "direction": "left" }, "keys": "ctrl+shift+h" },
        { "command": { "action": "moveFocus", "direction": "right" }, "keys": "ctrl+shift+l" },
        { "command": { "action": "moveFocus", "direction": "up" }, "keys": "ctrl+shift+k" }
    ]
}

VSCode Remote Development

指定した接続先でVSCodeを開けるスグレモノです。SSH、Docker、WSLまでカバーしています。

Remote Development Extension PackをVSCodeに入れるだけで導入完了です。

WSLのターミナルにログインして、

code .

と実行するだけで、WSL内のディレクトリが開けます。便利です。

Ubuntu18.04 LTS

Dockerをセットアップする

systemd

最近のLinuxディストリビューションでは依存するパッケージも増えてきているsystemdですが、WSL上のLinuxではMicrosoft独自のLinuxカーネルを利用しているため無効化されています。

もちろんsystemdを利用せずとも開発はできるのですが、自動起動周りが微妙に面倒なので自分は後述のgenieを導入してsystemdを稼働させています。

genie

https://github.com/arkane-systems/geni

wslでsystemdを起動するための便利ツールです。

dotnet runtimeが必要なためガイドに沿って、

wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb

sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-runtime-3.1

dotnet runtimeをセットアップしたのち、

curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash
sudo apt update
sudo apt install systemd-genie

これでgenieのセットアップは完了で、シェル上で

# Ubuntu 18.04 LTS用
genie -c bash

# Arch等々
genie -s

# systemd起動確認
sudo systemctl status

と実行することで、新しくシェルが起動されてsystemdが起動出来ます。

Ubuntu 18.04 LTSでは何個かサービスがFailedしていますが、開発には今の所支障はありません。気持ち悪いのでいつか修正できたらと思っています。

Docker

公式のガイドに沿って進めていきます。

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

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

sudo apt-key fingerprint 0EBFCD88

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

sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io

sudo gpasswd -a $USER docker

# 再ログイン後

docker run hello-world

# docker-compose
sudo apt install python3-pip
pip3 install -U docker-compose

docker-compose -v

Cypress

最近のWeb関係の開発はDockerやVSCodeだけで事足りてしまうのですが、Cypressのようなブラウザを利用するツールはHeadlessモードがあるとはいえ開発はしんどいです。
なのでWSL経由でGUIを起動できるようにX ServerをWindows側にセットアップしています。

Xサーバー

X410

Microsoft Store

自分は有償ですがこちらを利用しています。ファイアウォールの設定をしてしまえばアプリを起動するだけで勝手に常駐してくれるので楽です。
動作も結構安定しています。

VcXsrv

Source Forge

利用者や情報が多いのはこちら。無償です。

起動時の設定で

  • Display Settings
    • Multiple Windows(任意)
  • Start Clients
    • Start no client
  • Extra Settings
    • Clipboard: true
    • Native opengl: true
    • Disable access control: false
    • Additional parameters for VcXsrv
      • -ac

で設定するのがおすすめです。

### 共通
どちらも共通なのですが、コントロールパネル -> ファイアウォール -> Windows Defenderファイアウォールを介したアプリまたは機能を許可

でX410、VcXsrvの許可をしておかないとWSL側からWindowを立ち上げられません。

Untitled.png

Untitled (1).png

### 動作確認

sudo apt install x11-apps

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0

xeyes

DISPLAYを設定している行は.bashrcにでも追記しておくと便利です。

Cypress起動

必要な依存関係をインストール

sudo apt install libgtk2.0-0 libgtk-3-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb

nodeをセットアップして、

mkdir cypress test
npm init

# yes, yes, yes...

npm install cypress
npx cypress open

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

長いコマンドを簡単に実行してもらう方法

コマンドを出力する

docker run --rm tukiyo3/wine32
  • 以下のようにDockerfileの最後のCMDで echo する。
  • Dockerfile
Dockerfile
CMD echo '\
docker run -it \
 --rm \
 --name=wine \
 \
 -e DISPLAY=$DISPLAY \
 -v /tmp/.X11-unix:/tmp/.X11-unix:ro \
 -v $HOME/.Xauthority:/home/wine/.Xauthority \
 \
 -v /run/user/$(id -u)/pulse/native:/run/user/1000/pulse/native \
 -v /dev/snd:/dev/snd --privileged \
 \
 -v $PWD:/c/host/ \
 tukiyo3/wine /bin/bash \
'
  • 出力されたものをそのまま実行する

使用例

docker run --rm tukiyo3/wine32 > w32 && sh w32
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

世界最速でLinux環境を構築するお話

rectangle_large_type_2_5d9d414fe37a8ae4ab995a045fe86087.jpeg

さくっと環境が欲しくなったときのためにここに書き留めておきます。

Ubuntuを引っ張る

bash
$ docker run -it ubuntu bash

はい終わり。多分これが一番早いです。

スクリーンショット 2020-05-27 11.37.38.png
無事root権限でログインできてます。

加えてsudoとかnanoとか任意です。

bash
root$ apt-get update
#gitのインストール
root$ sudo apt-get -y install git
#エディタ(nano)のインストール
root$ sudo apt-get install nano

ちなみにこれだと日本語入力に対応していないので, 以下を参考にしてみてください。
【Docker】ubuntuの環境で日本語入力を可能にする

あとはubuntuをいじくり倒し(てぶっ壊し)ましょう!

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

Nuxtの開発環境をDockerで構築

はじめに

初めまして。
WELLNESONE JAPAN株式会社(株式準備中)代表取締役CTOの@yusuke_1011です。
自社で一からサービス開発を行う際に実践した構成をここに記しておきます。

こちらの記事は、「Nuxt + Docker + CIrcleCI + Storybookという構成でAtomic Designにて開発していく」の第1章となります。

一般的な内容も多くありますが、説明用のサンプルではなく、実際にプロジェクトで導入した内容にはなるので、オリジナルな部分もある程度含んでしまいます。その点ご了承くださいませ。

全体構成

Nuxt + Docker + CIrcleCI + Storybookという構成でAtomic Designにて開発していく

  1. Nuxtの開発環境をDockerで構築(←今ここ)
  2. NuxtでAtomic Designを実践
  3. Nuxt + Storybookでコンポーネントを管理
  4. Storybookを用いたテスト(ストラクチャルリグレッションテスト編)
  5. Storybookを用いたテスト(ビジュアルリグレッションテスト編)

前提

Nodeとnpmがインストールされている

❯ node --version
v14.2.0

❯ npm --version
6.14.4

dockerとdocker-compose

dockerとdocker-composeを使用します。
Macであればhomebrewを使用してすぐインストールできます。

$ brew install docker
$ brew cask install docker

これらインストールされていることを確認しましょう。

❯ docker --version
Docker version 19.03.8, build afacb8b

❯ docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6

nuxtプロジェクトの作成

npm create sample_app

vue-cliを用いても良いかと思います。

ディレクトリ構成

以下のようにします。

sample_app
└── docker-compose.yml
└── .env.example
└── front
    └── Dockerfile
    └── src
     └──(nuxtのコード一式)

今後apiなど追加していく前提のディレクトリ構成になっています。
その場合はfront以下をgitのsubmoduleで管理するのもアリかと。

Dockerfileの作成

今回は必要最低限の記述にします。

FROM node:12.16.1 

ENV NUXT_HOST=0.0.0.0
WORKDIR /src
COPY ./src/package.json .
RUN npm install

COPY ./src .

.env.exapmleの作成

FRONT_PORT=19080

dokcer-compose.ymlの作成

version: '3.7'
services:
  front:
    build: ./front
    command: npm run dev
    volumes:
      - ./front/src:/src
      - ./src/node_modules
    ports:
      - "$FRONT_PORT:3000"
    init: true
    restart: on-failure

起動手順

1.設定ファイルを生成する

cp .env.example .env

2.dockerイメージを生成する

docker-compose build

3.dockerコンテナを起動する

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

Nuxt + Docker + CIrcleCI + Storybookという構成でAtomic Designにて開発していく

初めまして。
WELLNESONE JAPAN株式会社(株式準備中)代表取締役CTOの@yusuke_1011です。
自社で一からサービス開発を行う際に実践した構成をここに記しておきます。

対象

  • Nuxt.jsの学習はしているが開発経験はまだないエンジニア
  • Nuxt.jsでAtomic Designを実践したいエンジニア
  • DockerやCircleCIを取り入れた実践的なポートフォリオを作成したいエンジニア志望

の方々が読めるようなレベル感で説明できればと思います。

構成

  1. Nuxtの開発環境をDockerで構築
  2. NuxtでAtomic Designを実践
  3. Nuxt + Storybookでコンポーネントを管理
  4. Storybookを用いたテスト(ストラクチャルリグレッションテスト編)
  5. Storybookを用いたテスト(ビジュアルリグレッションテスト編)

ここでは簡単な用語の説明などを行います。
(Nuxt、Docker、CircleCIは省略します)

Atomic Design

コンポーネントを細かく分割して定義していくコンポーネントベースのデザイン手法です。
「Atomic」という言葉の通り、最小単位(Atom)から作成し、それを組み合わせるような形でデザインしていきます。

利点

  • コンポーネントを使いまわしやすい
  • 並行開発しやすい
  • テストがしやすい
  • メンテナンスしやすい

Storybook

コンポーネントのカタログを作成し、管理できるツールです。
コンポーネントのテストもStorybook上で実施できます。

Atomic Designで開発を進める以上は、Storybookのようなツールは必要不可欠かなと思います。
主な用途としては、

  • デザインスタイルガイドとしてデザイナーとのコミュニケーションに使用
  • コンポーネントの挙動や表示を確認するテストに使用

です。
元々はスリランカのスタートアップがReact用に開発したらしいですが、現在は

  • React
  • Vue
  • Anguler

で幅広く使用できます。

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

Rails Failed to load resource: the server responded with a status of 403 (Not Found) 対処法について

現在、ポートフォリオを作成している途中のゆーた(@onoblog)です。

本番環境で、Rails carrierwave fog-awsでs3を実装後に、
ローカル環境で開発しようとしたら、画像が表示できなくなったので、まとめておきます。

正確に、言うと、画像が割れてしまいました。

スクリーンショット 2020-05-27 10.10.45.png

環境

  • rails 5.2.3
  • carrierwave
  • fog-aws
  • jquery-rails (4.3.5)
  • vue/cli 4.1.2
  • yarn 1.21.1
  • webpacker (5.0.1)
  • Docker 19.03.5
  • docker-compose 1.25.2
  • nginx 1.15.8

対処法

開発環境と本番環境で、ストレージを変更することです。

image_uploader.rb
.
.
  # storage :file 削除
  # storage :fog もしくは、こちらを削除

  if Rails.env.development? || Rails.env.test?
    storage :file
  else
    storage :fog
  end

.
.
carrierwave.rb
unless Rails.env.development? || Rails.env.test? #追加
  CarrierWave.configure do |config|
  .
  .
  end
end #追加

原因

私は、本番環境で、必要最低限の設定のみ、しかしてませんでした。

つまり、ローカルは、storage :fileに保存して、
本場環境は、storage :fogにするということまで設定ができてませんでした。

ちなみに、AWSのS3の学習のために、S3を設定して、写真投稿できて、終わりみたいな使い方をしていので、気が付きませんでした。

運用まで、考えて学習するようにします。

おまけ

上記で、直らない方は、おそらく違う原因に、なると思います。

エラー解決で、ググっているときに、結構見かけたので、こちらも、メモしときます。

image_uploader.rb
.
.
  # 追加
  def extension_whitelist
    %w(jpg jpeg gif png)
  end
.
.

画像のurlの拡張子が、うまく保存されなくて、画像が割れているという方も、多くいました。

よければ、参考にしてください。

参照

https://qiita.com/peco4107/items/6c8fba1a13c54a5447a7

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

Terraria のサーバをDockerで建てる

Terraria Journey's End最&高すぎだけどなんかMacだといろいろインストールしないとサーバーを建てられないみたいなので、Dockerで建てました。

環境

  • ubuntu-server 20.04 LTS (ホスト)
  • docker version 19.03.9
  • docker-compose version 1.25.0

※Dockerとdocker-composeの導入はここでは載せません。

今回建てるTerrariaサーバ

  • Terraria ver1.4.0.4
  • TSHOCK ver 4.3.26

T-SHOCKとは

Terrariaサーバの大体はT-SHOCKとSteamフレンド経由で建てられているといっても過言ではない(主観)普通に建てるよりも軽いらしい、非常に細かい設定が出来る。ユーザーログイン、荒らし対策やアイテム持ち込み禁止などが設定でき、プラグインにも対応している。

作成

1. フォルダの作成

適当なフォルダ(今回はubuntu-serverという名前)を作成しその下に"docker-compose.yml"を作成。

ubuntu-server
└── docker-compose.yml

最終的にこうなる予定

ubuntu-server
├── docker-compose.yml
└── terraria/
    ├── Worlds(ワールドデータ)
    ├── logs(ログ)
    └── plugins(プラグイン)

2. docker-composeファイルの編集 & サーバ立ち上げ

今回はT-shockのDockerfileがあるのでそれを利用する。
viやnano等のテキストエディタで"docker-compose.yml"を作成する。

version: "3"
services:

  terraria:
      image: ryshe/terraria:latest
      ports:
        - "7777:7777"
      # ボリュームマウントして永続化している
      volumes:
        - ./terraria/Worlds:/root/.local/share/Terraria/Worlds
        - ./terraria/logs:/tshock/logs
        - ./terraria/plugins:/plugins

Terrariaのサーバーを立ち上げる

docker-compose up -d

3. ワールドデータを作成する

Terrariaのサーバを立ち上げているコンテナに入る

docker-compose exec terraria /bin/bash

"/tshock"に入れるのでshでbootstrap.shを実行

sh /bootstrap.sh

質問に答えてワールドを生成していく

※ワールド名は後に使用するので控えておいて下さい。

[Server API] Info Plugin TShock v4.4.0.0 (by The TShock Team) initiated.
Terraria Server v1.4.0.4

n               New World (新規作成)
d <number>      Delete World

Choose World: n (新規作成のnを入力しEnter)

####################
####################

Terraria Server v1.4.0.4

1       Small
2       Medium
3       Large

Choose size: 3 (ワールドのサイズはラージの3で)

####################
####################

Terraria Server v1.4.0.4

1       Classic
2       Expert
3       Master
4       Journey

Choose difficulty: 3(新規追加されたMasterの難易度を選ぶ)

####################
####################

Terraria Server v1.4.0.4

1       Random (ランダム)
2       Corrupt (不浄の地)
3       Crimson (クリムゾン)

Choose world evil: 1(不浄かクリムゾンもしくはランダムを選ぶ今回はランダム)

####################
####################

Terraria Server v1.4.0.4

Enter world name: test-world (ワールド名 ※半角英数字 ※控えておく)

####################
####################

Terraria Server v1.4.0.4

Enter Seed (Leave Blank For Random): (シード値 今回は空)

####################
####################

生成される(省略)

####################
####################

最初のワールド選択に戻ると思うので、Ctrl+Cで抜ける

生成が完了したらコンテナを抜けましょう

exit

4. docker-composeの再編集

コンテナを一旦ダウンさせます

docker-compose down

viやnano等のテキストエディタで再び"docker-compose.yml"を編集する。

version: "3"
services:

  terraria:
      image: ryshe/terraria:latest
      ports:
        - "7777:7777"
      # ボリュームマウントして永続化している
      volumes:
        - ./terraria/Worlds:/root/.local/share/Terraria/Worlds
        - ./terraria/logs:/tshock/logs
        - ./terraria/plugins:/plugins
      # 追加ポイント
      # 先ほどの "ワールド名 + .wld"
      environment:
       WORLD_FILENAME: "test-world.wld"

編集が完了したら再びコンテナを立ち上げる

docker-compose up -d

これで立ち上げ完了

これでDockerでサーバが立ち上げることが出来ました。良いTerrariaライフを!!

6. あとがき

深夜テンションの殴り書きで書いたので不備があるかもしれません、なにか問題があればコメントでお願いします。

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

Dockerを使用したRails開発 初期ソースコード生成とGemパッケージインストール (Could not find xxx in エラー)

初めに

これまでの制作で、Railsコンテナにログイン・ログアウトができるようになりました。
なので、ここからは「PostgreSQL」を使用して、初期ソースコードを生成・Gemパッケージインストールを行います。
また、gemパッケージインストールでエラーを連発しました。
もしも、私と同じエラーでつまづきましたら、参考にしてください。

マシンスペック

・macOS Catalina
・バージョン 10.15.4
・iMac(retina 4K, 21.5-inch,2019)
・プロセッサ 3 GHz 6コアIntel Core i5
・メモリ 8GB

初期ソースコードの生成

①コマンド入力
「rails new」コマンドで新規アプリケーションを制作します。
しかし、今回は「PostgreSQL」を使用するので、記載が複雑になっています。

rails new ●● -d postgresql --skip-test-unit

●●はアプリ名を英語で入力してください。
test::unit関連のコード生成省略のために「--skip-test-unit」を使用しています。

②初期ソースコード確認
ソースはアプリのフォルダに生成されているので、中身を「Is -a」コマンドで確認ができます。
Is -a ●●

●●はアプリ名を英語で入力してください。

問題がなければ、ソースコードが表示されます。

gemパッケージのインストール

①Gemfileの編集
アプリフォルダの中に「gemfile」があるので、こちらをエディターソフトで開き
以下必要なgemを追記しました。

gem 'bcrypt'
gem 'rails-i18n'
gem "kaminari"
gem 'date_validator'
gem "valid_email2"
gem "nokogiri"

gem "capybara"
gem "selenium-webdriver"
gem "webdrivers"
gem "rspec-rails"
gem "factory_bot_rails"

②gem パッケージのコマンド実行

gemfileに入力後、通常は以下のコマンドでgemパッケージ群をインストールできるのですが、私はここでエラーを多発させました。

bin/dundle

Docker_10.png

Could not find xxx in

というエラーです。

このエラーは、Gitからアプリをダウンロードしたり、rubyのバージョンを上げることにより発生します。
私は解決のために、以下のサイトを使用しました。

Docker_11.png
https://rubygems.org

Could not find bcrypt-3.1.13 in any of the sources
なので「bcrypt」を「bcrypt-3.1.13」に変更する必要があるので直していきます。

まずは「bcrypt」を検索

Docker_12.png
Docker_13.png

2枚目の左にあるソースコード

gemfile
gem 'bcrypt', '~> 3.1', '>= 3.1.13'

インストール
gem install bcrypt

をそれぞれ入力して「bin/bundle」を行います。

Docker_14.png

他のgemも同じくエラーがでたので、同じ方法で直しました。

②Gemのパッケージリスト表示

無事にここまで進みましたら、gemパッケージをリスト表示できます。

bin/bundle list
Docker_15.png

・・・・・

エラーの参考記事

https://qiita.com/jnchito/items/44ab1df134369ed76911

以上になります。
ここまで、読んでいただきありがとうございました。

gemパッケージでエラーが発生して、驚きましたが解決できてよかったです。

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

NestJSとGraphQLで開発用の環境を作成する

NestJS と GraphQL で開発用の環境を作成する

目次

  1. NestJS のアプリケーションを作成
  2. GraphQL の依存関係を構築する
  3. mysql(docker)を用意する
  4. mysql の依存関係を構築する

1. NestJS のアプリケーションを作成

NestCliを用いて NestJS のアプリケーションを構築する。

cli を install していない時は、上の URL から cli を install してアプリケーションを作成します。

$ nest new nestjs-graphql
$ npm run start:dev

localhost:3000で下記画面が表示されることを確認します。

localhost.png

2. GraphQL の依存関係を構築する

Qiita 記事で記載しましたが、依存関係を解決していきます。

GraphQL を利用するのに必要な 4 つをインストールしていきます。

$ npm i --save @nestjs/graphql graphql-tools graphql apollo-server-express

library の型定義で error がはかれないように、tsconfig.json を編集します。

tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    //ここから追記
    "skipLibCheck": true
  //ここまで追記
  },
  "exclude": ["node_modules", "dist"]
}

公式ドキュメントをもとに GraphQL の依存関係を app.module に定義していきます。

src/app.module.ts
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { join } from 'path';

@Module({
  imports: [
    GraphQLModule.forRoot({
      debug: false,
      playground: true,
      typePaths: ['./**/*.graphql'],
      definitions: {
        path: join(process.cwd(), 'src/graphql.ts'),
        outputAs: 'class',
      },
    }),
  ],
})
export class AppModule {}

サーバーを起動し、play groundにアクセスして paly groud が表示されることを確認します。

$ npm run start:dev

下記のように Play Ground が表示されます。

playgorund.png

3. mysql(docker)を用意する

docker-compose.ymlDockerfileを追加していきます。

$ touch docker-compose.yml
$ touch Dockerfile

現状のディレクトリ構成は、以下になる想定です。

$ tree -L 1 -I node_modules
.
├── Dockerfile
├── README.md
├── dist
├── docker-compose.yml
├── nest-cli.json
├── package-lock.json
├── package.json
├── src
├── test
├── tsconfig.build.json
└── tsconfig.json

MySQL のみの docker を作成するので、起動に必要な設定を作成していきます。

FROM mysql:5.7
docker-compose.yml
version: '3.7'
services:
  db:
    build: .
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    tty: true
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: develop

最後に docker を起動して正常に動作するか確認します。

$ docker-compose up
$ docker ps -a

4. mysql の依存関係を構築する

公式ドキュメントを目安に依存関係を構築していきます。

$ npm install --save @nestjs/typeorm typeorm mysql

上記のインストールが完了したら、app.module に必要な設定を記載していきます。お行儀が悪いですが、とりあえず動くように設定を記載していきます。

src/app.module.ts
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { TypeOrmModule } from '@nestjs/typeorm';
import { join } from 'path';

@Module({
  imports: [
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
      definitions: {
        path: join(process.cwd(), 'src/models/graphql.ts'),
        outputAs: 'class',
      },
    }),
    TypeOrmModule.forRootAsync({
      useFactory: () => ({
        type: 'mysql',
        host: 'localhost',
        port: 3306,
        username: 'root',
        password: 'example',
        database: 'develop',
        entities: [__dirname + '/**/*.entity{.ts,.js}'],
        synchronize: true,
      }),
    }),
  ],
})
export class AppModule {}

上記で簡易的な設定が完了したと思うので、あとは適宜 GraphQL を記載していけば実装できます。

レポ

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

Dockerを使用したRails開発 Railsコンテナへのログイン (仮想環境の準備 Mac用)

初めに

制作するにあたって
「Doclerコンテナ」と「操作コンテナ」の2種類に分けてコンテナへログインして行きたいと思います。

マシンスペック

・macOS Catalina
・バージョン 10.15.3
・iMac(retina 4K, 21.5-inch,2019)
・プロセッサ 3 GHz 6コアIntel Core i5
・メモリ 8GB

操作コンテナへログイン

以下のコマンドを起動します。
起動時には操作するフォルダーの中で起動させないとエラーになるので、ルーディングを気をるけてください。

docker-compose exec web bash

エラーなく進みましたら、ここでRailsのバージョンを確認してください。

rails --version

コンテナからのログアウト

ログアウトは以下のコマンドを実行します。

exit

以上が、コンテナへのログインでした。
閲覧いただき、ありがとうございます。

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

docker-compose + makeで作る最強のTerraformローカル実行環境

というわけで、Terraformのローカル実行環境の個人的なベストプラクティスなものが出来上がったのでご紹介したいと思います!!

今回やること

  • Terraformで作成するリソースはVPCのみ
  • docker-compose + make によるTerraformローカル実行環境の構築

ディレクトリ構成

ディレクトリ構成はこんな感じでして、要約するとHashicorpの公式Terraform Dockerイメージを使って、Terraformの実行環境を用意してmakeコマンドでラップするという感じです!

.
├── LICENSE
├── Makefile
├── README.md
├── docker-compose.yml
└── terraform
    ├── main.tf
    └── modules
        └── aws
            └── network
                ├── variables.tf
                └── vpc.tf

各ファイルについて

vpc.tf

10.0.0.0/16のVPCを作っているだけ!

vpc.tf
resource "aws_vpc" "vpc" {
  cidr_block           = var.vpc_cidr
  enable_dns_support   = true
  enable_dns_hostnames = true
}

docker-compose.yml

Hashicorp公式Dockerイメージを使ったdocker-compose.yml

docker-compose.yml
version: '3.6'

services:
  terraform:
    image: hashicorp/terraform:0.12.24
    container_name: terraform
    volumes:
      - ./terraform:/terraform
    env_file: .env
    working_dir: /terraform

ちなみに.envにはAWSのクレデンシャルを記載するだけです!

.env
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=

Makefile

Makefile
.PHONY: init plan apply destroy check

init:
    make check
    docker-compose run --rm terraform init

plan:
    make check
    docker-compose run --rm terraform plan

apply:
    make check
    docker-compose run --rm terraform apply

destroy:
    make check
    docker-compose run --rm terraform destroy

check:
    docker-compose run --rm terraform fmt -recursive
    docker-compose run --rm terraform fmt -check
    docker-compose run --rm terraform validate

Makefileのおかげで以下のようにmakeコマンドで簡単にTerraformを実行できます!

➜  terraform-best-executable-env (master) ✗ make check   
docker-compose run --rm terraform fmt -recursive
docker-compose run --rm terraform fmt -check
docker-compose run --rm terraform validate
Success! The configuration is valid.

というわけで

こんな感じで最近はAnsibleやPackerなども同様の手法でローカル実行環境を作成してます!
個人的にはかなりすっきりした感じでコマンド実行できて良い感じだなぁと思ってますので是非試して見てください^^

コードはGithubにあげてあって、ついでにGitHub ActionsでTerraformのCI環境を軽く作ってみたところめちゃ簡単にできたので気になる方は見てみてください〜!

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

Dockerを使用したRails開発 Railsのコンテナ群構築 (仮想環境の準備 Mac用)

初めに

DockerとDocker Compose を用いてRailsの開発用コンテナ群を制作します。

マシンスペック

・macOS Catalina
・バージョン 10.15.4
・iMac(retina 4K, 21.5-inch,2019)
・プロセッサ 3 GHz 6コアIntel Core i5
・メモリ 8GB

①Gitのインストール

Docker_5.png
https://git-scm.com/download/mac
こちらのページに、ダウンロードファイルがあります。

②Rails開発用コンテナ群の構築

git clone https://github.com/oiax/rails6-compose.git

Docker_7.png

cd rails6-compose
./setup.sh

③コンテナ群のスタートとストップ

・コンテナ群のスタート
docker-compose up -d
Docker_8.png

・コンテナ群のストップ
docker-compose stop
Docker_8.png

以上がRailsのコンテナ群の構築でした。
ここまでは、エラーなしで構築できましたが、これからが心配です。

閲覧いただき、ありがとうございました。

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

docker run のときに指定する -p と –-expose の違い

dockerコンテナ起動時にポートを指定する引数 -p と --expose の違いは?

https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose

結論

違いは指定されたポートを晒す先

-p (--publish):ホストに晒してホスト側からの接続を許可する

Mysqlのコンテナを立てて各種DBツールから localhost:3306 として繋ぎたい場合、
docker run ~~ -p 3306:3306 ~~ mysql
と公開するポートを指定する必要がある。

このとき、ホスト側ですでに3306ポートが利用中の場合は起動に失敗する。
そんなときは~~ -p 3316:3306 ~~ などにしてホスト側のポート番号を変えてあげればよい。

--expose:同一dockerネットワーク内に晒して、同一ネットワーク内からの接続を許可する

同一dockerネットワーク内に存在するPHP-FPMコンテナから3306ポートを使ってMySQLに接続したい場合に利用する。
※もっとも、MySQLなどはDockerfile内でEXPOSEされているため、指定は不要
 → https://github.com/docker-library/mysql/blob/bc6e37a2bed792b1c4fc6ab1ec3ce316e6a5f061/8.0/Dockerfile#L84

感想

気になって調べたけど、docker run のタイミングで --expose 指定するケースが思い浮かばなかった。
(大体、Dockerfile内でEXPOSEが書かれているため)

あと、MySQLのDockerイメージは33060ポートも指定してたのね、知らなかった。
→ (さっきと同じリンク)https://github.com/docker-library/mysql/blob/bc6e37a2bed792b1c4fc6ab1ec3ce316e6a5f061/8.0/Dockerfile#L84

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

Dockerを使用したRails開発 ダウンロード編(仮想環境の準備 Mac用)

初めに

この度はRails5でテストアプリ開発のため仮想環境を「Docker」で準備し制作を進めることにしました。
Dockerを使用するのがはじめてだったので忘却録をこちらに記録します。

マシンスペック

・macOS Catalina
・バージョン 10.15.4
・iMac(retina 4K, 21.5-inch,2019)
・プロセッサ 3 GHz 6コアIntel Core i5
・メモリ 8GB

Dockerのダウンロード

①Dockerのサイトをブラウザで開き、アカウントを取得してください。

(公式サイト)
Docker_1.png
https://www.docker.com

(アカウント取得先アドレス)
https://hub.docker.com/signup

①Dockerのインストール
Docker_2.png
https://www.docker.com/get-started
こちらの「Mac」を選択してインストールしてください。

ダウンロード後は、ドラックアンドドロップで「Applications」に保存します。

③バージョン番号を確認する

「ターミナル」を使用して以下のコマンドを入力してください。

docker version
Docker_3.png

docker-compose version
Docker_4.png

以上がDockerのダウンロードでした。

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

RaspberryPI起動と同時にDockerイメージを起動

目的

Flatの環境またDockerの環境が構築されている場合、RaspberyPiを起動した後、Dockerの特定イメージを自動で起動させる方法について話をしたいと思います。

1./etc/rc.localについて

OSが起動された後、何か実行したい処理をここに追加します。

2.既存のrc.localの中身を確認します。

「cat」コマンドでファイルの中身を確認します。
ここに処理を追加する場合は「exit 0」の前に追加します。
「exit 0」の後ろに追加した場合は正常に実行されません。

pi@raspberrypi:~ $ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
exit 0

3.Dockerイメージを起動するコマンドを追加します。

Dockerイメージを起動するコマンドの形式は下記の通りです。
行の末に「&」を必ず入れて置きましょう。
→追加した処理が正しく終わらないとOSの起動が止まっている可能性があります。

例)/usr/bin/docker start docker-image-name &

コマンドを追加したrc.localファイルの中身です。

pi@raspberrypi:~ $ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
/usr/bin/docker start LAMP &
exit 0

※前回Flatの環境で構築したLAMP環境のDockerイメージ名です。
前回記事:Flatを利用してLAMP環境構築

4.RaspberryPIを再起動します。

下記のコマンドを実行するとRaspberryPIが再起動されます。

pi@raspberrypi:~ $ sudo reboot

5.Flat環境へログインします。

①下記のアドレスをブラウザから入力してアクセスします。

http://[Raspberry PIのIPアドレス]:9000
または(モニターと直接繋がっている場合、下記のアドレスを利用してもOK)
http://localhost:9000

②アカウントは[admin/設定したパスワード]を入力します。
image.png
③Flatの初期画面です。「Containers」メニューを選択します。
image.png
④下記のLAMPというDockerイメージは起動されていますが、
OSMCというDockerイメージは起動されてないことが分かります。
image.png

6.その他

Dockerイメージを起動した後、Dockerイメージの中にあるコマンドを実行したい場合、
以下の形式で「/etc/rc.local」ファイルに追加します。

★注意事項★
Dockerイメージの起動コマンドの後に追加してください。

/usr/bin/docker exec LAMP /usr/bin/python /home/pi/mail.py &

※pythonコマンドでmail.pyプログラムを起動する例です。

終わりに

今までRaspberryPIを再起動したらFlatの画面でDockerのイメージを毎回起動ボタンを押さないとDockerが起動されなかったですが、これからは再起動すると自動でDockerイメージが起動されるようになりました。
少し役に立ちましたか?次回は上記の「mail.py」について紹介したいと思います。
お休みなさい。^^&

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