Laradockでホストマシンの変更が反映されない場合の対策

by codechord. 0 Comments

自分は、MacOSで、Laradockを使って開発環境を構築している。
その際に、ホストマシンの更新内容がコンテナ内に反映されず、悩まされた。

自分のようにハマったような例もあまりみかけず。
一応動作することが確認したので、その経緯・設定を書き残しておきます。
(詳しくは把握できていないのでご了承)

laradock/.envの次の行が原因とおもわれるのだが、

laradock/.env

# You may add flags to the path `:cached`, `:delegated`. When using Docker Sync add `:nocopy`
APP_CODE_CONTAINER_FLAG=:cached

次のようにいずれの設定に切り替えたとしても、状況は改善されなかった。

APP_CODE_CONTAINER_FLAG=:delegated
APP_CODE_CONTAINER_FLAG=:nocopy

最終的には、設定を解除すると正常に動作するようになった。

APP_CODE_CONTAINER_FLAG=

なお、ぐぐってみると、同期が遅い。というケースはあるようで、その場合はdocker-syncを使いrsyncの仕組みで同期すると早いとあります。
また、公式ドキュメントによると、docker-composeコマンドを使うのではなく、「laradock/sync.sh」コマンドにて起動するとdocker-syncが起動すると書かれています。
sync.shも、難しいことがかかれているわけではないので、見てみるとよいですが「laradock/sync.sh」、次のような処理になっています。

$ ./sync.sh up ~~~
▼実際の処理
$ docker-sync start
$ docker-compose up -d ~~~~~
$ ./sync.sh down
▼実際の処理
$ docker-compose stop
$ docker-sync stop

起動前にはdocker-syncを開始して、終了時にはdocker-syncを止めると、それだけですね。
ただ、ちょっと気になっているのは、終了時、「docker-compose down」しているのではなく、「docker-compose stop」している点。downだと、コンテナまで削除してくれるけど、stopだとサービスを停止するだけで、コンテナはのこったままになる。
コミットログを辿ってみると、意図的に、docker-compose downではなく、docker-compose stopしているよう。

Don't use docker-compose down to stop containers

This delete containers and volume too. 
Use docker-compose stop who only stop containers

うーーん、意図がわからない。

リファレンス本にもLaradockの事は触れられています。ただ、詳細にまでは触れられていないですね。

docker imagesに表示される<none>を消す。dangling

by codechord. 0 Comments

Dockerを使っているといつのまにかディスク容量をくっているので、たまには整理しようと、「$ docker images」を実行し、これまでに作成したDockerイメージの一覧を見て確認している。その際に表示される、<none>のdockerイメージは削除してよいのか?noneイメージってなんなのか?という話。

Dockerfileを作成時に、「$ docker build -t <イメージ名> .」と、何回もbuild繰り返しやり直していると次のように、<none>のdockerイメージがそのビルド回数分作成されてしまう。

続きを読む »

Dockerの基礎知識と開発環境用Dockerfileの書き方

by codechord. 0 Comments

この記事はソフトウェアエンジニア向けにローカルでDockerで開発環境を作る際の、基礎知識のうち自分用にまとめたものです。日常的にdockerを使うようになったものの、何回もDockerの記事をみては忘れて、見てはわすれてを繰り返すので。
本番環境などでの利用、クラウドでの利用などについては本記事で触れません。

ネットの記事や、オライリー本やいくつかのDocker関連書籍をみましたけど、ダントツでわかりやすかった入門者向けのおすすめの書籍を紹介しておきます。どの書籍でも、セキュリティやk8sなどまで触れられてますね。

Docker Engine/ Docker Machineってなに

Dockerを使うということは、Docker Engineを使うということ。
コンテナから、ホストOSのカーネルを使うことができるというDocker Engineのおかげ。注意としては、コンテナからホストOSのカーネルを使うということなので、コンテナに展開されるOSとホストのOSとは、本来同じといけない。(Docker上で、Linuxのコンテナを動かしたい場合は、ホストマシンはそのLinuxのOSである必要がある。)
特定のLinuxのOSの機能を使おうとしても、Windowsや、MacなどOSが異なれば動作しない。逆も然り、ホストマシンのOSがLinuxベースの場合、WindowsのDockerイメージを動かすことはできない。

MacなどでDockerを使う場合は、VirtualBoxなどでまずLinuxの仮想環境を用意し、そのOSに沿ったDockerイメージ/コンテナを展開といけないという話であるけども、わざわざVirtualBoxなどで仮想環境を作るのが面倒。そこで、Docker for windows、Docker for macなどのインストーラーが提供されている。
これらインストールすると、Dockerを起動するための様々なツールがインストールされる。その中に含まれる、Docker Machineによって、ユーザは仮想環境について意識せずとも、自動的にLinuxの仮想環境を構築され、ホストOSがMacであれWindowsであれ、LinuxベースのDockerコンテナを立ち上げることができるようになる。

  • ホストOSがMacでWindowsのコンテナを作成することはできない
  • ホストOSがWindowsでMacのコンテナを作成することはできない。
  • ホストOSがLinuxで、WindowsやMacのコンテナを作成することはできない。

Dockerfileとその記述について

Dockerはコンテナを作成するために、その雛形となるDockerImageを用意する必要がある。
Dockerfileは、そのDockerイメージを作成するための設定をまとめたファイル。
ファイル名は「Dockerfile」とするのが慣習的であるが(DockerImageを作成する際デフォルトで読み込んでくれるファイル名が「Dockerfile」)、設定ファイル名を指定することも可能。
実際の運用上では、開発環境と本番環境とをわけるように「Dockerfile.development」「Dockerfile.production」のように、環境に応じていDockerfileが複数用意されるケースもみられる。

なお、Dockerfileは1行1レイヤーとなりDockerイメージに積み重なっていくため、行数は可能な限り少なく抑えるほうが良い。

以下に、Dockerfileの命令文をいくつか乗せる。

FROM (<イメージ>:<タグ(バージョンなど)>)

ベースとなるDockerイメージを読み込む。
DockerHubで公開されているものを使うことがほとんど。
Google検索で、構築したい環境のDockerfileについて検索すると大抵すぐみつかる。

今回、例としてGo言語の開発環境を作りたかったとして、
GolangのDockerHubを見てみる。

Simple Tagsという所がタグなのであるが、非常に多く、どのバージョンを利用すべきか迷う。
そのページの下部の方に、説明が書かれているが、次のように性質が異なる。

golang:1.10 標準全部入り。
golang:1.10-alpine 最小限の構成のようなもの。
debianベース
golang:1.10-buster 最新のdevianパッケージの構成らしい。

さまざまなDockerfileなどをみていくと、その他に、`Buster、Stretch、Jessie`なども見かけるあるが、Debianのバージョンのコードネームのようだ。
https://wiki.debian.org/DebianReleases

自分は、go言語環境をつくっていて、Dockerfileで「go get」したかったので、gitが必要があったのだけど、容量を少なくおさえたいからといって、alpineのディストリビューションを利用すると、gitコマンドが使えない。。。
alpineを使い、gitコマンドを使いたければ、gitをapt-getでインストールしないといけない。

ベースイメージ gitについて イメージサイズ
golang:1.10 git使える 約1GB
golang:1.10-alpine git使えない 約350MB
golang:1.10-alpine git追加インストール 約700MB

自分は少しでも容量を小さくしたいので、alpine+gitインストールして使っている。

それ以外のイメージとしては、「FROM scratch」とすると、Dockerを利用するにあたり、最も最小の構成から、環境を構築することも可能。イメージサイズは極小である。

WORKDIR

コンテナ上でのワーキングディレクトリ。たとえば、goの場合は「WORKDIR /go/src/demo」apache2の場合は「WORKDIR /var/www/htdocs」とするもよし、

COPY <ホストディレクトリ> <コンテナディレクトリ>

ホストマシン上の特定のディレクトリを、Dockerコンテナ内の特定のディレクトリにコピーする。「COPY . .」とすると、現状のディレクトリ内を、上記で指定したWORKDIRにコピーする。
COPYににたADDというコマンドの場合は、コピーしたファイルのなかに.tarが含まれる場合はtarボールが解答される。

EXPOSE

ポートフォワーディングの設定 EXPOSE 8080などとする。

CMD

コンテナを立ち上げた際に、デフォルトで実行するコマンド。CMD [“./sample_app”]とするとWORKDIR内に配置されているsample_appを実行する。
デフォルトに実行するコマンドなので、コンテナ起動時にコマンドを実行すると、コンテナ起動時のコマンドが優先されるので注意。

RUN

コンテナで実行したいコマンドをRUNの後に記述する。「RUN cd ../」など
上述のalpineディストリビューションの場合に、gitをインストールしてgo getをする例は次の通り。

RUN apk add --no-cache \
        alpine-sdk \
        git \
    && go get github.com/xxxx/xxxxx

その他

その他にも「ENTRYPOINT」や「ENV」などがあるが、今回は除外。

まとめ

以上がDockerfileについてのメモ。今後Dockerについて触れていきたい内容として、コマンドの最低限のまとめ、docker-composeマルチステージなどで、Dockerイメージの容量を圧縮する方法や、それに関しては後日記述してみたいと思う。

参考リンク

Laravelのイベント処理でリダイレクトさせたい時の対策

by codechord. 0 Comments

イベントって何かと便利だから、共通処理をイベント使って書きたくなります。
リダイレクト処理もそうしたい。って思ったのがきっかけ。
で、いろいろリスナ書いてみるも、できなかったので、解決策を書き残しておきます。

Event不可。MiddlewareかControllerに。

Eventはバックグラウンドタスクとしてコールされるので、リダイレクト処理描いても無駄だよって。

参考:firing a redirect from an event

だから、ログイン後に特殊なリダイレクトのロジックを挟みたいときは、

  • コントローラのログイン処理の後でリダイレクトのロジックを挟むか、
  • ミドルウェアにリダイレクトのロジックを記述

のいずれかにしましょう。

イベントリスト

イベントのリストはこちらにまとまってる。

概ね、次のようなところにあるよう。

  • Auth
  • Cache
  • Consoleコマンド
  • Databaseのトランザクション
  • Log
  • Mail
  • Notification
  • Queue
  • Redis

リファレンス本にもイベントのこと書いてたような気がするので、後でチェックする。

SwiftのDelegateをPHPで使って見る

by codechord. 0 Comments

geralt / Pixabay

一つのクラスに対して、何かしらの機能を追加したい場合、継承する方法を単純に思いつきますが、
SwiftにProtocolとDelegateという考え方がありましたので、PHPに置き換えてみたいと思います。

Protocolはhttpとかhttpsとかそういった話ではなく、単に「ルール」といった意味あいのもので、
PHPのinterface、LaravelなどのframeworkではContractと言われてているやつです。

Delegateは、直訳だと委譲とか。そういうやつ。
Delegateという単語を見ると身構えてしまいますが、
Interfaceを意識したプログラミングしてると、知らずのうちに似たような事をしているというケースは結構ありそうです。

続きを読む »

Laravelの認証/認可。Auth,Gate,Policyの再整理

by codechord. 0 Comments

アドベントカレンダーに触発されて、記事を書いたところ、ちょうど枠に空きが出たので、投稿したいと思います。

Laravelのドキュメントって結構分かりやすく書かれている方だと自分は思っているんですけど、今日はその中でもこんがらがりがちな「認証と認可」について今一度、整理したいと思います。どういうケースに使えるのかとか。
なお、「認証」の方はartisan make:authしたら概ね完成しちゃいますが、認可って便利なので、認可の説明が多いです。

実世界に置き換えて考える

技術的な話に入る前に、日本語の「認証と認可」を理解します。というのも、「認証と認可」という日本語もわからないし、英語の「Authentication、Authorization」もわからないので。。。言語って難しいですね。。。

ググって見ると、「認証と認可」について、「よくわかる認証と認可 | DevelopersIO」という素晴らしい記事がありました、ここを読めば、理解できます。さすがです、クラスメソッドさん。
一部、抜粋させていただきます。

  • 認証:通信の相手が誰(何)であるかを確認すること。(例:マイナンバーカード)
  • 認可:とある特定の条件に対して、リソースアクセスの権限を与えること。(例:チケット/切符の発行)

切符を買った人は電車に乗るということを許可されますけど、それが誰だって構わない。切符さえ持っていれば、誰だって乗れると。それが「認可」です。

後述していますが今回、認可の実例として、運転免許を例にしています。

「運転免許証」を持つこと自体は、あなたが誰かを確認できるものになるから「認証」を意味しますけど、「運転」という行為は、免許証持っていても飲酒してたらしてはいけませんよね。
もう一つ別の例としては、教習所で試験に合格すれば、運転免許証を発行されますが、交通違反を取り締まっている警察官は、免許の点数を操作することはできますが、免許証を発行処理はできないです。この辺が認可されていたり・されなかったりの話です。

なんとなく理解できたのではないかということで、いよいよLaravelについての話に移ります。

Laravelでは、認証が「Guard」、認可が「Gate/Policy」の3パターンありますので、順にそれぞれ触れていきます。

続きを読む »

brew upgradeの後、phpenvがicu4cでエラーになる際の対処法

by codechord. 0 Comments

8時間費やした。。。。。他の人がはまらないように、記載しておきます。

もともとYarnを使っていて、「brew upgrade」してください。的なメッセージが出てきたので、何気なく、それに従っただけ。

長い間「brew upgrade」していなかったからかよくわからないけど、まさかのPHPが動かなくなった。

エラー内容と原因

このようなメッセージ。

$ php -v
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.61.dylib
  Referenced from: /Users/&amp;lt;USER_NAME&amp;gt;/.anyenv/envs/phpenv/versions/7.2.5/bin/php
  Reason: image not found
Abort trap: 6

普段使っているPHPは、brewで入れたものではなくて、「phpenv global」を指定していたやつだし、もともとYarnのアップデートのためにやったものだから、PHPに影響が行くとは全く思っていなかった。。。

続きを読む »

Webpack使うならLaravel Mixでラクをする

by codechord. 0 Comments

cssを書くとき、sass/scssを書きたくなる。
javascriptを書くとき、babelを使う必要が出てくる。
そんな時、おそらくGulpかWebpack、を使うことを強いられる。

最近は、フロントエンドの開発環境にWebpackを使うことが増えてきたけど、
そんな時は、Laravel Mixを使うとすごく便利。という話。

自分は、Laravel MixというWebpackのラッパーを使って楽している。
Reactでも、Vueでも、BabelでもSassでも、PostCSSでも思いつくことは基本的にできる。
Webpackって、設定ファイルを書くのが面倒。Webpackの設定ファイルはカオスになる。それをうまい事隠してくれる。

個人的に、過去、Gulp -> Webpack -> Laravel Mixと試してきて、ふと、Webpackに戻ろうかと思ったけど、結局Laravel Mixに戻ってきた。
(Gulpだけで良い時もあるので、適材適所)

本記事ではこれらを比較して見た記事。

続きを読む »