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

docker-compose + rails の環境構築

https://github.com/katoy/test-with-docker に docker-compose + rails の環境構築する手段を記載しました。 現時点では、 system テストで スクリーンショット取得できるところまでです。 今後 request テスト、 models テスト例を追記していく予定です。 また、 metoric 計測レレポート、 profile 計測、 DB の GUI クライアントなどについても記載していきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】Error response from daemon: invalid mount config for type "bind": bind source path does not exist

問題 $ docker compose up -d [+] Running 0/2 ⠋ Container 3e5dfe8d1909_docker-laravel-handson_app_1 R... 0.1s ⠋ Container be3584c24dc2_docker-laravel-handson_web_1 R... 0.1s The new 'docker compose' command is currently experimental. To provide feedback or request new features please open issues at https://github.com/docker/compose-cli Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /host_mnt/Users/ucan/work/ucan-lab/docker-laravel-handson/backend 原因(?) Docker Desktop のファイル共有の権限がなくてエラーになる場合があるようです。 Preferences... > Resources > FILE SHARING 今回は /Users 配下にあるディレクトリをマウントしようとしているので、問題ない気がします...? /host_mnt を追加しないといけないのか...? 対処 Docker Desktop自体を一度終了させて、再度 docker compose up -d することでうまくいきました。 原因がハッキリしなくて気持ち悪いですが、そんなこともあるんですかね...? 参考 https://docs.docker.com/docker-for-mac/#file-sharing https://blog.dand.work/article/396 https://www.takapy.work/entry/2019/02/24/110932
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでウェブアプリを作ろう

Laravelをアプリケーションサーバーとして動かすための設定を記載していきます 参考にさせていただいたサイト 自分の動作環境ではいくつかエラーが出たので、その点も含めて修正したデータを載せていきます 動作環境 MacOS Big Sur MacBookAir(13-inch, Mid2013) もくじ ウェブアプリは以下の手順で作成するものとします 環境設定+プロジェクトの作成 composerによるプロジェクトの作成 データベース Dockerでデータベースを立ち上げる Dockerへの接続設定 テーブルの設定(マイグレーション) モデルの作成 サンプルレコードのINSERT(シーディング) リクエスト ルーティング コントローラー 画面の出力
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[簡単]モダン構成なSPAで作るチュートリアル①(環境構築編)

SPAで作るタスク管理アプリのチュートリアル 勉強会に参加したりするとReact.jsとかVue.jsやってみたくて勉強はしてるけど、LaravelとかRailsと、どうつなぎ込んでいいか分からんって人が多いみたいやな。 転職用のポートフォリオでもSPA化すると評価は上がるらしいな。知らんけど。 独立した技術として本とかUdemyで触ったりしてるけど、SPA化するような本とか記事は少ないみたいやから困ってる人もいるみたいやね。 かく言う私も初めてSPAのプロジェクトに参加したときは、なんのこっちゃ分かれへんかったけど、自分でタスク管理アプリ作ってJSONで繋ぎこむ部分が理解出来たら、あとはフロントとバックエンドは別世界で考えられるからちょっとワカル状態なんやな。 予定では ①環境構築(Docker/Laravel/React.js/Material-UI) ②Reactで一覧テーブル作成 ③seederで作ったDBのデータをReactに渡して一覧に表示 ④新規登録機能 ⑤編集・削除機能 みたいな感じで進めていくつもりや Laravelに関してはJSON返すだけやから、普段Railsの人がこのチュートリアルやってみたら、 Railsに置き換えることは簡単やと思うわ。 React.jsとVue.jsの違いは語れるほど理解できてないから何も言わんとくわな。 下のGIFみたいな感じで作っていくで。 転職用のポートフォリオ考えてる人とかはこのチュートリアルやってから、 自分のアプリ作っていったらええんちゃうかな。 前提 Gitをインストール https://git-scm.com Mac GitHub SSH接続設定をしておく Dockerを使えるようにインストール https://www.docker.com/products/docker-desktop [注意]npmやyarnのインストールで下記のエラーが出たらコンテナ内のリソース配分の問題かもしれんから、 preferencesからCPUとかメモリの割当を増やしてみてほしい 各種バージョンについて バージョンはこんな感じ - php    v8.0.3 - Laravel  v8.40.0 - MySQL   v8.0 - npm    v6.14.4 - Node.js  v14.2.0 - React.js   v17.0.2 - Material-UI  v4.11 記事書いた時点ではそれなりにモダンな選定やと思われるな Laravelの環境構築 環境構築はこちらの記事を使わせてもらうな。 【忙しい人向け】カップ麺より早く作るDockerでLaravel開発環境構築 (@ucan-lab さん) エイリアスを設定してくれていたりで、かなり使いやすいし、 爆速で構築できる且つ環境一致させるのに最適なので、ぜひ使ってみるとええで。 今回の記事はSPAでバックエンドとフロントエンドでデータのやり取りするところをメインにしたいから、サクッと環境作れるのはマジ神やな。 また@ucan-labさんが解説も詳細に書いてくれているので、dockerに強くなりたい人とかチュートリアル中にわからんコマンドとかあったら読んでみるとええでと思うで。(https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4) 文中に登場するmakeコマンドはエイリアスやからMakefile見てもらえば実行内容は分かるようにしてくれてはるわ。 まぁ、dockerは別にええわって人はなれてる環境で構築してくれても大丈夫やわ。 その場合makeコマンドのところはMakefile見て良しなに置き換えてくれな。 手順 $ git clone https://github.com/ucan-lab/docker-laravel.git $ cd docker-laravel # バージョンを合わせる場合は下記コマンドの前に*バージョン対応を参照 $ make create-project ローカルで既にPortが使われてたりするとエラーが出るからそのへんはええ感じにかぶらんように変えてくれておけやで *バージョン対応 Makefileのまま環境構築すると最新版のLaravelとなるため、バージョンを合わせたい場合はgit cloneしたディレクトリ直下のMakefileで下記変更を行ってからmake create-projectを行う #Makefile 6行目をバージョン指定に変える - docker-compose exec app composer create-project --prefer-dist laravel/laravel . # こちらは削除 + docker-compose exec app composer create-project --prefer-dist "laravel/laravel=8.4" . #こちらに変える Laravelの初期画面が表示されたらOKな ホンマにカップ麺食う暇もなかったな LGTM100個ぐらい押したいところやわ。 DBクライアントを利用する場合 コマンドラインで進められる方はスルーしてもOKな MySQLが8.0のためTablePlus等を利用する(SeaquelProは8.0非対応のはず) 手順通り行っった場合は以下が接続情報となるわ Host: 127.0.0.1 Password:secret Port: 3306 User: phper Database: laravel_local レコードはまだ存在しないもののuserテーブルとか出来てるの確認できたらOKやね ここまでできたら変更差分を分かりやすくするためにブランチを切ってコミットしておくとええな $ git checkout -b taskApp $ git add . $ git commit -m "TaskAppInit" Reactの環境構築 UIのパッケージをインストールし、Reactの導入 npm関連で手順通りやってThis is probably not a problem with npm. There is likely additional logging output above.が出る場合はdockerのリソースの問題かもしれないから書いておくな # npmを使えるようにしておく $ make npm # UIパッケージ導入 $ docker-compose exec app composer require laravel/ui # React.js導入 $ docker-compose exec app php artisan ui react --auth # 下記の様の出たらOK React scaffolding installed successfully. Please run "npm install && npm run dev" to compile your fresh scaffolding. Authentication scaffolding generated successfully. npmでビルド $ make npm-install $ make npm-dev コマンドにより生成された不要なファイルを削除しておく resources/viewsの下はシングルページとするためapp.blade.phpのみとする 下記4項目を削除する /auth以下 layouts - (app.blade.phpをviews直下に移動させlayoutsディレクトリ自体を削除) home.blade.php welcome.blade.php # 削除後にresources/viewsディレクトリ下は下記のようになっていればOK resources ┗ views ┗ app.blade.php (layouts下に出来ていたものをviews下に移動する) views/app.blade.phpを修正 既存のコードに対してid="app"の中身を空っぽにするで # views/app.blade.php <!doctype html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- CSRF Token --> <meta name="csrf-token" content="{{ csrf_token() }}"> <title>{{ config('app.name', 'Laravel') }}</title> <!-- Scripts --> <script src="{{ asset('js/app.js') }}" defer></script> <!-- Fonts --> <link rel="dns-prefetch" href="//fonts.gstatic.com"> <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet"> <!-- Styles --> <link href="{{ asset('css/app.css') }}" rel="stylesheet"> </head> <body> <div id="app"> # id="app"の中身を空する変更 </div> </body> </html> resources/js/components/Example.jsを修正 id="app"としたため、getElementByIdを下記のように変更 example→app Example.js // 20行目以下を修正 export default Example; if (document.getElementById('app')) { ReactDOM.render(<Example />, document.getElementById('app')); } routes/web.phpを修正 シングルページアプリケーションなのでどんなURLだったとしても/views/app.blade.phpを表示するように設定します。 web.php // 既存コードの16行目以下を削除 // Route::get('/', function () { // return view('welcome'); // }); // Auth::routes(); // Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); // 追記 Route::get('{any}', function () { return view('app'); })->where('any','.*'); Reactを読み込む準備できたのでビルドする $ make npm-dev 画面をリロードしてExample Componentという文字列が表示されたらReactの導入はOK これは何が表示されているかというとresources/js/components/Example.jsの中身が表示されている laravel側のid="app"にExampleコンポーネントの中身を表示しているんやな 試しに下記変更を加えてみるな Example.jp className="card-headerの文字列 Example Component → React導入できたわな?? Example.js import React from 'react'; import ReactDOM from 'react-dom'; function Example() { return ( <div className="container"> <div className="row justify-content-center"> <div className="col-md-8"> <div className="card"> <div className="card-header">React導入できたわな??</div> <div className="card-body">I'm an example component!</div> </div> </div> </div> </div> ); } export default Example; if (document.getElementById('app')) { ReactDOM.render(<Example />, document.getElementById('app')); } ビルド(make yarn-dev)すると下記のように表示されるはずやな Reactで修正したのに「あれ、、変わらん」みたいなことあるけど、だいたいビルド忘れてるか、キャッシュリロードできてないかどっちかのはずやわ。 ここまで来たらコミットしとこうな $ git add . $ git commit -m "React導入" Material-UIを導入 日本語の公式ドキュメントがある - MATERIAL-UI そもそも何やねんって話なんやけどGoogleが提唱してるマテリアルデザインを実現するためのUIフレームワークで、 手っ取り早く見た目がええ感じになるから使っていくな。 https://qiita.com/nogson/items/804dd3a879f482fb7018 ドキュメント通りに進めればOKやから下記のコマンドで進めていくで # コンテナ内でインストール docker-compose exec web npm install @material-ui/core ボタンをインポートしExample.jsの中で表示してみる Example.js import React from 'react'; import ReactDOM from 'react-dom'; import { Button } from '@material-ui/core'; //Buttonをインポート function Example() { return ( <div className="container"> <div className="row justify-content-center"> <div className="col-md-8"> <div className="card"> <div className="card-header">React導入できたわな</div> <div className="card-body">Im an example component!</div> //ボタンを追記 <Button color="primary" variant="contained">Hello World</Button> </div> </div> </div> </div> ); } export default Example; if (document.getElementById('app')) { ReactDOM.render(<Example />, document.getElementById('app')); } リロードしてHELLO WORLDボタンが表示されたらMaterial-UIの導入はOK ドキュメントがしっかりしているので参考にしながら弄ってみるといいかもしれないな 追加したボタンを以下のように書き換えてみる Expamle.js <Button color="secondaly" variant="contained">ワイがMaterial-UIのボタンやな??</Button> 基本的にインポートしたものはタグ的な感じで使えて colerとかで簡単に見た目変えたりできるねん。 便利やな。 マウスオーバーすると色が変わるようになってたり 色々タグやテンプレートがあったりするからイジってみるとええちゃうかな。 コミットしておくな git add . git commit -m "Material-UIの導入" 今日はここまでやわ。 次ははReactで一覧テーブルのコンポーネント作っていくところをやっていこうと思うで。 次回はReactで一覧表示 ほな、LGTMよろしゅーやで。 ソースはGitHubに乗せておくから分からんときはコミット履歴見たら解決できるかもな。 https://github.com/morry48/LaravelReactTaskApp
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-3) 解決メモ

windowsでこれの動画の通りにやるとエラーがでてしまう箇所があって、そのエラーの解決メモ。 エラーはだいたいこんなの Caused by: Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-3) /app/bin/rails:5:in `<top (required)>' /app/bin/spring:10:in `block in <top (required)>' /app/bin/spring:7:in `tap' /app/bin/spring:7:in `<top (required)>' Tasks: TOP => db:create (See full trace by running task with --trace) ERROR: 1 このエラーが出た人はdocker-compose.ymlの version: '3' services: db: image: mysql:8.0 command: --default-authentication-plugin=mysql_native_password volumes: - ./mysql-confd:/var/lib/mysql  <---この行 - ./mysql-confd:/var/lib/mysqlと書かれている部分を - ./src/db/mysql_data:/var/lib/mysqlに書き換えてみてください。 これで僕は治りましたが、この治し方が正しいやり方なのかわからないのであくまでも応急処置といった認識でお願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[2021Apr] .NET SDK for Linux の消費ディスクスペース

はじめに どうしても手元で VB.NET をコンパイルする必要があり、未体験だった .NET for Linux を試してみることにしました。 が、どのくらいディスクスペースを必要とするのか不明です。不安です。某 Android の開発環境は、公式情報と違って 10GiB とか 20GiB とかって勢いでディスクを消費しました。なんそれ。やめれ。 ということで調べてみました。 結論 すげぇ小さいです。感動的。 5.0.202-1 で 500MiB 未満。わお。 .NET Framework は 1 の頃から触ってますが、体感としては .NET 史上最小。これで VB.NET をビルド出来るんだからごいす。 (.NET Core は触ったことありません。あと Mono の事は思い出せません。あしからず。) 実測 debian buster apt install で表示される予定容量は下記です。 # apt install dotnet-sdk-5.0 (中略) After this operation, 423 MB of additional disk space will be used. (後略) debian:10.9-slim Docker で debian:10.9-slim 上に .NET SDK を入れてみた結果のイメージサイズは下記です。 REPOSITORY TAG IMAGE ID CREATED SIZE dotnet5 latest 90b5ee0e1879 7 seconds ago 521MB debian 10.9-slim 48e774d3c4f5 2 weeks ago 69.3MB 余談 純正の .NET SDK の Dockerfile (たとえばコレ)では apt リポジトリは使ってなくて、tarball を使ってました。 なんかちょっと好感が持てました。バージョンを固定する意識(バージョン再現性を担保する意識)があるのかなーと想像したりして。 ちなみに同 Dockerfile では PowerShell もセットアップしていますが、単に dotnet new して dotnet run するだけなら PowerShell 無くても .NET SDK だけでOKぽいです。手元ではOKでした。 おわりに 実はオンライン IDE 的なもので VB.NET の実験をしていたのですが、幾つか試すも LINQ できるものが無くて。 コードエディタがリッチなものが多かったですが、欲しいのはそこじゃなくて、Imports なんかも含め VB.NET がちゃんと動く処理系だったので、手元にセットアップすることにした次第です。 もっと時間をかけて探せば見つかったのかもしれないですが、手元に構築するのが存外に超絶簡単と判明したので、今後は手元で実験に励む所存です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでOracle19cを構築しようとした際に発生したエラー

事象 こちらの記事を参考に、Mac端末でOracle19cのDocker環境を構築しようとしていたのですが、 CentOS7上のDockerにOracle19cを構築してみた docker runコマンドを叩いたところ以下のエラーが発生しました。 /opt/oracle/product/19c/dbhome_1/bin/dbca: line 135: /u01/app/oracle/product/19.0.0/dbhome_1/bin/platform_common: No such file or directory 原因 githubに同じエラーが出ている方がいました。 https://github.com/oracle/docker-images/issues/1257 どうやらdocker Imageのbuild時に不完全なImageが作られていたようでした。 dockerのメモリとディスク領域が不足していたことが原因のようですので、今回はDockerの環境設定でメモリを4GB、ディスク領域の空き容量を100GB程度に設定して改めてbuildし直します。 設定後、出来上がってしまっている不完全なImageを削除し、再度buildを行います。 $ ./buildDockerImage.sh -v 19.3.0 -e -i うん、最初のbuildの時よりもめっちゃ時間がかかる。 Imageが出来上がった後、docker runをすれば構築完了ですが、この時もすでに出来上がっているコンテナを事前に削除しておきましょう! 補足 エラー解決の際、こちらの記事も参考になりました! [Oracle Database] 公式Docker Imageを利用してOracle Database 19c環境を構築してみた [Oracle Database] 公式Docker Imageを利用してOracle Database 19c環境を構築してみた(解決したエラー編)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ラズパイ初心者がRaspberrypiZeroWHを使ってLINEで動くスマートロックを作ってみた(サーバー構築編2)

前回のあらすじと今回の概要 前回は、docker-composeを用いてflaskとnginxをuwsgi繋げ、httpsでアクセスするところまで行った 今回はLINEのAPIを使ってオウム返しbotを作るところまでやろう ディレクトリ構成 ┣ ~   ┣ app     ┣ Dockerfile     ┣ main.py     ┣ requirements.txt     ┣ uwsgi.ini   ┣ docker-compose.yml   ┣ nginx     ┣ Dockerfile     ┣ nginx.conf     ┣ ssl       ┣ fullchain.pem       ┣ privkey.pem LINEdevelopers登録・各種設定 Linebot作成、Messageing-APIを有効化 https://developers.line.biz/ja/ ここからログイン 公式ドキュメント参照 https://developers.line.biz/ja/docs/messaging-api/getting-started/ アクセストークンとチャネルシークレット発行 LINE Developersコンソールで、作成したチャネルを選択。 [チャネル基本設定]タブで、チャネルシークレット発行 [Messaging-API設定]タブで、チャネルアクセストークン(長期)を発行 Flaskサーバーの設定 ~/appディレクトリ内のファイルを編集していく requirement.txt line-bot-sdkパッケージをインストールさせる ~/app/requirement.txt Flask uwsgi line-bot-sdk # 追加!! main.py 以下のように4つのブロックを付け足す ~/app/main.py from flask import Flask, render_template, request, abort ##1.line-bot-sdkの各モジュールをインポート################################ from linebot import LineBotApi, WebhookHandler from linebot.exceptions import InvalidSignatureError from linebot.models import MessageEvent, TextMessage, TextSendMessage ######################################################################## app = Flask(__name__) ##2.アクセストークンとチャネルシークレットを入力############################ line_bot_api = LineBotApi("YOUR_CHANNEL_ACCESS_TOKEN") # アクセストークンを入力 handler = WebhookHandler("YOUR_CHANNEL_SECRET") # チャネルシークレットを入力 ######################################################################## @app.route("/") def hello_world(): return "hello world!" @app.route("/.well-known/acme-challenge/<filename>") def well_known(filename): return render_template('.well-known/acme-challenge/'+ filename) ##3.WebhookにURLを指定してWebhookからURLにイベントが送られるようにする######## @app.route("/callback", methods=['POST']) def callback(): signature = request.headers['X-Line-Signature'] body = request.get_data(as_text=True) app.logger.info("Request body: " + body) try: handler.handle(body, signature) except InvalidSignatureError: abort(400) return 'OK' ######################################################################## ##4.Webhookから送られてきたイベントの処理内容(この場合テキストメッセージが届くと同じメッセージを返す) @handler.add(MessageEvent, message=TextMessage) def handle_message(event): line_bot_api.reply_message( event.reply_token, TextSendMessage(text=event.message.text)) ######################################################################## if __name__ == "__main__": app.run() Webhookしてみる Message-API基本設定タブからWebhookURLの欄にURLを入力 更新→検証を押し、成功!が表示されたらOK 自分のLINEに作成したbotを友達登録して、実際にbotにメッセージを送ってみる オウム返しされたら成功!! これにてサーバー構築終了! お疲れ様!! 次回はLINEbotに送るメッセージに応じてサーボモーターを操作していくよ! 少し電気回路も触るけど、メインはコーディングだからソフトウェア編にかな
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeでサービス運用しているなら設定しておきたいログローテート

ことの始まり 社内で使用しているサービスにいくらリクエストを送っても返事がなくなったので調査。 原因 サーバーがdiskfull状態だったことでファイルの書き込み処理が行えず、ほぼほぼ何もできなくなっていたことが原因。 なぜ、そんなに容量が圧迫されてしまったのか調べたところdockerのログが膨れ上がって容量を圧迫していた。 対策 docker-composeを使用してサービスを運用しているケースだったので、コンテナごとにログファイルの上限サイズと保持するファイル数を設定した。 docker-compose.ymlに以下のように書くことで上限サイズとファイル数を設定できるみたい。 docker-compose.yml version: '2' services: web: build: . ports: - "5000:5000" volumes: - .:/code logging: # ログ記録の設定 driver: "json-file" # ロギングドライバの指定 options: max-size: "1k" # 上限サイズを1KBに設定 max-file: "2" # ファイル数は2まで 上記の設定で、webコンテナから吐き出されるlogファイルは1KBに到達するとロールオーバー(別ファイルに繰り出)されます。 実際に吐かれたログを見てみると、確かに1KB程で コンテナID-json.log.1 とロールオーバーされたものが出来ています。 # docker for macだと、このpathにログファイルは存在しません。(hyperkit vm上で動いているため) /var/lib/docker/containers/8918bd3a1b22eb04f9538ca8df869ef1588f27aefffad37efe4c09d1bd079ab8 # ls -la total 48 (略 -rw-r----- 1 root root 424 Apr 28 02:51 8918bd3a1b22eb04f9538ca8df869ef1588f27aefffad37efe4c09d1bd079ab8-json.log -rw-r----- 1 root root 1020 Apr 28 02:51 8918bd3a1b22eb04f9538ca8df869ef1588f27aefffad37efe4c09d1bd079ab8-json.log.1 (略 これで、次のロールオーバーが発生すると max-file が2になっているため、 コンテナID-json.log.1 のものが削除されて今まで コンテナID-json.log だったものが コンテナID-json.log.1 となります。 このように、ロールオーバーする設定にすると、 docker-compose logs コンテナ名で表示されるログは コンテナID-json.logのみになるので、前のものを確認したいときは直接見に行ってください。 ログの設定についてもっとしたい場合は、 公式ドキュメントを確認してください。 また、オプションにどんなものが使えるか知りたい場合は、こちらを見てみてください。 設定できたか確認 しっかり設定できた確認したい場合は以下のコマンドで確認することができます。 docker inspect コンテナID | grep LogConfig -A 5 "LogConfig": { "Type": "json-file", "Config": { "max-file": "2", "max-size": "1k" } おまけ docker for macでローテートされたログを見に行きたい場合は、特権コンテナに入って var/lib/docker/containers/コンテナID/ を見に行くと見れます。 特権コンテナの入り方は以下のような感じです。 docker run -it --rm --privileged --pid=host justincormack/nsenter1 終わりに ログローテートの設定をせずにdockerを使ってサービスを運用していると、肥大し続けるlogファイルに障害を起こされます。 時限爆弾みたいなものなので、設定してなければ早めに対処することをお勧めします。 参考資料 Compose ファイル・リファレンス#logging ロギング・ドライバの設定 Docker Desktop for MacのHyperKit VMに入る
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker ビルドやり直し(ほんとにただのメモ)

1.全部消す $ docker-compose down $ docker system prune -a 2.ビルドし直す $ docker-compose build Dockerを落として、もう一度起動する $ docker-compose down $ docker-compose up -d
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

1コンテナでcronとジョブを実行する【バグ:cronが実行されない】

目次 1.本記事の目的 2.修正前 3.試したこと 4.解決 1. 本記事の目的 書籍のチュートリアルで、 'Hello'とログファイルに標準出力するジョブ 1分周期でジョブを実行するcron を、1つのコンテナで動かす実装を行った。 イメージを実行すると、1分経過するごとに 'Hello'とログが出力される想定だったが、当初エラーは出力されず、ログも出力されない結果となった。 原因はcronの構文誤りだった。 この問題を解決するまでに試したことや、その結果について記載する。 ※ この記事では、MacOS Big Sur バージョン11.2.3を使用しています。 書籍 2. 修正前 修正前のディレクトリ構成、ファイルの内容は以下の通り。 【ディレクトリ構成】 cronjob/  ├ cron-example/  ├ Dockerfile/  └ task.sh/ 【Dockerfile】 FROM ubuntu:16.04 # ubuntu:16.04 のイメージを利用する。イメージはDockerHubにある。 # ubuntuはLinuxディストリビューションの1つ。 RUN apt update # ubuntuのパッケージマネージャaptを更新する。 RUN apt install -y cron # aptで、cronをインストールする。 COPY task.sh /usr/local/bin/ COPY cron-example /etc/cron.d/ # 各ファイルをコピーし、コンテナに追加する(右側はコンテナ内のパス)。 RUN chmod 0644 /etc/cron.d/cron-example # パーミッションを設定する CMD ["cron","-f"] # cronはバックグラウンドで動き続けるため、CMDとして実行すると、すぐに終了してしまう。 # このため、フォアグラウンドで実行させる(-fコマンド)。 【task.sh】 #!/bin/sh echo "[`date`]Hello!" >> /var/log/cron.log コマンド >> ファイル Linuxのリダイレクト コマンドの出力結果をファイルへ追記 参考:5分で一通り理解できる!Linuxのリダイレクト 使い方と種類まとめ 【cron-example】 task.shのジョブを毎分実行する ***** root sh /usr/local/bin/task.sh 【dockerコマンド】 ここではdockerコマンドを使用する。 イメージのビルド docker image build -t example/cronjob:latest . イメージの実行 docker container run -d --rm --name cronjob example/cronjob:latest logファイル実行 docker container exec -it cronjob tail -f /var/log/cron.log 3. 試したこと task.shは実行できるか コンテナ内部に入り、shコマンドでtask.shを実行後、ログファイルに出力されるか確認する。 コンテナ内部に入る docker exec -i -t コンテナ名 bash task.shを実行する sh /usr/local/bin/task.sh ログファイルを確認する cat /var/log/cron.log cronの実行権限はあるか コンテナ内で、cron-exampleがあるフォルダに移動し、0644の権限を確認する。 フォルダ移動 cd etc/cron.d 中身確認 ls > cron-example 権限確認 ll > -rw-r--r-- 1 root root 37 Apr 29 00:12 cron-example 最初の1文字目はファイル種別を表しています。 2文字目から4文字目はファイルの所有者に対する権限を表し、 5文字目から7文字目はファイルの所有グループに対する権限を表し、 8文字目から10文字目はその他に対する権限を表しています 最初の1文字目 : - ファイル 2~4 : rw- 6 5~7 : r-- 4 8~10 : r-- 4 権限は合っている。 crondが起動しているか 起動確認 service cron status > * cron is running 起動している。 4. 解決 原因:cronの構文誤り cronで1分周期を設定する場合、以下のように記載する。 */1 * * * * root sh /usr/local/bin/task.sh cron-exampleの修正を行い、イメージのビルド、コンテナの作成と実行を行った。 動作確認をしたところ、期待通りだった。 期待する動作は、イメージを実行すると、1分経過するごとに 'Hello'とログが出力されること。 実行結果 [Thu Apr 29 02:38:01 UTC 2021]Hello! [Thu Apr 29 02:39:01 UTC 2021]Hello!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCodeでdocker-composeを開くと動いていたものが動かない(Mysql)

問題 Docker-compose up だとコンテナは起動して、正常にMysqlが動作する。 VSCodeの Remote containers: Reopen in container で開くとコンテナは起動しているが、Mysqlが動作していない。 原因と解決策 プロジェクトのrootディレクトリにdocker-compose.ymlが存在する状態で、 Remote containers: Reopen in containerを実行すると、既存のdocker-compose.ymlを読み込む、設定が、.devcontainer/に作成され、Docker-compose upが実行されます。 VSCodeが自動的に作成する、.devcontainer/docker-compose.yml のcommand:の行が悪影響してMysqlが起動していませんでした。 command: の行をコメントアウトすると解決します。 なにか意味があって、command:の行を生成しているのだろうけど、必要性が全く不明。 version: '3' services: # Update this to the name of the service you want to work with in your docker-compose.yml file db: # If you want add a non-root user to your Dockerfile, you can use the "remoteUser" # property in devcontainer.json to cause VS Code its sub-processes (terminals, tasks, # debugging) to execute as the user. Uncomment the next line if you want the entire # container to run as this user instead. Note that, on Linux, you may need to # ensure the UID and GID of the container user you create matches your local user. # See https://aka.ms/vscode-remote/containers/non-root for details. # # user: vscode # Uncomment if you want to override the service's Dockerfile to one in the .devcontainer # folder. Note that the path of the Dockerfile and context is relative to the *primary* # docker-compose.yml file (the first in the devcontainer.json "dockerComposeFile" # array). The sample below assumes your primary file is in the root of your project. # # build: # context: . # dockerfile: .devcontainer/Dockerfile volumes: # Update this to wherever you want VS Code to mount the folder of your project - .:/workspace:cached # Uncomment the next line to use Docker from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker-compose for details. # - /var/run/docker.sock:/var/run/docker.sock # Uncomment the next four lines if you will use a ptrace-based debugger like C++, Go, and Rust. # cap_add: # - SYS_PTRACE # security_opt: # - seccomp:unconfined # Overrides default command so things don't shut down after the process ends. command: /bin/sh -c "while sleep 1000; do :; done" ひとりごと Remote containers使っているほかの人の記事では特に問題になってないのに、なぜ?? 解決するのに半日かかりました。 いろいろ調査している過程で、Remote containersの理解が深まりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】docker-compose を最新版にアップグレードする

久しぶりにdockerを触ろうとした時にdocker-composeのバージョンが古いことが判明。 docker-composeのバージョンのアップグレードが必要でした。 アップグレード手順について覚書として簡単にまとめます。 (注: curlコマンドでインストールしていた場合の手順です。インストール状況などによって下記手順は異なります。) docker-compose インストール場所を確認する 公式に記載のcurlコマンドでインストール実施している場合はここにインストールされているはずです。 ls -l /usr/local/bin/docker-compose 古いバージョンを削除する sudo rm -rf docker-compose 最新バージョンをインストールする sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 「1.29.1」の部分を最新バージョンに置き換えてください。 ※最新バージョンの確認はgithubの公式リポジトリのReleasesを参照する github | docker-compose 実行可能権限をバイナリに適用する sudo chmod +x /usr/local/bin/docker-compose バージョンを確認する docker-compose -v 最新のバージョンが確認できたらアップグレード成功です! 参考: Docker 公式サイト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vagrant仮想化環境でDocker Composeのボリューム永続化しようとしてハマったこと

Vagrant 仮想化環境で Docker Compose を使った際にちょっとハマったのでメモ。 なにがあったのか 仮想化ホストOS:Windows10 仮想化ソフト:VirtualBox+Vagrant ゲストOS:Ubuntu20.4 コンテナ: https-portal nginx mysql 以上のような構成で docker-compose up しても、https-portal と mysql のステータスが Restarting を繰り返しててうまくいかなかった。 なにがだめだったのか 結論から言うと、https-portal と mysql の永続化ボリュームを、Vagrant の共有ディレクトリ内に作成していたためでした。 docker-compose.yml mysql: (中略) volumes: - ./build/mysql/initdb:/docker-entrypoint-initdb.d - ./db:/var/lib/mysql https-portal: (中略) volumes: - ./cert:/var/lib/https-portal docker-compose.yml のあるフォルダは Vagrant と共有していたので、これだと db フォルダと cert フォルダの場所が Vagrant で共有しているフォルダ内にできてしまいます。 https-portal の証明書ファイルなどのオーナーが vagrant になってしまうのでだめみたいでした。 どう解決したか db フォルダと cert フォルダの場所を Vagrant で共有しているフォルダ外になるようにしたらうまくいきました。 docker-compose.yml mysql: (中略) volumes: - ./build/mysql/initdb:/docker-entrypoint-initdb.d - ../db:/var/lib/mysql https-portal: (中略) volumes: - ../cert:/var/lib/https-portal 以下の図のように共有フォルダ外に作成されました。 Vagrantfile の config.vm.synced_folder に mount_options を指定することでも解決できるのかもしれませんが、db フォルダと cert フォルダは Windows でいじりたいものではなかったので共有しないという選択を取りました。今後、アプリを入れる www フォルダで権限絡みの問題が発生したときには mount_options を検討してみようと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerコンテナからWebサイトを公開する方法

ApacheのHTTPサーバのDockerコンテナからWebサイトを公開する方法を紹介する。 サーバ一台で複数のWebサイトを走らせたり、一時的にWebサイトを公開するのによさそう。 環境 Ubuntu 20.04.2 LTS Docker 20.10.5 Dockerのインストールは、公式Docsを参考にするべし。 手順 1. 前準備 まず、公開したいhtmlファイルを設置する。 > cd /var > mkdir www > sudo chown $USER www > cd www > mkdir html > sudo chown $USER html # 最後に公開したいhtmlファイルを設置した 2. Dockerコンテナの起動 httpdはApacheのDockerイメージ。コンテナの名前はmywebとする。 > docker run -d -p 80:80 --name myweb -v /var/www/html:/usr/local/apache2/htdocs httpd 3. 更新 htmlファイルを更新する。 > docker restart myweb 4. Dockerコンテナの停止 Dockerコンテナを停止。 > docker stop myweb docker stop mywebを実行した後、再びDockerコンテナを再稼働させるとき > docker start myweb docker stop mywebを実行した後、再びDockerコンテナを削除させるとき > docker rm myweb 補足 Dockerfileからコンテナを起動 FROM httpdは最低限必要。Dokerfileは/var/www/html/に設置する。 FROM httpd RUN set -ex && \ apt update && \ apt install -y vim && \ apt install -y nano && \ apt install -y less && \ apt install -y tree && \ cp /usr/share/zoneinfo/Japan /etc/localtime DockerfileからDockerイメージimg_mywebを建てる。 > docker build -t img_myweb /var/www/html/ Dokerイメージimg_mywebからDokerコンテナmywebを起動する。 > docker run -d -p 80:80 --name myweb -v /var/www/html:/usr/local/apache2/htdocs img_myweb
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む