RailsスポンサーリンクDockerの勉強を兼ねてruby:alpineベースのRails用イメージとMySQLイメージを使用したRailsプロジェクトを作ろうと思ったらすげーー難しいですねDocker。一応動くと思われる形ができたのでメモ。これを書いてる時点で本番環境のことはまだ考えてないので開発用だけです。serverを使います。全般的に参考にさせてもらったページGitHub試行錯誤の末できたテンプレートがこちら。development説明README.mdに使い方は書いてありますが補足とか。/var/lib/mysqlのvolume化これはデータ永続化(コンテナ閉じてもDBデータが消えないようにする)のために必要です。addからになってしまうため、開発環境でファイルサイズにそこまでシビアにならなくていいかと思い中途半端なままになってます。Gemfileのコピー先ワーキングディレクトリを分けるこれはこの記事などを参考にしました。分けることでGemfileのみの変更と他のコード変更が別のキャッシュになります。/app/tmp/pids/server.pid.というエラーが出ることがあります。'0.0.0.0'"としています。-fはファイルが存在しなくてもエラーになりません。installする今回の設定では/usr/local/bundleにvolumeをマウントしています。volumeには初回の作成・マウント時にコンテナ側のファイルをvolumeに統合する機能があるので、ビルド時にコンテナ内に入った/usr/local/bundleは初回のみvolumeに統合されます。installを行ってもコンテナに新しく入ったgemはマウントで隠れてしまいます。volumeマウント後のコンテナで実行されるrun(もしくはexec)を使ってvolumeに流し込みます。いうと面倒事みたいに聞こえるかもしれないですがvolumeにしないと後述の仕組み上Gemfileが更新されるたびに全gemを再インストールしなきゃいけなくなります。それ対策のvolume化です。その他のDocker注意点などここから先は自分がDockerを学ぶにあたって学んだ注意点など書き連ねます。Dockerは理解しないとつまずく所が多くて難しい!OverlayFS(ここは自分もかなり把握曖昧なので間違ってたらすみません)DockerのイメージはOverlayFSとかいうファイルシステムで作られており、ビルドの各ステップ毎にレイヤーが作られ、レイヤーの上に変更のレイヤーを重ねていくイメージで最終的なイメージができます。addやapt-getからやり直しということがありません。...が、ファイルシステムを意識していないと意図した動作をさせることが難しいことが多々あります。データを削除しているはずなのにイメージ容量が減らない例えばこちらで書かれているように、RUNを分けてファイルを消してもイメージの容量は減らないみたいなことがあります。installした変更ごと再作成になるため、そのgem1個追加すると全てのgemが再インストールになります。runでも、実行してコマンドが終了して終わったと思ったコンテナは実はExitedとかいうステートで残っています。upで再利用されるとかでもないので消すしかありません。runに–rmというオプションをつけると終了時にコンテナが消えるので、単発で何かやりたいときは基本的につけたほうがよいと思います。execでも良いと思います。volumesvolumeとはイメージともコンテナとも別に管理される外部ストレージ的なもので、コンテナを起動する際にオプションで指定した位置にマウントされます。Dockerから専用に作ったvolumeをマウントしたりホストの特定ディレクトリをマウントしたり、あとS3とかもできるみたいです知らんけど。初回作成&マウント時のみコンテナのファイルが統合されることについては上の方で記述しました。ビルド時にはvolumeはマウントされていないイメージが外部のvolumeに依存してたらおかしいので考えたら当然なんですが、ビルド中はvolumeはマウントされていないので全てのファイル変更はコンテナ内で起こります。それを意識していないと前述の通りビルドでコンテナに入れたファイルがvolumeマウントで隠れたりします。node_modulesディレクトリなどもこれを意識しないとハマるようです。docker-compose.ymlのenvironmentはビルドには渡らないenvironment:はコンテナに渡る値なのでビルドには渡りません。1とか書いてもビルドには使われません。args:を経由するという手段があるようです。.envとenv_file:docker-composeは実行時にカレントディレクトリから.envを探し、その中の変数はdocker-compose.yml内で${}を使って参照することができます。env_file:に書かれたファイル内の変数は環境変数として直接コンテナに渡ります。この2つの機能は似ているようで別ものなので、.env以外に書かれた変数はyml内では使えません。docker/compose最初自動的に探してくれるからと思って.envをコンテナの環境変数に使っていたら、.envはdocker-compose実行時のカレントディレクトリしか検索されないのでサブディレクトリから実行すると変数取得が失敗したりして不便だったので、env_file:に変えると共に名前も明示的に.envじゃなくしました。ファイル整理Dockerを練習していると、過去に作ったもう必要ないイメージやコンテナやvolumeが残ってストレージを圧迫していくので定期的にお掃除すると良いです。pruneすると本当はまた使いたいvolumeまで消えてしまう可能性があるので注意。最後にWeb業界のデファクトスタンダードっぽいから軽い気持ちで勉強し始めたけどDocker難しいですね。イメージ、コンテナ、volume、OverlayFS...色んなことを頭の中でちゃんと整理してないと意図通りのものを作るのが難しい!というかこれでまだ開発環境ができただけなので、CIやデプロイの設定なども勉強しないとDockerを活かしたことにはならないと思うと先は長いです。終了したJobを削除する方法色々と注意点KubernetsにはJobは、コマンド実行を終えたら終了するタイプのPodを内包するオブジェクトです。今書いてるプログラムでBase32エンコードされた文字列をデコードをする必要があったんですが、Java標準ライブラリにそういうクラスは無く、...記事を読む「AWS認定LinkedInコミュニティ」とは何なのか先日AWS認定ソリューションアーキテクトに合格しました。Composeをインストールしました。ただのコマンドメモです。Localをダウンロードして起動し、Laradockのworkspaceコンテナ内のLaravelから...記事を読むBashのプロンプトを変えずにscreenのウィンドウタイトルだけ変える先にコード例。.bashrcに書きます。content_forでレイアウトの内容をviewから柔軟に変更するRailsデフォルトのレイアウトではviewはbody内部から始まりますが、titleなどbodyの外側を柔軟に変更したい時もありますよね。...記事を読むプログラミング初心者の環境構築にDockerを勧めない理由たまにネットで「初心者の環境構築にDockerが便利」「お手軽Linux環境」みたいな記事見るのでそんなことないと思うという話を書きます。コメントをキャンセルメールアドレスが公開されることはありません。