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

【ruby】Docker開発環境へのGoogle Cloud Translation API (v2)導入手順

開発環境

ruby '2.6.3'
rails '6.0.2'

Google Cloud Translation APIとは

  • ウェブサイトやアプリを 100 以上の言語に瞬時に翻訳したい場合などに役立つのが Translation API です。
  • Translation API の料金

  • Translation API の料金

  • Google Cloud の無料枠
    私の場合は12 か月間の無料トライアル(Google Cloud サービスで使用できる $300 相当のクレジット付き)。なので無料です。

導入手順

Cloud Translate API の有効化

サービスアカウントキーの作成

サービスカウント: 「新しいサービスアカウント」を選択
サービスアカウント名: (任意)
役割: オーナー (Project > オーナー)
サービスアカウントID: (任意)
キーのタイプ: JSON

「作成」ボタンを押下すると、jsonファイルがダウンロードされます

サービスアカウントキーの適用,環境変数の設定

  • GOOGLE_APPLICATION_CREDENTIALSという名前の環境変数を作成し、先ほどダウンロードしたjsonファイルのパスを設定します。
ターミナル
vim .zshrc
.zshrc
export GOOGLE_APPLICATION_CREDENTIALS="ダウンロードしたファイルパス"
  • .zshrcの更新。
ターミナル
source ~/.zshrc

これでいつでもローカル環境では参照できるようになります。

保存されているか確認

ターミナル
printenv | grep GOOGLE
=> export GOOGLE_APPLICATION_CREDENTIALS="ダウンロードしたファイルパス"

docker上でGOOGLE_APPLICATION_CREDENTIALSを適応

  1. 開発中のディレクトリにjsonファイルをコピーする。(ファイル名は変更しても問題ありません、今回はkey.jsonという名前で行います。)
  2. .gitignoreに追記する
.gitignore
/key.json
  • DockerfileでDocker内にコピーする
Dockerfile
COPY key.json key.json
ENV GOOGLE_APPLICATION_CREDENTIALS key.json

そしてdocker-compose build

rails編

  1. gem導入
gem 'google-cloud-translate'
  1. 私の場合は外部DBから取ってきた英文を日本語にして保存する感じなので下記を変えればいい感じですが。実際にviewから翻訳したい場合はリンクを参照してください。
seeds.rb
# 最初に作ったプロジェクトのIDです。そのまま書くのはあまりよろしくないです。
project_id    = "Your Google Cloud project ID"
# 実際に訳す文です
text          = "The text you would like to translate"
# 何に訳すかを指定します `"The ISO 639-1 code of language to translate to, eg. 'en'"`
language_code = "en"

require "google/cloud/translate"

translate   = Google::Cloud::Translate.new version: :v2, project_id: project_id
translation = translate.translate text, to: language_code

puts "Translated '#{text}' to '#{translation.text.inspect}'"
puts "Original language: #{translation.from} translated to: #{translation.to}"
私の場合
require "google/cloud/translate"

def translate(synopsis:)
  project_id    = Rails.application.credentials.api[:id]
  text          = synopsis
  language_code = 'ja'

  translate   = Google::Cloud::Translate.new version: :v2, project_id: project_id
  translation = translate.translate text, to: language_code

  return translation.text.inspect
end

最後に

今回は(v2)のGoogle Translation APIということをお忘れなく。
おしまい

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

オンプレミスのCentOS7上にKubernetes、Docker基盤を構築

記事の概要

オンプレミス(物理サーバあるいはVMWarePlayerなどの仮想マシン)上にKubernetes、Docker基盤を、手動(デプロイツール、サービスを使用しない)で構築する手順について記載します。

構築する目的としては、「Kubernetesが何をしているのか、その動作を理解する初めの1歩を踏み出すこと」です。

前提条件、環境

使用する環境は、「OS : CentOS7」、「ハードウェア:物理マシン、または、VMWare等の仮想マシン」です。

詳細な前提条件はKubernetes公式サイトの「始める前に」に記載されております。

実際に使用した環境は以下になります。

  • マスターノード(1台)

    • ハードウェア:デスクトップパソコン
    • メモリ:4GB
    • プロセッサ:2コア
    • ハードウェア:100GB
  • ワーカーノード(1台)

    • ハードウェア:VMWarePlayer14
    • メモリ:2GB
    • プロセッサ:2コア
    • ハードウェア:20GB
  • Kubernetesバージョン:1.17.3

導入方法

マスターノードの設定

基本設定

設定項目 設定値
ホスト名 master
IPアドレス 192.168.0.200
ゲートウェイ 192.168.0.1

swapの無効化

メモリ領域が不足した際に、HDD領域に仮想メモリを作って、そこを使用するようにするのがスワップ。
これを有効にしていると、メモリ不足には対応できるが、メモリよりもI/Oの遅いHDD領域を使用することでKubernetesの動作が遅くなる問題があり、無効化が必須になった。
一時的に無効化したあとで、恒久的に無効化する設定を行う。

一時的に無効化する。

swapoff -a

恒久的に無効化する。

vi /etc/fstab
以下の行をコメントアウト
# /dev/mapper/cl-swap     swap                    swap       defaults        0 0

Dockerインストール

Dockerはsystemdで実行するようにする。

※cgroupsでも実行することが可能だが、Docker cgroupsドライバーとk8s cgroupsドライバーが異なり、k8sが正常に動作しないことがあるため、systemdを使う。

  • 必要なパッケージのインストール
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
  • Dockerのリポジトリを指定
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
  • Dockerのインストール

1-1 バージョン指定なし
sudo yum install docker-ce docker-ce-cli containerd.io

1-2 バージョン指定あり
バージョン確認
yum list docker-ce --showduplicates | sort -r

バージョン指定してインストール
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

2 systemd経由で起動されるように設定
vi /etc/docker/daemon.json
----
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}  
----

mkdir -p /etc/systemd/system/docker.service.d

systemctl daemon-reload

3 自動起動有効化

systemctl start docker

※動作確認

systemctl start docker
docker run hello-world

----
Hello from Docker!  ←これが表示されていればOK! 
This message shows that your installation appears to be working correctly.
...

kubernetesのインストール

ネットワーク設定

トラフィックがiptablesを迂回して、正しくないルートを通るという問題があるため、明示的にiptablesを有効にしておく必要がある。

vi /etc/sysctl.d/k8s.conf

----
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
----

sysctl --system

ホスト名でアクセス出来るようにする。

vi /etc/hosts
----
192.168.0.200 master
192.168.0.201 node
----

SELinuxの無効化

コンテナがホストファイルシステムにアクセスするために、SELinuxを無効にする。
※kubeletがSELinuxをサポートするまでは必要。

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

yumのリポジトリを追加

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

インストール

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

自動起動有効化
systemctl enable --now kubelet

daemonの設定変更

dockerをsystemdで動かしているため、それをkubeletに伝える必要がある。

※デフォルトではkubeletは「cgroupfs」でdockerを動かそうとするため。

sudo vi /etc/sysconfig/kubelet

----
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
----

設定反映のためにkubeletを再起動する。

systemctl daemon-reload
systemctl restart kubelet

ポートの開放

以下のポートをLinuxのfirewalldで許可する。

プロトコル 通信の向き ポート 目的 使用ユーザー
TCP Inbound 6443* Kubernetes API server All
TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 10251 kube-scheduler Self
TCP Inbound 10252 kube-controller-manager Self
sudo firewall-cmd --zone public --add-port 6443/tcp --permanent
sudo firewall-cmd --zone public --add-port 2379-2380/tcp --permanent
sudo firewall-cmd --zone public --add-port 10250/tcp --permanent
sudo firewall-cmd --zone public --add-port 10251/tcp --permanent
sudo firewall-cmd --zone public --add-port 10252/tcp --permanent
sudo firewall-cmd --reload

クラスターの構築

kubeadmはkubenetesクラスターを構築するのを助けてくれるもの。

※現時点でのベストプラクティス。

コントロールプレーンノードの初期化

※コントロールプレーンノードは、etcdやapiがインストールされているノードのこと。つまりマスターノード。

※kubeletサービスが動いているとエラーが発生するため、systemctl stop kubelet でkubeletサービスを停止しておく。

sudo kubeadm init \
--apiserver-advertise-address 192.168.0.200 \
--kubernetes-version 1.17.3 \
--pod-network-cidr 10.244.0.0/16


以下のような出力をメモしておく。後でノードを追加する際に使用する。

kubeadm join 192.168.0.200:6443 --token zsczab.c5g3cgugsxwoyvws \
--discovery-token-ca-cert-hash sha256:1da2cb46ee192bce33c9eb7c2189e0e811daddb9f9e2e40144d6b190f04d00b5

configファイルの設定

rootユーザでkubectlを利用する場合、環境変数に、confファイルを登録する。

export KUBECONFIG=/etc/kubernetes/admin.conf

※kubeadm init実行時の出力に記載あり。

動作確認

kubectl get nodes

以下のような表示が出力されることを確認する。

NAME     STATUS     ROLES    AGE     VERSION
master   NotReady   master   3m58s   v1.17.3

コンテナネットワークインターフェース(CNI)の作成

kubernetesに展開

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

sudo firewall-cmd --zone public --add-port 8285/udp --permanent
sudo firewall-cmd --zone public --add-port 8472/udp --permanent
sudo firewall-cmd --reload

ワーカーノードの設定

基本設定

設定項目 設定値
ホスト名 worker
IPアドレス 192.168.0.201
ゲートウェイ 192.168.0.1

swapの無効化

マスターノードの設定と同じ方法で実行する。

Dockerインストール

マスターノードの設定と同じ方法で実行する。

kubernetesのインストール

ネットワーク設定

マスターノードの設定と同じ方法で実行する。

ポートの開放

以下のポートをLinuxのfirewalldで許可する。

sudo firewall-cmd --zone public --add-port 10250/tcp --permanent
sudo firewall-cmd --zone public --add-port 30000-32767/tcp --permanent
sudo firewall-cmd --reload

マスターノードに登録

kubeadm join 192.168.0.200:6443 --token zsczab.c5g3cgugsxwoyvws \
--discovery-token-ca-cert-hash sha256:1da2cb46ee192bce33c9eb7c2189e0e811daddb9f9e2e40144d6b190f04d00b5

※マスターノード構築時にメモしたkubeadmの出力を参照

動作確認

マスターノード上で以下のコマンドを実行する。

kubectl get node

以下のようにmasterとnodeが表示されていればよし。
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   9d    v1.17.3
node     Ready    <none>   9d    v1.17.4

参考資料

【cgroupsではなくsystemdを使用する理由】
https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0.3/troubleshoot/kubelet_fails.html

【Dockerインストール方法】
https://docs.docker.com/install/linux/docker-ce/centos/

【k8sインストール方法】
https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

【k8sクラスター構築方法】
https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

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

Doker Toolboxを使ってDjango開発環境を構築する

はじめに

この記事は主に自分用のDjango開発環境構築メモなので、至らない点も多いと思いますがご了承ください。タイトルの通り、Docker Toolboxを使ってDjango開発環境を構築する手順をまとめておきます。

1.Docker Toolboxを導入

ここは端折ります。(なら書くな)

2.Django開発環境を構築

DockerでDjangoの開発環境を作成を参考にして3つのファイルを用意し、Docker-compose up -d を行います。この記事はデータベースの初期化なども説明されており、めちゃくちゃありがたかったです。

3.ここからが問題だった!!

この環境に限っての話なのかどうなのかは分かりませんが、なぜかconection refusedの嵐です。localhost:8000にアクセスしても、0.0.0.0:8000にアクセスしてもダメでした。もちろん、curlでもダメ。

解決方法

解決方法は、dockerに振り分けられたIPアドレスでアクセスすることでした。つまり、http:// 'マシンIPアドレス' :8000でアクセスすることができました。default machineであれば、最初に立ち上げたときに出ているはずです。また、IPアドレスの確認方法であればググれば出てくるはずなのでわからない場合はググってみてください。

4.おわりに

こんなことで3時間くらい悩みました・・・。将来の自分や、自分と同じような状況に陥った誰かのためになれば良いなぁ。

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

ローカル環境/Dockerコンテナ間でAPIを叩く�

はじめに

Laravelのプロジェクト間でAPI通信をしたい、ということでGazzleを使って実装してみました。
まずはローカルで動作確認をしようとしたのですが、エラーが出てしばらく詰まっていたので解決法を残しておきます。

最初に書いたコード

APIを叩く側のコードです。

$client = new Client();
$url = 'http://localhost:8080/api/user/update';
$data = [
    ‘id’ => ‘1111’,
    ‘name’ => ‘鈴木’
];
$response = $client->request('POST', $url, ['form_params' => $data]);
echo $response->getBody()->getContents();

修正が必要なところ

APIのURLを指定しているんだけどその書き方がまずかったみたいです。
API側にはlocalhost:8080で接続できていたのでそのまま書いてました。
修正後のコードがこちら。

$url = 'http://host.docker.internal:8080/api/user/update';

localhostの箇所をhost.docker.internalと指定することでコンテナ間でAPIを叩くことができます。
host.docker.internalはコンテナからホスト(macOS)に接続するときに使うみたいです。

以下、公式ドキュメントから引用

I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST
The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal, which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac.

補足

やることはあまりないかもしれないですが、APIを実装したプロジェクト内でそのAPIを使う場合は下記のURLでいけました。

$url = 'http://localhost:80/api/user/update';
// 80はコンテナ側のポート番号
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

仮想環境 VagrantとDocker

4月からサーバサイドエンジニアとして働く学生です。
内定先の研修で「マークダウン形式で仮想環境についてのまとめを作成し、提出する」というレビュー方式があったので、どうせならこっちにもアウトプットしとけと思いまして投稿します。間違ってたらご指摘していただけると嬉しいです。

仮想環境

仮想環境とは

OS上で別のOSを動作させること

使用例

  • Windows上でアプリケーションを実際に動かすLinuxを起動しそこで開発を行う
  • Linux上で他のLinuxを起動しそこで開発を行う

仮想環境を使用して開発を行うメリット

  • 既存リソースの有効活用と管理コストの削減
  • 物理的なマシンの購入数を最小限に抑えることができる

Vagrant

Vagrantとは

構成内容を記述したFileを元に仮想環境の構築から設定までを自動で行うことができるTool

Vagrant環境構築の簡単な流れ

導入・設定

  1. PCの仮想化ソフトであるvirtualboxをインストール
    Windowsを使用の方はWindows hostsを、Macを使用の方はOS X hostsを選択
    ※Vagrantの最新バージョンがVirtual Boxの最新バージョンに対応していないため、Virtual Boxはver6.0.14をインストールするようにしてください(2020年3月現在)

  2. vagrantをインストール

    • Macを使っている人はbrew cask install vagrantで簡単にインストールすることが可能
    • インストールが終わったらVagarntコマンドが使用可能かどうか確認するためvagrant -vを実行
    • Virtual Boxのインストールが完了しているかどうか確認するため以下のコマンドを実行

※ Windowsの人の場合、ターミナルツールの導入が必要なため、RloginTeraterm等をインストール

パッケージを導入

sudo yum -y groupinstall "development tools"を実行することにより一気に開発に必要なパッケージをinstallができる

vagrantを使用してLaravel(PHP FW)のwelcome pageを表示する

必要となるパッケージ

  • apache / nginx
  • php version 7..

apacheの場合

installの手順

  1. sudo yum -y install httpdでapacheのinstallが完了し次にphpの最新versionをinstall

  2. apacheと同様なinstallですと古いphpがinstallされるため、CentoOSに最新のphpが取得できるように設定を行う

sudo yum -y install epel-release wget
# yumがパッケージを取得しにいく場所の更新を行います
sudo wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo rpm -Uvh remi-release-7.rpm
sudo yum -y install --enablerepo=remi-php71 php php-pdo php-mysqlnd php-mbstring php-xml php-fpm php-common php-devel
php -v

phpのversionが確認できたら完了

apaceh + php を使用してのLaravelのwelcome pageの表示

LaravelのProject作成には、composerが必要になるのでcomposerのinstallを行う

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
# グローバルにコマンドを使用するためにfileの移動を行う
sudo mv composer.phar /usr/local/bin/composer
composer -v

composer のversionが確認できたら完了

Laravelを導入する

  1. cd /vagrantでLaravelを作成するディレクトリに移動

  2. composer create-project laravel/laravel=5.8 --prefer-dist laravel_testを実行するとLaravelのProjectが作成される

apacheの設定fileにLaravelのProjectまでのPATHに変更する

apacheの設定fileは、/etc/httpd/conf/httpd.conf にあるため、このfileをRootの権限を借りて編集(sudo vi /etc/httpd/conf/httpd.conf)
編集には、普段使うエディタを使用せず元々CentOSに存在するviを使用し行う

以下編集箇所

# DocumentRoot

DocumentRoot "/var/www/html"

#↓ 以下に変更

DocumentRoot "/vagrant/laravel_test/public"

# Directory

<Directory "/var/www/">
  AllowOverride None
  Require all granted
</Directory>

#↓  以下に変更

<Directory "/vagrant/laravel_test/public"> # ここを変更
  AllowOverride All  # ここを変更
  Require all granted
</Directory>

# User, Group

User apache
Group apache

# ↓  以下に変更

User vagrant
Group vagrant

編集が終わったら一度apacheを起動(sudo systemctl start httpd)
また、apacheが正常に起動しているか確認(sudo systemctl status httpd)

// コマンド実行結果
 ● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 土 XXXX-XX-XX XX:XX:XX UTC; 2s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 16536 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─16536 /usr/sbin/httpd -DFOREGROUND
           ├─16537 /usr/sbin/httpd -DFOREGROUND
           ├─16538 /usr/sbin/httpd -DFOREGROUND
           ├─16539 /usr/sbin/httpd -DFOREGROUND
           ├─16540 /usr/sbin/httpd -DFOREGROUND
           └─16541 /usr/sbin/httpd -DFOREGROUND

 X月 XX XX:XX:XX localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
 X月 XX XX:XX:XX localhost.localdomain httpd[16536]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using ... message
 X月 XX XX:XX:XX localhost.localdomain systemd[1]: Started The Apache HTTP Server.
 Hint: Some lines were ellipsized, use -l to show in full.

Activeの箇所にinactiveあるいはfaliedという記述がある場合は、apacheの起動ができていないか設定ファイルの編集ミスで起動に失敗しているため、再度コマンドを実行し直すか、編集した箇所を見直す必要がある

ファイヤーウォールの起動

ファイヤーウォールに対してconfig.vm.network "forwarded_port", guest: 80, host: 8080のポートを経由したhttp通信によるアクセスを許可するためのコマンドを実行

#### ファイヤーウォールの起動
sudo systemctl start firewalld.service
sudo firewall-cmd --add-service=http --zone=public --permanent
# 新たに追加を行ったのでそれをファイヤーウォールに反映させるコマンドも合わせて実行します
sudo firewall-cmd --reload

この状態で画面を確認し、もし表示されなかったのならばsudo systemctl restart httpdを実行

Laravelのwelcome画面が確認できたら完了

表示されなかったときの対処

  1. Laravelのwelcomeページが表示されず、Forbiddenという403エラーが出た場合、sudo vi /etc/selinux/configを実行して、viでSELinuxの設定を変更

  2. 「SELinux コンテキスト」の不一致によりエラーが出ているため、SELinuxを無効化(今回はローカル環境なので無効にしてしまっても問題ないが、本番環境構築のときは別のアプローチが必要)

  3. viエディタが開き設定ファイルが表示されるため、SELINUX=enforcingSELINUX=disabledと書き換えて保存 (:wq)

  4. 設定を反映させるためにvagrantを再起動する必要があるため、 vagrantから一度ログアウト(exit)して再起動(vagrant reload)

  5. ロードが完了したら再度vagrantにログイン(vagrant ssh)

  6. 再度Apacheを起動(sudo systemctl start httpd)

これでLaravelのwelcomeページが確認できたら完了

Nginxの場合

Laravelのwelcome画面の表示

起動状態であるapacheを一度停止(sudo systemctl stop httpd)
nginxを使用する上で必要となるものphp-fpmは、先ほどのphpの導入の段階でInstallを済ませてある

NginxのInstall

  1. できるかぎり最新をInstall(sudo vi /etc/yum.repos.d/nginx.repo)し、作成したら自動でviというエディタが立ち上がる
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=0
enabled=1

2.書き終わったらesc + :wqを実行

3.fileの保存が出来たらsudo systemctl start nginxを実行しNginxのInstallを行う

4.ブラウザにて192.168.33.10と入力しwelcomeページが確認できたら完了

Laravelの画面を表示

apacheでLaravelを表示した際と同様に設定fileがnginxにも存在しているため、編集を行う

nginxの設定fileを編集(sudo vi /etc/nginx/conf.d/default.conf)

server {
  listen       80;
  server_name  192.168.33.10; # Vagranfileでコメントを外した箇所のipアドレスを記述してください
  root /vagrant/laravel_test/public; # 追記
  index  index.html index.htm index.php; # 追記

  #charset koi8-r;
  #access_log  /var/log/nginx/host.access.log  main;

  location / {
      #root   /usr/share/nginx/html; # コメントアウト
      #index  index.html index.htm;  # コメントアウト
      try_files $uri $uri/ /index.php$is_args$args;  # 追記
  }

  # 省略

  # 以下の該当箇所のコメントアウトを指定の箇所外し、変更する場所もあるので変更を加える
  location ~ \.php$ {
  #    root           html;
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  /$document_root/$fastcgi_script_name;  # $fastcgi_script_name以前を /$document_root/に変更
      include        fastcgi_params;
  }

  # 省略

次にnginxを使用する上で必ず必要になるphp-fpmの設定fileを編集(sudo vi /etc/php-fpm.d/www.conf)

;24行目近辺
user = apache
↓ 変更
user = vagrant
group = apache
↓ 変更
group = vagrant

設定fileの変更に関しては、以上となるため、起動させる(nginxの場合、再起動)
sudo systemctl restart nginx
sudo systemctl start php-fpm
ブラウザにて確認できたら完了

Docker

Dockerとは

仮想環境構築を行うためのツール

Docker環境構築の簡単な流れ

コンテナ型仮想環境の特徴

  • インフラ(サーバ環境)をソースコードで管理することが可能で複数人での開発に向いている

  • VagrantやVirtualBoxを使用した仮想環境とは異なり、起動が早く、また使用するtoolごとにコンテナを分けて管理することが可能になる
    今回はDocker for Macを使用

準備

ダウンロード方法は2種類あるが今回は、Homebrew 経由でinstallを行う

  1. PCにDocker関連のパッケージ等があるかどうか確認(brew list)
    結果で表示された物の中にDockerに関するものがある方は、必ずuninstallを行う

  2. installを行う(brew cask install docker)

  3. versionの確認(docker --version)
    問題なくversionが確認できたら完了
    versionの確認が取れない場合は、dockerを個別に起動(open -a "docker")

LaravelのProjectを準備

後々Laradockを導入する際に使用するディレクトリを用意しそこにLaravelを作成

  • Laradockは、Laravelの開発環境をDocker Composeを使用して簡単に構築ができる
  • Docker Composeを使用してdocker-compose.ymlというもので複数のコンテナを一括起動、停止を可能とすることができる

mkdir docker_dir && cd docker_dir
composer create-project laravel/laravel laravel_docker

早速起動を行い、必要なものをGithubからClone

起動(open -a "docker")を行い、実行したら上部に存在するmenuの箇所にクジラが現れ、かつdockerのwindowが表示される

次に今回dockerを使用してLaravelの環境構築するにあたり便利なLaradockを使用する
リンク先のClone用URLを取得しCloneを行う

# docker_dir
git clone https://github.com/laradock/laradock.git
cd laradock
cp env-example .env

プロジェクトごとにdockerマシンを区別して使うために、envファイルのDATA_PATH_HOST の設定をLaravelのプロジェクト名と同じにしておく

DATA_PATH_HOST=~/.laradock/data
# ↓ 変更
DATA_PATH_HOST=~/.laradock-laravel_docker/data

laradockにあるもので必要なものだけをbuild

コンテナの作成(docker-compose build workspace mysql apache2 nginx php-fpm)
コンテナを起動する(docker-compose up -d workspace apache2 mysql)を実行
docker-composeで一元管理しているコンテナの状態を確認(docker-compose ps)

コマンド実行結果

Name Command State Ports
laradock_apache2_1 /opt/docker/bin/entrypoint ... Up 0.0.0.0:443->443/tcp, 0.0.0.0:81->80/tcp
laradock_docker-in-docker_1 dockerd-entrypoint.sh Up 2375/tcp, 2376/tcp
laradock_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3309->3306/tcp, 33060/tcp
laradock_php-fpm_1 docker-php-entrypoint php-fpm Up 9000/tcp
laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp

5つのコンテナが立ち上がっていること(Up)が確認できたら'http://localhost'へアクセス
何も表示されないはずなのでブラウザで確認できるようにまずapacheの設定fileを編集

Apacheのfileを編集

対象fileは、laradock/apache2/sites/default.apache.conf

<VirtualHost *:80>
  ServerName laradock.dev
  # ↓ 変更
  ServerName localhost
  DocumentRoot /var/www/
  # ↓ 変更
  DocumentRoot /var/www/laravel_docker/public/
  Options Indexes FollowSymLinks

  <Directory "/var/www/">
  #↓ 以下に変更です
  <Directory "/var/www/laravel_docker/public">
    AllowOverride All
    <IfVersion < 2.4>
      Allow from all
    </IfVersion>
    <IfVersion >= 2.4>
      Require all granted
    </IfVersion>
  </Directory>

</VirtualHost>

この編集を終えた段階で再度build を行う
だdocker-compose up で起動した場合のLogを吐き出し続けるため、起動そのものをバックグラウンドで起動をし続けたいのでup -d とする(docker-compose up -d workspace apache2)
これでバックグラウンドでの起動が行えるため、http://localhostで確認
問題なく画面が表示されたら次にnginx を使用しての画面の表示を行う

Nginxのfileを編集

作業を開始する前にapacheの起動を止める(docker-compose stop apache2)
編集fileは、nginx/sites/default.confになる

server {

    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    # 以下のように編集をしてください
    server_name localhost;
    root /var/www/laravel_docker/public;

 # 以下省略

}

起動して確認(docker-compose up -d --build nginx)
再度ブラウザにてhttp://localhostで確認

Laravelを動かす

  1. ToDoアプリのファイル(以前のlaravelの研修で作成した物です)をlaradockのフォルダがあるディレクトリに移動
  2. 移動後にここまでで学習した(編集した)fileを再度移動したアプリケーション用に編集

DBの設定を行う

.envファイルの編集

DB_CONNECTION=mysql
DB_HOST=mysql        # 変更
DB_PORT=3306
DB_DATABASE=default  # 変更
DB_USERNAME=root # 変更
DB_PASSWORD=root # 変更

この変更は、ホスト側からでもdocker環境内からの編集でも問題ない

docker環境内に入る方法

$ docker-compose exec xxxx bash
実際にコマンド実行した後の表示は以下のような内容になる
root@dga8g9a777:/#
この dga8g9a777 という数字は、異なると思うので同じでなくても問題ない

php artisan migrateを実行しこのアプリケーション用にDBを作成

方法は、2種類ありdocker-composeコマンド経由とdocker環境内からの実行がある

docker環境内

$ docker-compose exec workspace bash
root@ga9842jagf:/# cd laravel_app
root@ga9842jagf:/# php artisan migrate

docker-composeコマンド経由
$ docker-compose exec workspace php artisan migrate

アプリケーションを起動

$ docker-compose up -d workspace nginx mysql

VagrantとDockerの違い

Vagrant

  • 構成情報を記述した設定ファイル (Vagrantfile)を元に、仮想環境の構築から設定までを自動的に行うためのツール
  • 他の仮想化技術(VirtualBoxやvmwareなど)と併用して利用する
  • サポートする仮想化環境では、OSもインストールする必要がある

    Docker

  • OSレベルの仮想化を実現するためのソフトウェア

  • 単体で仮想化環境を構築できる

  • OSは共有される

最後に

これをいざ数ヶ月後にやってみてと言われたら怖くて仕方がありませんが、忘れないよう何度かやってみようと思います。これまでに行ったRegisterとloginを使ったlaravelのtodoアプリのアウトプットも忘れそうで怖いので時間があればしてみようと思います。

参考文献

仮想環境とは?その構築方式やメリットに関しても徹底解説
vagrantとdockerの違いをわかりやすく解説!機能と使い分け方を紹介

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

fasttextでwebサイト分類したかった

Wano株式会社のfushimiです。
先日、弊社の2020年の開発合宿(一泊二日)でやったネタを投稿します。

合宿日記も兼ねてるので完全にとりとめのない時系列順の出来事の羅列になりますが、ご容赦ください。

未知のwebサイトの自動カテゴリ分けをしよう

自然言語処理や機械学習は全然わからん勢なのですが、せっかくの合宿なのでwebサイトのコンテンツ解析をして遊んでみました。

作るものとしては表題通り、webサイトのカテゴリ分類器 です。

あらかじめ決めたカテゴリ分類に応じて、入力された未知のWebサイトが適切にカテゴライズされることを目的とします。

アプローチ

学習

  • カテゴリごとのメディア記事をクロールして大量に集める
  • 記事をきれいにする
  • 記事を形態素解析する
  • fasttextで学習済みモデルを作る

テスト

  • 入力されたwebサイトのコンテンツをいくつか集める
  • コンテンツをきれいにする
  • コンテンツを形態素解析する
  • 学習済みモデルに食わせて思った通りにカテゴリ分けできたら成功

fasttext

AWSのML系サービスで遊んでみることも考えましたが、今回はfasttextによる単語ベクトルの算出というアプローチをとってみました。

fasttextは、facebook製の自然言語処理ライブラリです。word2vecと同じく単語ベクトルを算出するライブラリと理解しました。
word2vec(Skip-Gram Model)の仕組みを恐らく日本一簡潔にまとめてみたつもり

環境構築

以下のようなDockerfileを構築しました。
今回は慣れてるgoとdockerで作業を始めてしまったので、その影響でいろいろ入っています。

FROM ubuntu:18.04

ENV HOME /root
WORKDIR $HOME
ENV DEBIAN_FRONTEND noninteractive
SHELL ["/bin/bash", "-c" ]

RUN apt-get update && \
    apt-get -y install wget python3 python3-pip curl groff  gcc make cmake g++ openssl git tree  ca-certificates --no-install-recommends unzip
#build-essential
RUN echo "stty rows 50 cols 200" >> ~/.bashrc

RUN wget https://github.com/facebookresearch/fastText/archive/v0.9.1.zip
RUN unzip v0.9.1.zip
RUN cd fastText-0.9.1 && make && cp  ./fasttext $HOME/
RUN cp $HOME/fasttext /usr/bin/ &&  which fasttext

WORKDIR $HOME

# mecab
RUN apt-get install -y mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8

# 辞書
RUN apt-get install  -y xz-utils patch file sudo
RUN cd $HOME && git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
RUN cd mecab-ipadic-neologd && ls && ./bin/install-mecab-ipadic-neologd -n -y
RUN echo `mecab-config --dicdir`"/mecab-ipadic-neologd"

#### any env
RUN git clone https://github.com/anyenv/anyenv $HOME/.anyenv && \
    echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >>  $HOME/.bashrc && \
    echo 'eval "$(anyenv init -)"' >>  $HOME/.bashrc
ENV ANYENV_HOME $HOME/.anyenv
ENV ANYENV_ENV  $ANYENV_HOME/envs
ENV PATH $ANYENV_HOME/bin:$PATH

ENV ANYENV_DEFINITION_ROOT $HOME/.config/anyenv/anyenv-install
RUN mkdir -p $ANYENV_DEFINITION_ROOT && \
    git clone https://github.com/anyenv/anyenv-install $ANYENV_DEFINITION_ROOT &&\
    which anyenv && ls $ANYENV_DEFINITION_ROOT


### go
ENV GO111MODULE on
RUN anyenv install goenv
ENV PATH $ANYENV_ENV/goenv/bin:$ANYENV_ENV/goenv/shims:$PATH
ENV GOENV_ROOT $ANYENV_ENV/goenv
ENV GOPATH /root/go
RUN goenv install 1.14.0 && \
    goenv global 1.14.0 && \
    goenv rehash && \
    echo 'eval "$(goenv init -)"' >> ~/.bashrc
ENV PATH $PATH:/usr/local/go/bin:$GOPATH/bin
ENV GOBIN $GOROOT/bin
RUN echo 'export GOBIN=$GOROOT/bin' >> ~/.bashrc
RUN echo 'export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin' >> ~/.bashrc


##### aws-cli
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" &&  \
    unzip awscliv2.zip && \
    ./aws/install


#### 文字コードの設定
ENV LANG=C.UTF-8
ENV LANGUAGE=en_US:


##### after build
RUN apt-get clean


学習

学習元となるメディアカテゴリを決めよう

そもそもはfasttextを選んだのは、機械学習で大量のテキストをカテゴリ別に分類してみよう! を見ていて、「おもしろそう!」と思ったからです。なので先にカテゴリーを決めておくというアイディアもここから来ています。

まず、分類するメディアのカテゴリを以下のように決定します。

  • IT系
  • 医療系
  • ママ/子育て系
  • 金融系
  • 音楽系

粒度がバラバラじゃん!って話なのですが、個人的にサンプルが思いつきそうなメディアがざっくりこのへんだったのでこのままいきます(笑)

カテゴリごとの記事を集めよう

Artboard.png

カテゴリごとに7-10サイト、aタグで同ドメインのものを漁って各100-300ページくらい集めることにしました。
学習対象としてはドメインレベルで専門情報を扱ってるサイト(ex . ongaku.news.jp) のみにして、複数のカテゴリ記事を持っている統合情報メディアみたいのは今回は使いません。
aタグベースで関連記事を漁っていくのに当たり、いろんなカテゴリの記事があると数時間で学習元として使うには大変そうだったからですね。

ちなみにGoで書いてます。goroutineはすごい。

集めた記事をきれいにしよう

合宿一日目の夕方くらいから方針決めてはじめてみたのはいいんですが、当たり前ですがそもそもこの作業自体が大変でした...

  • 大変だったこと
    • SJISのサイト -> utf8にする
    • scriptだのstyleだのiframeだのいらないタグを排除する
    • 排除するにしてもDOMのセレクタなんか忘れたわ...
  • goroutineはすごい

このように、「きれいな学習用データを集める」という作業だけで一日目の深夜までいってしまいました。
このへんの質があとで響いてきます...。

ちょっと記事に重み付け

本文のみでなく、いくつかのタグは「そのサイトにとって大事なもの」とみなして、抽出分をさらに記事にくっつけて強化しています。
どこぞのRTBのブログでこれをコンテンツ解析に使ってるっていってたので。

  • title
  • meta[name=description]
  • meta[name=keywords]

形態素解析する

おなじみのmecabを使って形態素解析をしました。
辞書データとしてmecab-ipadic-neologdのお世話になりました。
そのままだと余計な品詞でゴミがのりそうだったので、試しに名詞形の影響力を強くしています。 (といっても複数回くっつけ直しただけ)

goで作業してたのでmecabバインディングを使いましたが、やはりこの手のツールはpythonが一番豊富でしたね...

ここまでの作業で作ったファイルがこんな感じの1枚のテキストです。
(108MBほどになりました)

  • IT系 => _labelit
  • 医療系 => __label_medical
  • ママ/子育て系 => __label_mama
  • 金融系 => __label_money
  • 音楽系 => __label_music

としてラベリングしています。

src.txt
__label__music, All All Digital Digital Music Music と は 「 All All Digital Digital Music Music 」 は 、 世界 世界 最先端 最先端 の 音楽 音楽 ビジネス ビジネス と エンタテインメント・テクノロジー エンタテインメント・テクノロジー にで は 、 インディペンデント インディペンデント な アーティスト アーティスト や 作曲 家 、 プロデューサー プロデューサー 、 音楽 音楽 クリエイター クリエイター から 、 レコード レコード 会社 会社 を はじめ と する 音楽 音楽 業界 業界場 分析 、 音楽 音楽 ビジネス ビジネス に 影響 を 与える 戦略 戦略 や アイデア アイデア 、 未来 未来 に 向け て 考える べき ビジネス ビジネス モデル モデル や マーケティング マーケティング 、 テクノロジー テクノロジー 、 データ デー続 的 な

....
__label__mama, 妊娠 が 成立 する と  体 に 様々 な 変化 が 現れ ます が 、 その 代表 的 な もの が 「 つわり つわり 」 です 。 吐き気 吐き気 や 眠気 眠気 、 頭痛 頭痛 など 様々 な 不快 症状 症状 が 現れる ので 、 妊娠 初期 初期 は妊婦 さん にとって は 本当に 辛い 時期 です ね 。 気持ち 気持ち 悪く て 何 も 食べ たく なくなる かも しれ ませ ん 。 しかし 、 つわり つわり の 症状 症状 を 軽減 し て くれる 効果 効果 が 期待 できる 栄養素 栄養素 も ある ので 、  妊娠 する

fasttextで学習済みモデルを作る

以上で作ったsrc.txtからおもむろに学習済みモデルを作ります。

fasttext supervised -input src.txt -output output.model

output.model.bin と output.model.vec が生成されました。

できあがったモデルで遊ぶ

取得してきた「未知の」webサイトに対して何ページかのスクレイプと「きれいにする」までの作業をほどこし、1枚のテキストにします。

ここでは弊社の開発者ブログを「未知の」Webサイトとし、wano.txtを生成しました。

wano.txt
Wano Wano Group Group Developers Developers Blog Blog Wano Wano グループ グループ エンジニア エンジニア による 開発 ブログ ブログ New New Posts Posts 1 … About About Wano Wano グループ グループ の エンジニア エンジニア や デザイナー デザイナー が 使っ て いる 技術 技術 、 興味 興味 の ある 技術 技術 、 ( 色んな 意味 で ) はまっ て いる 技術 技術 など を お伝え し て いき ます 。 KeywordsWano KeywordsWano Group Group Developers Developers Blog Blog | Wano Wano グループ グループ エンジニア エンジニア による 開発 ブログ ブログ Wano Wano Group Group Developers Developers Blog Blog | Wano Wano グループ グループ エンジニア 
...

学習済みモデルに喰わせます。

fasttext predict-prob output.model.bin /wano.txt 5
__label__it, 0.761388 
__label__music, 0.11441 
__label__mama, 0.059265 
__label__money, 0.0472763 
__label__medical, 0.0177098

ITというカテゴリワードがドンピシャだったせいか、__label__it (ITカテゴリ)のスコアが一番高く反映されました。いいかんじですね。

感想/課題つらつら

もちろん判定がうまくいかないサイトもあって、やはりスクレイプとカテゴリ分けの健全度が全て...と言う感想でした。
合宿の深夜でどんなソースをいれても金融メディア判定になることがあって、スクレイプを見直す羽目に。
ただ、付け焼き刃のアプローチでもこのようになかなかおもしろい分類器ができあがったので、もうすこし深めてみたいと考えています。

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

Windows10で、Open edxをDockerにインストールする方法(自分用)

はじめに

この記事は、未来の自分が今回のように苦労しないため、また頭の整理を行うために書いています。そのため、写真や図などがあまりなく、読みづらいと思います。すみません。
時間があるときにもしかすると写真やより詳細な説明を付け加えるかもしれません。

1.Docker ToolBoxをインストール

まず、公式ページ(https://docs.docker.com/toolbox/toolbox_install_windows/) からDocker Toolboxをインストールします。私のノートPCはWindows10 Homeの為、Toolboxを使わざるを得ませんでしたが、Windows10 ProやMacの場合は公式ページを参考にしてDockerをインストールしましょう。この際、VirtualBoxが既にあるとややこしいことになります。アンインストールしましょう。勝手にDockerについてきます。
インストール自体は簡単なのですが、落とし穴も多いので次の記事(https://web.plus-idea.net/on/docker-toolbox-on-windows10-install/) などを参考にすると◎。ここで一回Docker quickstart terminalを立ち上げておきましょう。立ち上げた後は[docker stop default]で終了します。参考(https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53)

2.環境変数にCygwinのPathを追加

Open edxをインストールする際はmakeコマンドが必要になります。この記事(https://qiita.com/shirry0129/items/626fc62e2cedb92eebb4) などを参考にしつつ、Pathを通してmakeコマンドを使えるようにしておきましょう。gitは予め入っていると思いますが、無かったらインストールです。

3.VirtualBoxでdefaultというマシンの設定をいじる

Open edxが満足に動作する環境は、メモリ6Gかつ2CPUです。Virtual Boxで 設定>システム>マザーボード に移動してメインメモリを6G(6144M)まで増やします。次に、マザーボードの横のタブの プロセッサー に移動して2CPUまで増やしましょう。
もし見当違いなことをしていたらすみません。

4. git clone https://github.com/edx/devstack を実行

docker quickstart terminalを管理者権限で立ち上げ、そこでgit clone https://github.com/edx/devstack を実行します。何らかの形で管理者権限を持たなければPermission deniedが出るはずです。その後、おそらくProgarm Files/Docker Toolboxに新しいディレクトリが作られると思いますが、このディレクトリを別の、パスにスペースを含まない場所(例:C直下にOpenedxディレクトリを作成し、その中に入れる)などに移します。こうしないと、以降のmake時にエラーが出ます。(Linuxでは何も考えなくても大丈夫)もし、この方法以外にいい方法があれば教えてください。(この方法しか思いつかなかった)
以降は以下のサイトを参考にしながら進めます。 
https://edx.readthedocs.io/projects/edx-installing-configuring-and-running/en/latest/installation/install_devstack.html

5.コマンドを実行

cd devstackでdevstackディレクトリに移動し、
-make requirements
-make dev.checkout(要らないかも)
-make dev.clone
-make dev.pull
-make dev.provision
を順に実行していきます。めちゃくちゃ時間がかかるため、注意です。これで一段落ついた感じでしょうか。

6.Open edxを立ち上げる

-make dev.up
を実行して、Open edxを立ち上げます。この際、Timeoutになる可能性があるので、COMPOSE_HTTP_TIMEOUT=240 make dev.up とした方が良いかもしれません。

7.現在発生している問題

make dev.pull実行時に「no space left on device」というエラーメッセージが出て、実行に失敗します。
参考にした記事1
参考にした記事2
このあたりの記事を参考にしつつ、試行錯誤しています。

8.おわりに

現時点ではここまでです。また作業が進み次第追記していきます。

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

dockerで突如mysql:5.5系が起動しなくなった

複数のwordpress案件をdockerで開発していたところ、

以前は立ち上がっていたプロジェクトで
docker-compose upした際、
wpのコンテナは起動するのにmysql:5.5.58イメージが起動しない(立ち上がった直後強制終了)
という状態に(´;ω;`)

試したこと(全部だめ)

  • コンテナ再スタート
    docker-compose stop
    docker-compose up

  • コンテナ削除・再構築・スタート
    docker-compose down
    docker-compose build
    docker-compose up

  • 別フォルダに再度環境構築
    git clone
    docker-compose build
    docker-compose up

  • macのストレージを掃除(メモリ不足かと思った)

  • mac再起動(※セーフブート後、再構築)

すべて変わらず。

エラーログ

200317  8:52:24 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
200317  8:52:24 [Note] mysqld (mysqld 5.5.58) starting as process 1 ...
200317  8:52:24 [Note] Plugin 'FEDERATED' is disabled.
200317  8:52:24 InnoDB: The InnoDB memory heap is disabled
200317  8:52:24 InnoDB: Mutexes and rw_locks use GCC atomic builtins
200317  8:52:24 InnoDB: Compressed tables use zlib 1.2.3
200317  8:52:24 InnoDB: Using Linux native AIO
200317  8:52:24 InnoDB: Initializing buffer pool, size = 128.0M
200317  8:52:24 InnoDB: Completed initialization of buffer pool
InnoDB: Error: checksum mismatch in data file ./ibdata1
200317  8:52:24 InnoDB: Could not open or create data files.
200317  8:52:24 InnoDB: If you tried to add new data files, and it failed here,
200317  8:52:24 InnoDB: you should now edit innodb_data_file_path in my.cnf back
200317  8:52:24 InnoDB: to what it was, and remove the new ibdata files InnoDB created
200317  8:52:24 InnoDB: in this failed attempt. InnoDB only wrote those files full of
200317  8:52:24 InnoDB: zeros, but did not yet use them in any way. But be careful: do not
200317  8:52:24 InnoDB: remove old data files which contain your precious data!
200317  8:52:24 [ERROR] Plugin 'InnoDB' init function returned error.
200317  8:52:24 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
200317  8:52:24 [ERROR] Unknown/unsupported storage engine: InnoDB
200317  8:52:24 [ERROR] Aborting
200317  8:52:24 [Note] mysqld: Shutdown complete

エラーログでググって、下記の記事にたどり着いたのだけど、

MySQL5.5系がservice mysqld startで起動しない

Mysql自体はruby案件で必要だったのでHomebrew経由でインストールしたことあるけれど、
色々試した結果、
dockerってmysqlもきっと内部で環境もっているよね・・?
・・となんとなく思い、docker関連で情報集める。

解決!

まずはこちらを参考に、docker内をゴミ掃除。

dockerでいらないimage,container,networkを一括削除する

  • 使ってないコンテナ
  • 使ってないイメージ
  • 使ってないネットワーク

を削除後、 docker-compose build --no-cache を試す。
変わらず。

泣きそう・・?はつづく。さらに調べると、こちらの記事を発見。

docker-composeでmysqlのバージョン変えたら起動しなくなった

わたしの場合、docker-compose.ymlは特にいじっていなかったのだけど、
実はこの現象が起こる前、別案件のdockerの環境構築を行っていた。

そちらのdocker-compose.ymlを確認すると、
mysqlのバージョンはmysql:5.7.21になっていて、
(どちらもcontainer_nameちゃんとついていたんだけども、)
なんかdocker内部のmysqlのバージョンのログ?が元になっているのだとすると、
効果あるかも・・・・ということで、先程やっていなかった「ボリュームの削除」を実行。

コンソールで出力してみたものの、volume IDがわからなかったので、
Visual Studio CodeのDocker ExtentionのGUIから削除。
スクリーンショット 2020-03-17 19.37.08.png
↑右クリック+「Remove」

その後
docker-compose build --no-cache
すると!!!

動いた〜〜〜〜!!!!??✨

終わり

本当に・・3時間位摩耗したので、先人の記事に救われて感謝。
すべての人がこれで解決するのかは謎ですが、困ったら一度お試しを..!御加護を祈ります。

(解決はできたけど、結局、内情というか根本的な原因についてはわかってない・・・)

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

Docker for Mac にディスク容量が圧迫されていたので 45GB 近く削除した

kanaiyuki@y-kanai:~$ sudo du -g -x -d 5 / | awk '$1 >= 5{print}'
Password:
6   /Library
du: /private/var/db/fpsd/dvp: Operation not permitted
du: /private/var/db/ConfigurationProfiles/Store: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/SafariFamily: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.progressd/ClassKit: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.Safari/SafariFamily: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.LaunchServices.dv: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.nsurlsessiond: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.routined: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/C/com.apple.WebKit.WebContent.Sandbox: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/C/com.apple.QuickLook.thumbnailcache: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/C/com.apple.WebKit.Networking.Sandbox: Operation not permitted
du: /private/var/folders/4c/fpqq2qq94pv660s6g75_cmwh0000gp/0/com.apple.LaunchServices.dv: Operation not permitted
du: /private/var/folders/4c/fpqq2qq94pv660s6g75_cmwh0000gp/0/com.apple.nsurlsessiond: Operation not permitted
du: /private/var/folders/4c/fpqq2qq94pv660s6g75_cmwh0000gp/0/com.apple.routined: Operation not permitted
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000sm00006d/0: Operation not permitted
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000sm00006d/C: Operation not permitted
8   /System/Library
8   /System
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000y800007k/0/com.apple.nsurlsessiond: Operation not permitted
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000z000007r/0/com.apple.nsurlsessiond: Operation not permitted
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000z000007r/0/com.apple.routined: Operation not permitted
33  /Users/kanaiyuki/Library/Containers/com.docker.docker
34  /Users/kanaiyuki/Library/Containers
6   /Users/kanaiyuki/Library/Caches
47  /Users/kanaiyuki/Library
59  /Users/kanaiyuki
59  /Users
5   /Applications/Xcode.app/Contents/Developer/Platforms
6   /Applications/Xcode.app/Contents/Developer
7   /Applications/Xcode.app/Contents
7   /Applications/Xcode.app
13  /Applications
92  /
kanaiyuki@y-kanai:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                               NAMES
c9d90fae1621        mysql               "docker-entrypoint.s…"   6 months ago        Exited (255) 6 months ago   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
cac22c0e053e        a54f69c41d81        "bundle exec rails s…"   6 months ago        Exited (0) 6 months ago                                         elastic_merkle
b9ff4823194d        a54f69c41d81        "bundle exec rails s…"   6 months ago        Exited (0) 6 months ago                                         bold_williams
644251383d71        a54f69c41d81        "bundle exec rails s…"   6 months ago        Exited (0) 6 months ago                                         dreamy_williamson
d955d70ccdce        a54f69c41d81        "bundle exec rails s…"   6 months ago        Exited (0) 6 months ago                                         sweet_grothendieck
3e1b3d3fee13        a54f69c41d81        "-b 0.0.0.0"             6 months ago        Created                     0.0.0.0:32772->3000/tcp             hardcore_euler
4fa836fa71b3        a54f69c41d81        "bundle exec rails s…"   6 months ago        Exited (0) 6 months ago                                         sharp_sammet
86254ad3f5e4        a54f69c41d81        "-b 3000"                6 months ago        Created                     0.0.0.0:32770->3000/tcp             silly_allen
2e032a14cd6f        a54f69c41d81        "bundle exec rails s…"   6 months ago        Exited (0) 6 months ago                                         keen_noyce
5f0cc85eeddd        38e04b18344c        "bundle exec rails s…"   6 months ago        Exited (1) 6 months ago                                         wizardly_ganguly
531880a9a91e        38e04b18344c        "-p 2999"                6 months ago        Created                     3000/tcp                            crazy_proskuriakova
de454f9316a3        38e04b18344c        "-p 2999"                6 months ago        Created                     3000/tcp                            priceless_goldberg
c3d216a255b8        38e04b18344c        "/bin/bash"              6 months ago        Exited (130) 6 months ago                                       heuristic_chandrasekhar
a4ae6ec61b7f        38e04b18344c        "-p 3000"                6 months ago        Created                     3000/tcp                            kind_jennings
b22b3fcc88e4        38e04b18344c        "-p 3000"                6 months ago        Created                     3000/tcp                            exciting_williams
066e82b06c3e        38e04b18344c        "-p 3000"                6 months ago        Created                     3000/tcp                            goofy_maxwell
a32ec3e7757b        38e04b18344c        "-p 3000"                6 months ago        Created                     3000/tcp                            flamboyant_tu
980a59485f72        38e04b18344c        "-p 3000"                6 months ago        Created                     3000/tcp                            cocky_heyrovsky
1a5e17e9e46d        38e04b18344c        "-p 3000"                6 months ago        Created                     3000/tcp                            focused_yonath
kanaiyuki@y-kanai:~$ docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              70721738e348        6 months ago        3.71GB
ruby                2.4                 7ea04a8ceb6e        6 months ago        842MB
mysql               latest              62a9f311b99c        7 months ago        445MB
kanaiyuki@y-kanai:~$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
c9d90fae16210f40ff271e21d0b06883db1e0957bad1d565a1d6fd9c8d702ea7
cac22c0e053ee18d5d6a1337430222e5ef7d69fd8a712174a386d058e3b06c8b
b9ff4823194da449d051ac060569bfdff3cb2dcecc02f292768819c54f24a6a2
644251383d718eb4f45371f3e5b5e76992071597a3ab2dddbedadcb64de68023
d955d70ccdce3cf0b62170b80279995795adc0481439272bd0c703c9b9f2a5f2
3e1b3d3fee13edfabedbf91a726ed25f4ee1e666c3ce4a6e6d6ad0d1e29c6845
4fa836fa71b3f6a71368e59a1ffda39c2e6391d9db0bf1950d5147c02f0f3927
86254ad3f5e4120dd403c1cfc63eee86f00c64d5eeb051209c5cd4fa87f4dc12
2e032a14cd6fd51dfaf50746085ce0cf3477d9a1c9d7ac82407daea616fccdef
5f0cc85eeddd9a9f1eb733f3df0bf5bde2922da409621dce14d362a77937dc3e
531880a9a91e05fd96b1510057639981b730ed3bee48b509873b25d795967e31
de454f9316a30f800042c8c64dd3265b1dc9703051278011e8c7caf83673a3ad
c3d216a255b8eee3f694fbeaa23e31740e8faacc27745799f72d4f9a4f799e50
a4ae6ec61b7f397b00749a38146e282fac47b012bc602dab9a16813816e3ddd9
b22b3fcc88e4552de3fd8dbd58b95f7d60560bffd8b26287f2f891c91c0eb15e
066e82b06c3ec673e0ff53fae77d2f35a2a7d32a16057a60611b339ff1f13128
a32ec3e7757bc69f58354d99f5cbb8ec8e85950e11293c8d54caf54a9e444d48
980a59485f728e061aa4ce88da12e830e9ababee8836f052070d71db358eb8b8
1a5e17e9e46d39a64c58b1446b5538c320f9954cb3bc7318280c505be6ee743d

Deleted Networks:
frontend_default

Deleted Images:
deleted: sha256:70721738e34890e5acecc38b4143db495e2ee2b88106cca1d210768dd6208158
deleted: sha256:941878aee9df34ac27fe9832bf326967803554a27b0433ac293f986e95e73854
deleted: sha256:67c2230757038eac50c7814368a4c718d7ea8cfb02513d4d3a6c5e4f94ba6dfe
deleted: sha256:6be057eac891211fef97cee56e4c23eb5ddb587660d48c86ac7a9ad1a0a486c3
deleted: sha256:47307819cf8defa3aaeb157d0a306c741e495b89d78688aaf6b36435cb254d71
deleted: sha256:5ae18b6e41e51bd21dbfabb5dee8523bf34bb54eb165bb9348a772186cd4211a
deleted: sha256:b9c719a7965f0eea27f7426cc99ac7c59795b0aa5acfaeef8997be65325a050a

Total reclaimed space: 12.96GB
kanaiyuki@y-kanai:~$ sudo du -g -x -d 5 / | awk '$1 >= 5{print}'
Password:
6   /Library
du: /private/var/db/fpsd/dvp: Operation not permitted
du: /private/var/db/ConfigurationProfiles/Store: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/SafariFamily: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.progressd/ClassKit: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.Safari/SafariFamily: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.LaunchServices.dv: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.nsurlsessiond: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/0/com.apple.routined: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/C/com.apple.WebKit.WebContent.Sandbox: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/C/com.apple.QuickLook.thumbnailcache: Operation not permitted
du: /private/var/folders/pk/7bc5fwy9239_mzr32f0wfpxw0000gn/C/com.apple.WebKit.Networking.Sandbox: Operation not permitted
du: /private/var/folders/4c/fpqq2qq94pv660s6g75_cmwh0000gp/0/com.apple.LaunchServices.dv: Operation not permitted
du: /private/var/folders/4c/fpqq2qq94pv660s6g75_cmwh0000gp/0/com.apple.nsurlsessiond: Operation not permitted
du: /private/var/folders/4c/fpqq2qq94pv660s6g75_cmwh0000gp/0/com.apple.routined: Operation not permitted
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000sm00006d/0: Operation not permitted
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000sm00006d/C: Operation not permitted
8   /System/Library
8   /System
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000y800007k/0/com.apple.nsurlsessiond: Operation not permitted
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000z000007r/0/com.apple.nsurlsessiond: Operation not permitted
du: /private/var/folders/zz/zyxvpxvq6csfxvn_n00000z000007r/0/com.apple.routined: Operation not permitted
9   /Users/kanaiyuki/Library/Containers/com.docker.docker
10  /Users/kanaiyuki/Library/Containers
6   /Users/kanaiyuki/Library/Caches
23  /Users/kanaiyuki/Library
34  /Users/kanaiyuki
34  /Users
5   /Applications/Xcode.app/Contents/Developer/Platforms
6   /Applications/Xcode.app/Contents/Developer
7   /Applications/Xcode.app/Contents
7   /Applications/Xcode.app
13  /Applications
67  /
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerを使った既存のRailsアプリの環境構築に苦労したので、メモを残してみた

1.はじめに

 2020年3月からDockerの勉強を始め、基礎を終えた後、Railsの環境構築に挑戦してみようと思ったが、思いの外、上手くいかなかったので、ここにメモを残すことにしました。誰かの参考になれば幸いです。

2.教材

入門 Docker
・Docker/Kubernetes 実践コンテナ開発入門(書籍)
・Docker Hubの公式イメージ

3.開発環境

Play with Docker
(事前にDockerHubのアカウントが必要です。)
・Ruby:2.5.3
・Ruby on rails:5.2.2
・MySQL

4.手順

4-1 クローンを取得

まずは、GitHubからgit cloneでアプリをクローンしておいてください。

git clone 'クローンしたいアプリのURL(GitHub参照)'

これで、作成済みのアプリをローカルディレクトリに取り込むことができました。

4-2 Dockerfileとdocker-compose.ymlの作成

Dockerfileとdocker-compose.ymlを以下の配置になるように作成してください。
(作成済みのアプリをSampleAppと名付けています。)

SampleApp---|--app
            |--bin
            |--config
            |--db
            |--lib
            |--log
            |--public
            |--storage
            |--tmp
            |--vendor
            |--.gitignore
            |--.ruby-version
            |--Dockerfile   (これを追加)
            |--Gemfile
            |--Gemfile.lock
            |--README.md
            |--Rakefile
            |--config.ru
            |--docker-compose.yml  (これを追加)
            |--package.json

また、Dockerfileとdocker-compose.ymlの中身は以下のようになります。

Dockerfile
FROM ruby:2.5.3

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev node.js 

RUN mkdir /myapp
WORKDIR /myapp 

COPY Gemfile /myapp/Gemfile 
COPY Gemfile.lock /myapp/Gemfile.lock 

RUN bundle install

COPY . /myapp
docker-compose.yml
version: '3'

services: 
  db: 
    image: mysql 
    environment: 
      MYSQL_ROOT_PASSWORD: password 
      MYSQL_DATABASE: root
    command: --default-authentication-plugin=mysql_native_password 

  web: 
    build: . 
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes: 
      - .:/myapp 
    ports:
      - "3000:3000" 
    depends_on: 
       - db 

これで、実行する準備は完了です。

4-3 実行

アプリのディレクトリ内で以下のコマンドを実行してください。

$ docker-compose build

$ docker-compose up -d

$ docker-compose run web rake db:create

$ docker-compose run web rake db:migrate

完了です。

5. 最後に

何か間違えているところがあれば、ご指摘ください。

6. 参考記事

既存のRailsアプリにDockerを導入する手順
railsの環境構築 その1
プログラム好き大学生のDocker+Ruby on rails5で環境構築とgitの設定(初心者向け)

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

Visual Studio CodeのDev Containerを使ったAngular開発でヘッドレスChromeを使ってテストを実施する

TL;DR

  • Angularのテストの練習中に問題発生
  • Visual Studio CodeのDev ContainerでAngularの開発環境を構築した際にKarmaでエラー
  • Chromeもコンテナ内に入れてヘッドレス環境を構築することにした
  • 設定項目で何箇所か注意する点があったので記事を書いた

環境

  • Windows10
  • Docker Desktop 2.2.0.3
  • docker-composeはDocker Desktopに同梱
  • visual studio code 1.42.1[拡張機能Remote - Containers使用]
  • Angular 9

完成したリポジトリ

https://github.com/MegaBlackLabel/angular-unittest-practice

ファイル

Node.jsのDocker環境とAngular-cliで作った環境のうちポイントのファイルを記載。

Dockerfile
#-------------------------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
#-------------------------------------------------------------------------------------------------------------

# For information on the contents of the container image below, see following Dockerfile:
# https://github.com/microsoft/vscode-dev-containers/tree/v0.43.0/containers/javascript-node-12/.devcontainer/Dockerfile
FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-12

# The image referenced above includes a non-root user with sudo access. Add 
# the "remoteUser" property to devcontainer.json to use it. On Linux, the container 
# user's GID/UIDs will be updated to match your local UID/GID when using the image
# or dockerFile property. Update USER_UID/USER_GID below if you are using the
# dockerComposeFile property or want the image itself to start with different ID
# values. See https://aka.ms/vscode-remote/containers/non-root-user for details.
ARG USER_UID=1000
ARG USER_GID=$USER_UID
ARG USERNAME=node

# [Optional] Update UID/GID if needed
RUN if [ "$USER_GID" != "1000" ] || [ "$USER_UID" != "1000" ]; then \
        groupmod --gid $USER_GID $USERNAME \
        && usermod --uid $USER_UID --gid $USER_GID $USERNAME \
        && chown -R $USER_UID:$USER_GID /home/$USERNAME; \
    fi

# *************************************************************
# * Uncomment this section to use RUN instructions to install *
# * any needed dependencies after executing "apt-get update". *
# * See https://docs.docker.com/engine/reference/builder/#run *
# *************************************************************
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
    && apt-get install -y --no-install-recommends chromium \
    # Clean up
    && apt-get autoremove -y \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/*
ENV DEBIAN_FRONTEND=dialog
ENV CHROME_BIN=chromium

USER $USER_UID

COPY docker-entrypoint.sh ./
COPY ./frontend ./

RUN npm install -g @angular/cli

WORKDIR /frontend

EXPOSE 4200

ENTRYPOINT ["/docker-entrypoint.sh"]
  • DockerfileではDevContainer用にnodeユーザを追加
  • ヘッドレスChromeを使うためchromiumをインストール。環境変数CHROME_BINを追加
karma.conf.js
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, './coverage/frontend'),
      reports: ['html', 'lcovonly', 'text-summary'],
      fixWebpackSourcePaths: true
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['ChromeHeadlessNoSandbox'],
    customLaunchers: {
      ChromeHeadlessNoSandbox: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox']
      }
    },
    singleRun: false,
    restartOnFileChange: true
  });
};
  • customLaunchersの項目追加。「ChromeHeadlessNoSandbox」としてChromeHeadlessで--no-sandboxとする
  • browsersを追加したChromeHeadlessNoSandboxに変更

ng test実行結果

実行結果
node@13fd2b410b71:/frontend$ yarn test
yarn run v1.22.4
$ ng test --watch=false
10% building 2/2 modules 0 active17 03 2020 07:54:26.175:INFO [karma-server]: Karma v4.3.0 server started at http://0.0.0.0:9876/
17 03 2020 07:54:26.178:INFO [launcher]: Launching browsers ChromeHeadlessNoSandbox with concurrency unlimited
17 03 2020 07:54:26.195:INFO [launcher]: Starting browser ChromeHeadless
17 03 2020 07:54:34.990:INFO [HeadlessChrome 73.0.3683 (Linux 0.0.0)]: Connected on socket rFmsBL9G_zLc7S4aAAAA with id 68373234
HeadlessChrome 73.0.3683 (Linux 0.0.0): Executed 3 of 3 SUCCESS (0.795 secs / 0.682 secs)
TOTAL: 3 SUCCESS
TOTAL: 3 SUCCESS
Done in 24.36s.

まとめ

ホスト環境に依存せずにKarmaのテストが可能になりました。このままCIも回せるようになるのでヘッドレス環境万歳。

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

New credentials encrypted and saved. の対処法

前提条件

Docker
Rails5.2

解決したいこと

Terminal
docker-compose run -e EDITOR="vim" web rails credentials:edit

のコマンドを入力した際に、credentialsを編集できずに

Terminal
New credentials encrypted and saved.

と表示されてしまう。

解決方法

  • credentials.yml.encの削除
  • docker-compose build

をするとうまくいく。

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

Docker + Go の Hello Worldビルド

Dockerの中で go をビルドして、Hello World することがゴールです。
手順をシンプルに書いていきます。

まず Docker と Docker-compose を入れておきます。これは省略します。

Dockerディレクトリを作成

以下のようにファイルを作ります。

./docker
./docker/.env
./docker/docker-compose.yml
./docker/go
./docker/go/Dockerfile

./src/
./src/go

Dockerの設定

Docker全体用の設定

今回はコンテナは1つしか作りませんが、
今後の拡張を考えたつくりにはしておきます。
常にクセづけておくことで、迷うことがなくなります。

.env
COMPOSE_PROJECT_NAME=go-docker-starter

goビルド用コンテナ

docker-compose.yml
version: '3'
services:

  go:
    build: ./go
    container_name: '${COMPOSE_PROJECT_NAME}-go'
    tty: true
    volumes:
      - "../src/go:/opt/src"
Dockerfile
FROM golang:1.14.0

Dockerコンテナ作成

cd ./docker
docker-compose build
docker-compose up -d

これで Dockerコンテナが起動します。
docker-compose build せずとも、 up -d だけでもビルド一緒にしてくれているのですが、
それは気を利かせてくれているだけなので、動きを理解するためにも build してみましょう。

go の初期ソースコード作成

./src/sample.go
package main

import "fmt"

func main() {
    fmt.Printf("Hello World\n")
}

sample のビルド

デバッグ用ビルド & 実行

変更する度に行うビルドです。

docker exec go-docker-starter-go bash -c "cd /opt/src/ && GOOS=linux GOARCH=amd64 go run sample.go"

ビルド

docker exec go-docker-starter-go bash -c "cd /opt/src/ && GOOS=linux GOARCH=amd64 go run sample.go"

sample.go と同じディレクトリに出力されます。
-oオプションで出力先を指定することもできます。

github

https://github.com/dd0125/go-docker-starter

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

ログインなしでコードを共有できるサイトつくた

成果物

https://code.itsumen.com/

リポジトリ

https://github.com/yuzuru2/code_site

開発環境

  • ubuntu 18.04
  • docker
  • docker-compose

使用ライブラリ周り

フロントエンド

  • parcel
  • bootstrap
  • highlight.js
  • react
  • nginx(静的ファイルを配信)

バックエンド

  • typescript
  • nodejs
  • pm2

データベース

  • mongodb

成果物を使うケース

  • ちょろっと書いたコードを誰かに見せたい時

UI

ホーム画面

無題.png

コード閲覧画面

無題.png

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

コード共有サイト作成 docker react node.js mongodb

成果物

https://code.itsumen.com/

リポジトリ

https://github.com/yuzuru2/code_site

開発環境

  • ubuntu 18.04
  • docker
  • docker-compose

使用ライブラリ周り

フロントエンド

  • parcel
  • bootstrap
  • highlight.js
  • react
  • nginx(静的ファイルを配信)

バックエンド

  • typescript
  • nodejs
  • pm2

データベース

  • mongodb

成果物を使うケース

  • ちょろっと書いたコードを誰かに見せたい時

UI

ホーム画面

無題.png

コード閲覧画面

無題.png

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

コード共有サイトつくた

成果物

https://code.itsumen.com/

リポジトリ

https://github.com/yuzuru2/code_site

開発環境

  • ubuntu 18.04
  • docker
  • docker-compose

使用ライブラリ周り

フロントエンド

  • parcel
  • bootstrap
  • highlight.js
  • react
  • nginx(静的ファイルを配信)

バックエンド

  • typescript
  • nodejs
  • pm2

データベース

  • mongodb

成果物を使うケース

  • ちょろっと書いたコードを誰かに見せたい時

UI

ホーム画面

無題.png

コード閲覧画面

無題.png

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

Docker上でVueを動かすときに環境変数が読まれない

なにが起きましたか

  • 環境
    • Docker上
    • @vue/cli
    • npm run build でビルド
    • http-server dist/ で配信

Vueのフロントエンドを作っている際,サーバサイドのAPIのエンドポイントを環境変数に格納して動かす方式を取っていた.
ローカルのビルドではちゃんと環境変数が読まれるが,Azure上にイメージをpushしたビルドでは環境変数が読まれないという状況

原因

原因は主に2つあった.

これは既にそのとおりにしており,VUE_APP_API_ENDPOINTにサーバ側URLを設定していた.しかし,それでも環境変数は読まれない.

  • Dockerfileで環境変数を設定していたが,ビルド後に環境変数を設定していた.

つまりこんな感じに書いていた

Dockerfile.production
FROM node:lts-alpine 

RUN npm install -g http-server && \
    npm install && \
    npm run build
EXPOSE 8000

ENV VUE_APP_API_ENDPOINT='https://hogehoge.net'
CMD [ "http-server", "dist", "-p", "8000", "-g", "-b" ]

なんとなく「環境変数はランタイムで読み込まれるもの」という思い込みが原因であった.加えて,ローカルでは npm run serve で動作していたため,これは実際にランタイムで(コマンドを叩いたタイミング)で環境変数が読み込まれており,何も問題がなかったこともある.
ちゃんとビルドコマンド前にENV ~~~を移動させると,環境変数を参照することができた.

結論

  • クライアントサイドかつDockerでの開発のときは,ENVをビルドコマンドの前に書こう!
    • 実行時に必要ないし,RUNのときに直接指定してもいいかもしれない.そのほうが意味的には良い
  • 思い込み怖いね
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Selenium Grid を Docker で試す

Anaconda イメージに Chrome をインストールしてみたり していたが、やはりビルドに時間がかかってしまってしんどいので Chrome 部分だけ別イメージとして切り出せないかと考えていたところ、WebDriver の操作を REST API 経由で行える Selenium Grid なる仕組みがあることを知ったので試してみた。

Selenium Grid を起動する

Selenium Grid を利用できる Docker イメージが公式から公開されているのでこれを使う。

SeleniumHQ/docker-selenium: Docker images for Selenium Grid Server (Standalone, Hub, and Nodes).

複数のブラウザを使う場合は Hub と各ブラウザの Node をそれぞれ立ち上げる必要があるが、今回は Chrome で試したいだけなので Standalone のイメージを使った。

docker-compose.yml
version: "3"

services:

  chrome:
    image: selenium/standalone-chrome
    ports:
      - 4444:4444
    volumes:
      - /dev/shm:/dev/shm

ポート 4444 で REST API が公開される。
WebDriver を操作する API は /wd/hub らしい。

$ docker-compose up

Python から Selenium Grid を使う

Python から Selenium Grid を使う場合は selenium.webdriver.Remote を利用する。

$ pip3 install selenium
main.py
import sys
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities


def search(driver, query):
    driver.get('https://google.com/')

    q = driver.find_element_by_name('q')
    q.send_keys(query)
    q.submit()

    r = driver.find_element_by_class_name('g').find_element_by_class_name('r')
    title = r.find_element_by_tag_name('h3').text
    url = r.find_element_by_tag_name('a').get_attribute('href')

    return title, url


if __name__ == '__main__':
    query = ' '.join(sys.argv[1:])
    options = {
        'command_executor': 'http://localhost:4444/wd/hub',
        'desired_capabilities': DesiredCapabilities.CHROME,
    }
    with webdriver.Remote(**options) as driver:
        title, url = search(driver, query)
        print(f'{title}\n{url}')

Google 検索して結果トップのタイトルと URL を表示するスクリプトを書いてみた。

$ python3 main.py qiita
Qiita
https://qiita.com/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker for macで No space left on device

結論

二つ解決策がある。

  1. 以下のコマンドで不要なimage containerを削除してあげる。

以下のコマンドを打つと、まとめて削除してくれます。

$ docker system prune

消す方法は、たくさんあるので以下の記事が参考になると思います。

参考: https://qiita.com/shinespark/items/526b70b5f0b1ac643ba0

  1. 以下の画像の仮想環境のディスクサイズを上げる。

Settings.png

詳細

エラー内容

docker-composeで、Elasticsearchを立ち上げようとすると、以下のようなエラーが出るので、その対処方法を記載していきます。

org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Unable to access 'path.scripts' (/usr/share/elasticsearch/config/scripts)
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:125) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.cli.SettingCommand.execute(SettingCommand.java:54) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:122) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.cli.Command.main(Command.java:88) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:89) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:82) ~[elasticsearch-5.2.2.jar:5.2.2]
Caused by: java.lang.IllegalStateException: Unable to access 'path.scripts' (/usr/share/elasticsearch/config/scripts)
    at org.elasticsearch.bootstrap.Security.addPath(Security.java:379) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Security.addFilePermissions(Security.java:251) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Security.createPermissions(Security.java:215) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Security.configure(Security.java:121) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:236) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) ~[elasticsearch-5.2.2.jar:5.2.2]
    ... 6 more
Caused by: java.nio.file.FileSystemException: /usr/share/elasticsearch/config/scripts: No space left on device
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) ~[?:1.8.0_92-internal]
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[?:1.8.0_92-internal]
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[?:1.8.0_92-internal]
    at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384) ~[?:1.8.0_92-internal]
    at java.nio.file.Files.createDirectory(Files.java:674) ~[?:1.8.0_92-internal]
    at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781) ~[?:1.8.0_92-internal]
    at java.nio.file.Files.createDirectories(Files.java:767) ~[?:1.8.0_92-internal]
    at org.elasticsearch.bootstrap.Security.ensureDirectoryExists(Security.java:421) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Security.addPath(Security.java:377) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Security.addFilePermissions(Security.java:251) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Security.createPermissions(Security.java:215) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Security.configure(Security.java:121) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:236) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-5.2.2.jar:5.2.2]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) ~[elasticsearch-5.2.2.jar:5.2.2]
    ... 6 more

docker-compose.yml

services:
  elasticsearch:
    build:
      context: .
      dockerfile: Dockerfile-elasticsearch
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - transport.host=127.0.0.1
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    mem_limit: 1g
    cap_add:
      - IPC_LOCK
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200

valumesのesdataが、ローカルディレクトリを指定していないので、仮想環境内にボリュームファイルを作成します。
しかし、仮想環境内のディスク容量が不足していると、ボリュームファイルを作成できないとエラーが出てしまう。

ちなみに、以下のようにボリューム先をローカルディレクトリにすると、ディスク容量不足のエラーはなくなる。

    volumes:
      - /esdata:/usr/share/elasticsearch/data

仮想環境内を覗いてみる

仮想環境内では、どのようなディレクト構成になっているのか気になったので、覗いてみました。
まずは、仮想環境に入る。

$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

  • imageの保存場所
docker-desktop:/var/lib/docker/image/overlay2/imagedb/content/sha256
  • volumesの保存場所
docker-desktop:docker-desktop:/var/lib/docker/volumes
  • containerの保存場所
docker-desktop:docker-desktop:/var/lib/docker/overlay2

ファイル容量などをみてみると、/var/lib/docker/overlay2が大きくなり、ディスクを圧迫しがちなので、不要なcontainerは削除することを、怠らない方が良い。

docker-desktop:/var/lib/docker/overlay2# df -h
....
overlay                  62.7G     26.9G     32.6G  45% /var/lib/docker/overlay2/a540053f9f860ce79c702f59fa76c5b525754a32e1a3d52437f4762d6ec84b5a/merged
overlay                  62.7G     26.9G     32.6G  45% /var/lib/docker/overlay2/a61ed0f1b94cad22f8d02b78d29828a6dfcadf3f95496b03d40ef86d26043aaf/merged
overlay                  62.7G     26.9G     32.6G  45% /var/lib/docker/overlay2/0a5984751197f434f6d5b33d78e0fea769ee36487e9fdc24d0d49097afab30bc/merged
overlay                  62.7G     26.9G     32.6G  45% /var/lib/docker/overlay2/aa82dc3d35db78d3898a280b2b86a
....
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む