20210613のdockerに関する記事は9件です。

開発環境と本番環境を分けたい

ターゲット 本番環境でもdocker-composeを使っているけど、 データベースの起動方法などが違う方 結論 docker-compose.yml自体をそれぞれ分けるのが一番楽。 本番環境:docker-compose.yml 開発環境:docker-compose.local.yml ⇒docker-compose -f docker-compose.local.yml upで起動
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker ScanでSynkへのAPI Tokenを使った認証を行う方法

新しく使えるようになった docker scan コマンドをテストしているといつからか以下のメッセージが出力されるようになりました。 $ docker scan hello-world You have reached the scan limit of 10 monthly scans without authentication. For additional monthly scans, sign into or sign up for Snyk for free with the following command: `docker scan --login` Docker ScanはSnykのエンジンを使っているため、匿名は回数制限されていて、アカウントの作成が必要になるようです。 Docker Scan runs on Snyk engine, providing users with visibility into the security posture of their local Dockerfiles and local images. https://docs.docker.com/engine/scan/ ガイドの通りログインしていみます。自身のLinux環境だと以下のような感じです。 $ docker scan --login To authenticate your account, open the below URL in your browser. After your authentication is complete, return to this prompt to start using Snyk. https://snyk.io/login?token=TOKENTOKENTOKEN&utm_medium=Partner&utm_source=Docker&utm_campaign=Docker-Desktop-2020&os=linux&docker=true ブラウザから認証してあげます。 ただ、CLI側は何故かエラーに。 Authentication failed. Please check the API token on https://snyk.io APIトークンを指定してログオン 何度か試してみたのですが、上手くいかなかったのでAPI Tokenを自分で取得して自分でログオンすることにしました。 以下にアクセスします。ここまでの手順を行っていれば自動でログオンされるはずですし、DockerHubのIDで再度ログオンしても大丈夫です。 API Tokenは以下の click to show で表示されます。 このAPI Tokenを使って docker scan --login を行うことでDocker CLIからもSnykへログインできます。 $ docker scan --login --token TOKENTOKENTOKEN Your account has been authenticated. Snyk is now ready to be used.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SQLSTATE[HY000]: General error: 1364 Field 'body' doesn't have a default value

前提・環境 ・記事投稿処理をした際に遭遇したエラーになります。 ・Docker ・Docker-compose ・MySQL8 ・Laravel6.0 ・PHP7.4 エラー問題 記事投稿ボタンをクリックすると、、下記のエラーに遭遇しました。。 SQLSTATE[HY000]: General error: 1364 Field 'body' doesn't have a default value 解決方法 日本語訳に訳してみるとこのような訳になります!! SQLSTATE [HY000]:一般エラー:1364フィールド「body」にデフォルト値がありません しっかりArticlController.phpを確認すると、 $article->body = $request->body;が抜けていました。。(すごく凡ミスですね。) ArticleController.php // 記事投稿処理の実装 public function store(ArticleRequest $request, Article $article) { $article->title = $request->title; $article->user_id = $request->user()->id; $article->save(); return redirect()->route('articles.index'); } 下記に記入後、解決です! ArticleController.php // 記事投稿処理の実装 public function store(ArticleRequest $request, Article $article) { $article->title = $request->title; $article->body = $request->body; $article->user_id = $request->user()->id; $article->save(); return redirect()->route('articles.index'); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Mac】Docker Desktopをコマンドで起動/終了する

始めに マウスに手を持っていくのが嫌すぎて、コマンド実行ですべてを完結させたいと思っている今日この頃です。 今日は、Launchpad(アプリ一覧の一覧を開くやつ)を使わなくても、コマンドからDocker Desktop(アプリケーション)を起動/終了する方法を紹介します。 起動コマンド -a ・・・ パスを書かずに/Applications配下のアプリケーションを開くオプション open -a Docker 終了コマンド osascript -e 'quit app "Docker"' aliasで引数を受け取るようにする 最後に;がないと、エラーになるので注意してください。 .bashrc # 引数に指定したアプリケーションを起動 function start() { open -a $1; } # 引数に指定したアプリケーションを終了 function stop() { osascript -e "quit app \"${1}\"";} 備考 bashとzshで動作することを確認しました。 参考 openコマンドとは osascriptコマンドとは
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel]AWS S3に画像をアップロードする際に発生したエラー

ポートフォリオに画像投稿機能を実装しました。 画像ファイルをAWSのS3に保存する際に、いくつか躓いた点があったので、それをアウトプットしようと思います。 バージョン PHP 7.4.2 Laravel 6.20.26 Docker 20.10.6 docker-compose 1.29.1 OS Windows 編集前のコード 画像ファイルをS3に保存する前はpublicフォルダに保存していました。 「S3に保存する前に、とりあえず画像機能を実装したい」という方は、下記のコードをご参照ください。 画像投稿に該当する箇所のみ記載しています。 また、【Laravel 7.x】Laravelで画像投稿機能を実装を参考にしつつ、コーディングしています。 web.php //略 Route::get('/', 'ArticleController@index')->name('articles.index'); Route::resource('/articles', 'ArticleController')->except(['index', 'show'])->middleware('auth'); Route::resource('/articles', 'ArticleController')->only(['show']); //略 Article.php //略 class Article extends Model { protected $fillable = [ 'title', 'body', ]; //略 ArticleRequest.php //略 public function rules() { return [ 'image' => 'mimes:jpeg,jpg,png,gif|max:10240', 'title' => 'required|max:50', 'body' => 'required|max:500', 'tags' => 'json|regex:/^(?!.*\s).+$/u|regex:/^(?!.*\/).*$/u', ]; } //略 ArticleController.php //略 public function store(ArticleRequest $request, Article $article) { $article->fill($request->all()); if ($request->file('image')){ $filename = $request->file('image')->store('public'); // publicフォルダに保存 $article->image = str_replace('public/', '', $filename); // 保存するファイル名からpublicを除外 } $article->user_id = $request->user()->id; $article->save(); //略 return redirect()->route('articles.index'); } //略 〇〇_create_articles_table.php //略 public function up() { Schema::create('articles', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('title'); $table->text('body'); $table->bigInteger('user_id')->unsigned(); $table->timestamps(); }); } //略 〇〇_add_image_to_articles_table.php(imageカラムを後から追加しています) //略 class AddImageToArticlesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('articles', function (Blueprint $table) { $table->string('image')->nullable()->after('id'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('articles', function (Blueprint $table) { $table->dropColumn('image'); }); } } index.blade.php //略 <img src="{{ asset('/storage/'.$article->image)}}" alt=""> //略 create.blade.php //略 <form method="POST" action="{{ route('articles.store') }}" enctype="multipart/form-data"> @csrf <div class="container"> <div class="row"> <div class="offset-md-2 col-md-8"> //略 <div class="form-group"> <input type="file" class="from-control-file" id="image" name="image"> </div> </div> </div> </div> <button type="submit" class="btn aqua-gradient btn-block"><i class="fas fa-pen mr-1"></i>投稿する</button> </form> //略 事前準備 S3に保存するためには、事前にAWSの方でIAMユーザーやS3バケットの設定が必要になります。 Rails, Laravel(画像アップロード)向けAWS(IAM:ユーザ, S3:バケット)の設定の手順で進めてください。(この記事とてもわかりやすかったです!) 編集箇所 LaravelでAWS S3へ画像をアップロードするを参考にしつつ、コードを修正しました。(この記事も非常にわかりやすかったです!) ArticleController.php //略 public function store(ArticleRequest $request, Article $article) { $article->fill($request->all()); if ($request->file('image')){ //==========ここから削除========== $filename = $request->file('image')->store('public'); // publicフォルダに保存 $article->image = str_replace('public/', '', $filename); // 保存するファイル名からpublicを除外 //==========ここまで削除========== //==========ここから追記========== // s3アップロード開始 $image = $request->file('image'); // バケットの`myprefix`フォルダへアップロード $path = Storage::disk('s3')->putFile('myprefix', $image, 'public'); // アップロードした画像のフルパスを取得 $article->image_path = Storage::disk('s3')->url($path); //==========ここまで追記========== } $article->user_id = $request->user()->id; $article->save(); //略 return redirect()->route('articles.index'); } //略 index.blade.php //略 <img src="{{ asset('/storage/'.$article->image)}}" alt=""> //この行を削除 <img src="{{ $article->image_path }}"> //この行を追記 //略 画像ファイルの保存先をAWS S3に変更した際のエラー Class 'App\Http\Controllers\Storage' not found 一番最初のエラーはこれでした。 Storageが見つからないと言われています。 ArticleController.phpにuse Illuminate\Support\Facades\Storage;を追記することで、storage facadeをインポートし、このエラーは解決しました。 use Storage;でも試してみましたが、問題なく動作しました。 Class 'League\Flysystem\AwsS3v3\AwsS3Adapter' not found 次のエラーはこれです。 単純にflysystem-aws-s3-v3のインストールを忘れていました。 ドキュメントにもちゃんと書いてありますね。(Laravel 6.x ファイルストレージ) $ composer require league/flysystem-aws-s3-v3でインストールできます。 ただし、バージョンの指定がないと2.0がインストールされてエラーになることもあるらしいので、$ composer require league/flysystem-aws-s3-v3 ~1.0にしておいた方が安心ですね。 私の場合はDockerのappコンテナの中で実行したかったので、$ docker-compose exec app composer require league/flysystem-aws-s3-v3 ~1.0でインストールしました。 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'image_path' in 'field list' 最後のエラーはこれです。 「articlesテーブルにimage_pathカラムがない」と言われています。 mysqlでarticlesテーブルのカラムを確認すると、、、 mysql> show columns from articles; +------------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-----------------+------+-----+---------+----------------+ | id | bigint unsigned | NO | PRI | NULL | auto_increment | | image | varchar(255) | YES | | NULL | | | title | varchar(255) | NO | | NULL | | | body | text | NO | | NULL | | | user_id | bigint unsigned | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +------------+-----------------+------+-----+---------+----------------+ 7 rows in set (0.01 sec) 確かにないですね。 image_pathカラムではなく、imageカラムが正解でした。 下記のように修正しました。 ArticleController.php //略 public function store(ArticleRequest $request, Article $article) { $article->fill($request->all()); if ($request->file('image')){ // s3アップロード開始 $image = $request->file('image'); // バケットの`myprefix`フォルダへアップロード $path = Storage::disk('s3')->putFile('myprefix', $image, 'public'); // アップロードした画像のフルパスを取得 $article->image = Storage::disk('s3')->url($path); //この行を修正 } $article->user_id = $request->user()->id; $article->save(); //略 return redirect()->route('articles.index'); } //略 index.blade.php //略 <img src="{{ $article->image }}"> //略 バケットを確認 これで無事にS3へ保存することができるようになりました。 念のため実際にアップロードして、バケットへ画像がアップロードできているか確認しました。 ちゃんと保存できていますね!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Lambda上でPuppeteerを使いhtmlをpdfに変換する

好きなURLをAWS Lambda関数に渡し、htmlページがロードされた後、Headless Chromeを使いPDFに変換する。Base64 Dataが返す。 GitHub: puppeteer_on_docker_lambda 作り始めたきっかけ シンプルなweb serviceを作りたかった。任意のURLをもとに、htmlページをレンダリングし、描画されたイメージをpdfにして保存。Web scrapingやテストの自動化に利用する目的 開発環境の選択 htmlをpdfに変換するだけなら、いろいろ選択肢はある。一番簡単なのはjs libraryを使う。シンプルで軽いので簡単に実装できる。このアプローチの問題は、自由度が低いこと。web serviceを作成した後、他の用途に利用しずらい。例えば、複雑なロジックが必要とするWeb scrapingなどに使うのは難しい。単純にhtmlをpdf化することが目的なら、 html2canvasをチェックしてみると良い。 Puppeteer は Headless ChromeのDevToolsのAPIにアクセスし、主要なChromeの機能を利用できるため、他のプロジェクトに有効利用できそうなので、Puppeteerを今回使うことにした。また、サーバーコストを最小限にするためにサーバーレス AWS Lambdaを使うことにした. Headless Chromeをより効率的にLambda上で使うために、chrome-aws-lambda を選択した。Lambda layer上に保存できる最大のファイルサイズは50MB以下、chrome-aws-lambdaは 44MBほどで, Layer上に保存できる。サイズが普通のChromeよりも小さいためロード時間が短く、Lambdaの消費時間、コストもよりすくなくなる。 Why use Docker and ECS AWSが2020年の年末に発表した、Lambdaのコンテナサポート。Dockerを使って、AWS Lambda Imageをローカル開発環境化にすることができる。 以前は、開発、テスト、デプロイするのが難しかったLambda開発だが、より身近にテスト、デプロイしやすくなった。 今までは Serverless Framework を使うのがLambdaのローカル開発環境の標準だったが、(以下記事参照). しかし、Serverless Framework は自分のマシンの設定をいじる必要があり、複数のプロジェクトを同時に開発していると不都合がでやすい。なので、Dockerコンテナを使い、AWS Lambda Runtime Emulatorを使いより本番に近い開発環境をローカルで作ることが可能になる。 事前準備 Docker Desktop (Mac OS推奨. プロジェクト内のシェルスクリプトはMac環境でテストされたものなので注意) - AWS アカウント - Lambda, Docker, SAM, CloudFormation and ECS関連の基本知識 setup AWS CLI for deloyment SAM CLI. 必要なパッケージ 以下のパッケージが必要。chrome-aws-lambdaはそれに関連するpuppeteerのバージョンを選ばないと動作しないので注意。 chrome-aws-lambda@10.0.0 puppeteer-core@10.0.0 ローカル開発環境 Dockerをセットアップし、aws-lambda-rieをインストール。以下のシェルを実行する。 ./get_lambda_rie.sh Dockerイメージを作成 2つのdockerコマンドを実行. Docker build and run. Docker イメージが作成され、 localhost:9000 のポートでLambdaが実行できる. ./docker_build_run.sh ローカルでテスト ターミナル、もしくはポストマンで以下のコマンドを実行。サイトは自分の好きなサイトに変更。 数秒後にbase 64 dataを受け取る。そのデータをpdfに変更するなら、オンラインサービス例えば、 Base64Guruを利用すると良い curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"url": "https://yourfavoritesite.com"}' AWSにデプロイする AWS cliを使って、デプロイするのでcredentialやregionなどをconfig fileに必ず設定しておく。 以下ファイルないで、s3 bucketのファイル名を定義しているので、必ずユニークであることを確認しておく。 deploy/deploy_with_sam.sh 参考資料 Generate a PDF in AWS Lambda with NodeJS, Webpack, Pug and Puppeteer Puppeteer on AWS Lambda で日本語対応したキャプチャを撮影してS3にアップロードするまでの設定 HTML to PDF using a Chrome puppet in the cloud
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】複数のContainerをDockerでつないでみた no.13

こんにちは。まゆみです。 Dockerについての記事をシリーズで書いています 以前にno.11の記事で、複数のContainerを『docker-compose』を使ってつなぐことを紹介させていただきました。 今回の記事では、 docker-compose ではなく、『Docker』を使って複数のContainerをつなごうと思ったらどれだけ面倒くさいかという、やや自虐的な実験をやってみましたので記事にまとめていきます。 ただ、この面倒くさいプロセスを実際に試してみることで、どのようにネットワークが構築されているかを身をもって理解する事ができました。 この面倒くさい経験を、みなさまと共有させていただきます。 今回作るアプリ 『作った』と言っても、コードはgit hubより、拝借させていただきました。 github のコードはこちらからどうぞ ネットワーク構築の概要は下記のようになっています。 アプリの概要は Dog か Catどちらが好きか?を投票して、集計してデータベースに収めた結果をまた表示させる というものです。 git cloneでリポジトリの複製をする 赤の➡で示されているファイルのアイコンをクリックして、コピーする Dockerfileをbuildする voteディレクトリの中にある、Dockerfile をbuildします。(-t voting-app というオプションを付け、voting-appという名前のついたImageを作りました) docker build -t voting-app . では、作ったImageからContainerを起動してみます。Webアプリなので、ポートマッピングして実行する事を忘れずに。 docker run -p 5000:80 voting-app そして、localhost:5000にアクセスしてみます。 無事に表示されました。 ただ、ここで犬か猫かの投票をしようとどちらかのボタンをクリックすると、エラーが出ます。 ターミナルに戻ると、redisとつながっていないことが原因でエラーが出ていることが分かります。 まだ、redisのContainerを起動していないですし、当然と言えば当然ですね。 redisのContainerを起動する redis Containerを ディタッチモードで (-d オプションを付ける) redis という名前を付けて (--name="redis" というオプションを付ける) 起動させます。 docker run -d --name=="redis" redis redisが起動したことを確かめてから、先ほどDockerfile から作ったImage(voting-appと名前を付けたやつ)から再びContainerを起動させます。 注意点 redis とvoting-appをつなげるために、--link redis:redisというオプションを付けて実行します docker run -p 5000:80 --link redis:redis voting-app localhost:5000にアクセスして、CATS かDOGSのボタンをクリックしてみると、今回はちゃんとチェックマークがつきました。 Postgresを準備する voting-app ➡ redis とつながったので、次はworkerにと言いたいところですが、その前提として、Postgresを起動させましょう git hub の example-voting-app > docker-compose.yml に使用するべきPostgreのバージョンが載っていますので、そのバージョンのPostgreのContainerを実行させます。 docker run -d --name="db" postgres:9.4 注意点 上記のコードで、Containerは起動するけどPostgreが動いたままにならない場合は下記のコードで試してみてください。 docker run -d --name=db -e POSTGRES_PASSWORD=postgres postgres:9.4 ではworkerディレクトリーにある、DockerfileからImageを作ります。 docker build -t worker-app . Architecture の概要を見てもらえればわかるように、workerはPostgreとredisとつながっていますので、 --link オプションで workerと二つのサーバーをつなげて実行させます docker run --link redis:redis --link db:db worker-app result ディレクトリのDockerfile を実行する 最後に、投票結果を集計して結果を表示するresult-appのDockerfileを起動させます。 resultディレクトリの中のDockerfileを実行してください。 docker build -t result-app . Imageが作り終わった後、このImageを使ってContainerを実行します。 docker run -p 5001:80 --link db:db result-app localhost:5001にアクセスしてみましょう voting-appであなたがCATSに投票していたなら、CATSが100%として表示されているはずです。 まとめ 今回の記事では、コードはgit hub から拝借して、どのContainer とどのContainerをつなげるべきかということに焦点を置いて書かせていただきました。 あえて、docker-composeを使わず、DockerCLIを使ってみました。 とても面倒くさかったです。(笑) 次回は同じアプリを『docker-compose』を利用して起動させてみたいと思います
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu20.04 に Docker を導入する

インストールがうまくいったというエビデンス。 環境 Ubuntu 20.04 LTS Desktop ja Docker Community Edition (CE) インストール方針 sudo を使って Docker コマンドを動かす Ubuntu 標準レポジトリの Docker は使わない 公式 Docker レポジトリを使用して最新版を apt でインストールする インストール 「Ubuntu 20.04へのDockerのインストールおよび使用方法 | DigitalOcean」 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja の 「ステップ1— Dockerをインストールする」 の通りやっていきます。 上記のページのステップ2において sudo なしで Docker コマンドを実行できるように説明がありますが、今回はその作業以降を省略します。 下準備 $ sudo apt update $ sudo apt install apt-transport-https ca-certificates curl software-properties-common docker の レポジトリを追加して使えるようにします。 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" $ sudo apt update インストール候補を確認します。 $ apt-cache policy docker-ce docker-ce: インストールされているバージョン: (なし) 候補: 5:20.10.7~3-0~ubuntu-focal バージョンテーブル: 5:20.10.7~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:20.10.6~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:20.10.5~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:20.10.4~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:20.10.3~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:20.10.2~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:20.10.1~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:20.10.0~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:19.03.15~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:19.03.14~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:19.03.13~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:19.03.12~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:19.03.11~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:19.03.10~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages 5:19.03.9~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages Docker公式のレポジトリになってますね。では、Dockerをインストールします。 $ sudo apt install docker-ce デーモンが起動していることを確認します。 $ sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2021-06-12 23:30:57 JST; 57s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 167273 (dockerd) Tasks: 13 Memory: 43.4M CGroup: /system.slice/docker.service └─167273 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 6月 12 23:30:56 nanbuwks-ThinkPad-X230 dockerd[167273]: time="2021-06-12T23:30:56.464426542+09:00" level=warning msg="Your kernel does not support CPU realtime sc> 6月 12 23:30:56 nanbuwks-ThinkPad-X230 dockerd[167273]: time="2021-06-12T23:30:56.464488380+09:00" level=warning msg="Your kernel does not support cgroup blkio we> 6月 12 23:30:56 nanbuwks-ThinkPad-X230 dockerd[167273]: time="2021-06-12T23:30:56.464508737+09:00" level=warning msg="Your kernel does not support cgroup blkio we> 6月 12 23:30:56 nanbuwks-ThinkPad-X230 dockerd[167273]: time="2021-06-12T23:30:56.464847077+09:00" level=info msg="Loading containers: start." 6月 12 23:30:56 nanbuwks-ThinkPad-X230 dockerd[167273]: time="2021-06-12T23:30:56.805499806+09:00" level=info msg="Default bridge (docker0) is assigned with an IP> 6月 12 23:30:57 nanbuwks-ThinkPad-X230 dockerd[167273]: time="2021-06-12T23:30:57.081790887+09:00" level=info msg="Loading containers: done." 6月 12 23:30:57 nanbuwks-ThinkPad-X230 dockerd[167273]: time="2021-06-12T23:30:57.202347194+09:00" level=info msg="Docker daemon" commit=b0f5bc3 graphdriver(s)=ov> 6月 12 23:30:57 nanbuwks-ThinkPad-X230 dockerd[167273]: time="2021-06-12T23:30:57.202660215+09:00" level=info msg="Daemon has completed initialization" 6月 12 23:30:57 nanbuwks-ThinkPad-X230 systemd[1]: Started Docker Application Container Engine. 6月 12 23:30:57 nanbuwks-ThinkPad-X230 dockerd[167273]: time="2021-06-12T23:30:57.277265072+09:00" level=info msg="API listen on /run/docker.sock" nanbuwks@nanbuwks-ThinkPad-X230:~$ 使ってみる 「git-artes/docker-gnuradio」 https://github.com/git-artes/docker-gnuradio にある、「A docker container with the release version of GNU Radio (3.8 right now) in the latest Ubuntu (and a 3.7 version in Ubuntu 18.04)」 を使ってみます。 $ git clone https://github.com/git-artes/docker-gnuradio.git Cloning into 'docker-gnuradio'... remote: Enumerating objects: 17, done. remote: Counting objects: 100% (17/17), done. remote: Compressing objects: 100% (12/12), done. remote: Total 17 (delta 6), reused 14 (delta 3), pack-reused 0 Unpacking objects: 100% (17/17), 4.27 KiB | 729.00 KiB/s, done. $ cd docker-gnuradio/ $ ls -alh 合計 64K drwxrwxr-x 5 nanbuwks nanbuwks 4.0K 6月 12 23:35 . drwxr-xr-x 49 nanbuwks nanbuwks 36K 6月 12 23:35 .. drwxrwxr-x 8 nanbuwks nanbuwks 4.0K 6月 12 23:35 .git -rw-rw-r-- 1 nanbuwks nanbuwks 846 6月 12 23:35 LICENSE -rw-rw-r-- 1 nanbuwks nanbuwks 2.9K 6月 12 23:35 README.md drwxrwxr-x 2 nanbuwks nanbuwks 4.0K 6月 12 23:35 gnuradio-releases drwxrwxr-x 2 nanbuwks nanbuwks 4.0K 6月 12 23:35 gnuradio-releases-37 $ cd gnuradio-releases $ sudo docker build -t ubuntu:gnuradio-releases . (時間かかります) $ sudo docker run --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" --device /dev/snd -v persistent:/home/gnuradio/persistent --group-add=audio -it ubuntu:gnuradio-releases bash To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details. gnuradio@nanbuwks-ThinkPad-X230:~$ cat /etc/issue Ubuntu 20.04.2 LTS \n \l gnuradio@nanbuwks-ThinkPad-X230:~$ ls persistent 動きました
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS(Elastic Beanstalk) + docker + flaskでwebアプリ(mecab利用)を公開

はじめに AWSでDocker経由でアプリ公開する手順の個人用の備忘録です。AWSは専門用語が多すぎて事前に対策しない初見で面食らいます(ました)。解説は全てAWSで詳しく書いてありますが、いかんせん情報量が多いので公開までの最低限のプロセスを自分用にまとめておきます。 以下ではmecabを使ったFlaskアプリをAWSで公開する手順になります。mecabは言語のパッケージ管理システム(pythonならpip)だけでインストールできずOS側のパッケージ管理システム(ubuntuならapt)で本体をインストールしなければならないので、AWSのelastic beanstalkにdocker経由でアプリ構築を行いました。 用語 [AWS]: Amazon Web Services、クラウドサーバー [EC2]: Elastic Compute Cloud、クラウド上でパソコンを使える。幅広いOSに対応している。 [EB]: Elastic Beanstalk、webアプリのファイルをアップロードするだけで勝手にデプロイしてくれてApacheなどの面倒な設定を省略できる。herokuと同様のサービス。この記事の中心になるサービス。 [EB CLI]: EBコマンドラインインターフェイス、EBの環境やアプリの管理をコンソール上で行うためのツール。 [IAM]: Identity and Access Management、EBコマンドを使う際に聞かれるIDとパスワード。 事前準備 docker、dockerhub、awsのアカウント登録。 dockerのインストール dockerの基礎知識は前提にしておく。 EBでの最初の動作確認 AWSにログインしたら、まず「AWSマネジメントコンソール」が表示される。EBでアプリ公開したいので、そのページから「ウェブアプリケーションの構築 Elastic Beanstalk」を選択してその先で表示される画面で環境を構築してサンプルコードで一旦アプリを動かして確認しておく。アップロードとデプロイが完了すると「ヘルス」と緑色のチェックが入った画面が表示される。 アップロード先のURL(環境名.ランダム文字列.リージョン名.elasticbeanstalk.com)をクリックしてみるとWelcomeというページが表示される。 Elastic meanstalkのトップページの左側から「環境」と「アプリケーション」のリンクからアプリの詳細を確認したり削除したりできる。先程つくったアプリは必要ないので削除しておいてよい。 EB CLIの導入 ブラウザ上でアプリをアップロードするのは基本的にコンソールでebコマンドで行うため、それのためのEB CLIをインストールする。 - EB CLIのインストール - macだとbrew install awsebcliで一発で入る。macOS で EB CLI をインストールします - pythonのpipでも簡単に入る。pip install awsebcliでもok - EBコマンドの説明 ebコマンドが使えるようになったら、まずガイダンスに従って、eb-docker-flaskというディレクトリを作成して。その中でeb initを実行する。そうすると、リージョン設定を行ったあとに(aws-access-id)と(secret-access-key)を聞かれる。 そこで、このページのアクセスキー(アクセスIDとシークレットアクセスキー)の欄から「新しいアクセスキーの作成」をクリックしてキーファイルのダウンロード(エクセスファイル)を行い。これを開くと、IDとアクセスキーが書かれているので、それをコピペしてコンソールに貼り付ければすすめる。 アプリケーション名などを聞かれるので、適当に命名しておく。 Select a platoformと聞かれるので、3) Dockerを選択する。 Select a platform branchはデフォルトのamazon linux 2で良い。(Dockerイメージによっては1のほうが良い。下記参照) キーペアを聞かれて既存のものがない場合そー新しく生成する。生成したものは$HOME/.ssh/に保存される。 docker経由でアプリ生成&デプロイ これ以降は主に「Docker プラットフォームの使用」にmecabを加えてまとめたものになる。 まず、最低限必要な、Dockerfileとapplication.pyのふたつのファイルを用意する。 Dockerfile FROM python:3.6 COPY . /app WORKDIR /app RUN apt update RUN apt install mecab -y RUN apt install mecab-ipadic -y RUN apt install libmecab-dev -y RUN apt install mecab-ipadic-utf8 -y RUN pip install flask -y RUN pip install mecab-python3 RUN cp /etc/mecabrc /usr/local/etc/ EXPOSE 5000 CMD ["python", "application.py"] OSのバージョンやなにかしらの環境が構築されているイメージを持ってくる場合は、一行目で次のように指定してあげる。 ubuntu18.04を指定する→FROM ubuntu:18.04 anaconda使いたい→FROM continuumio/anaconda3:2019.03 Flaskのサンプルコードに憲法序文とmecabを加えたもの。追加1〜3が変更点。 application.py from flask import Flask #追加1 import MeCab mecab = MeCab.Tagger( "-Owakati") # Print a nice greeting def say_hello(username = "World"): return '<p>Hello %s!</p>\n' % username # Some bits of text for the page header_text = ''' <html>\n<head> <title>EB Flask Test</title> </head>\n<body>''' instructions = ''' <p><em>Hint</em>: This is a RESTful web service! Append a username to the URL (for example: <code>/Thelonious</code>) to say hello to someone specific.</p>\n''' #追加2 instructions_jp = ''' 日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を排除する。 日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、平和を愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。われらは、平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めてゐる国際社会において、名誉ある地位を占めたいと思ふ。われらは、全世界の国民が、ひとしく恐怖と欠乏から免かれ、平和のうちに生存する権利を有することを確認する。 われらは、いづれの国家も、自国のことのみに専念して他国を無視してはならないのであつて、政治道徳の法則は、普遍的なものであり、この法則に従ふことは、自国の主権を維持し、他国と対等関係に立たうとする各国の責務であると信ずる。 日本国民は、国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。''' home_link = '<p><a href="/">Back</a></p>\n' footer_text = '</body>\n</html>' # Elastic Beanstalk looks for an 'application' that is callable by default application = Flask(__name__) # Add a rule for the index page application.add_url_rule('/', 'index', (lambda: header_text + say_hello() + mecab.parse(instructions_jp) + footer_text)) #追加3 # say_hello() + instructions + footer_text)) # Add a rule when the page is accessed with a name appended to the site # URL application.add_url_rule('/<username>', 'hello', (lambda username: header_text + say_hello(username) + home_link + footer_text)) # Run the application if __name__ == "__main__": # Setting debug to True enables debug output. This line should be # removed before deploying a production application. application.debug = True application.run(host="0.0.0.0") 動作確認 & デプロイ 以下のコマンドで、初期化してアプリを登録する。 console $ eb init -p docker [新しいアプリ名] まずはローカル環境で起動して動作確認する。上のアプリだと憲法前文がmecabで分かち書きされたものがブラウザに表示されていれば成功となる。 console $ eb local run --port 5000 動作を確認したら次にAWSに環境と作ってそこにアップロードする。次のコマンドで環境生成&デプロイまで自動でしてくれる。 console $ eb create [新しい環境名] ただ、持ってくるDockerのイメージによっては「Amazon Linux 2」では動かない場合がある。上のanacondaが入ってるイメージではエラーがでてdeployできなかった。その場合は、「Amazon Linux」をプラットフォームに指定する。(こちら参照) console $ eb create [新しい環境名] -p "Docker running on 64bit Amazon Linux" アプリ更新 アプリを更新するときは、アプリのルートフォルダでeb deployと入力すればいいが、別の環境にアップロードしてURLだけスワップするのも簡単にできる。 console $ eb create [新しい環境名2] $ eb swap [新しい環境名] --destination_name [新しい環境名2]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む