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

オリジナルアプリ【BIKKE!!】README

本記事について オリジナルアプリ【BIKKE!!】がようやくRails+Puma+Docker+AWS(ECR,ECS.EC2,RDS,S3,Route53,VPC)でデプロイが完了しました。 そこで私のアプリの全貌を記載したREADMEを公開させていただきます。 アプリ名 BIKKE!! 概要 「ライダーにしか分からないことがある。」がコンセプトです。 乗ったことのあるバイク、所有するバイクのレビューを共有することができます。 また、レビューを今後のバイク選びの参考とすることができます。 バイク探しをしたい人、自分のバイクを共有したい人、バイクメーカーで働く人などバイクに携わる全ての人に価値を提供します。 本番環境 URL 非公開 ログイン情報 ゲストログイン機能を設けています。 トップページのヘッダーより、ワンクリックでゲストユーザーとしてログインが可能です。 ゲストユーザーは、レビューの投稿、検索、コメント、お気に入り登録といった機能が実行できます。 ※アカウント情報の編集・削除機能は実行できません。 制作背景 私自身ライダーであり、バイクが大好きです。 バイクの乗り換え、新規バイクの購入を検討する際、インターネットで検索しても、結果はバイクのスペックなどあくまでもカタログ上の数値であったり、 メディアが共有する専門的なインプレッション記事などがほとんです。 私はそこに課題を感じました。 なぜなら、バイクの良さとは乗ってみないと分からないことが多々あると考えているからです。 「ライダーにしか分からないことがある。」バイクの良さも悪さも、全てがバイク探しの重要なリソースです。 そんなバイク探しの指南となるアプリケーションを作成したいと考えたことが、本アプリケーションの制作背景となります。 DEMO トップページ(検索機能・レビュー一覧表示・ログイン機能) ・トップの写真には、ロード時に文字が浮き上がるようなアニメーションを付与しました。 ・ログイン画面もありますが、トップページからもログインができるようフォームを設置しています。 ・トップ中央に検索機能のコンポーネントがあります。 ・トップ下部にレビュー一覧が、スクロールによりふわっと浮き上がるアニメーションで表示されます。 ・レビューの一覧表示はページネーション機能を用いてコンパクトにまとめました。 また、ページネーションはBootstrapを用いてより見やすく、かつAjax通信により素早くページ切り替えが可能です。 新規登録画面 ・トップページヘッダーより遷移します。 ・必要な情報は「メールアドレス」「パスワード」「ニックネーム」のみとシンプルに仕上げました。 ・エラーメッセージは日本語化しております。 ・パスワードには正規表現のバリデーションを設け、セキュアにエラーメッセージを返します。 ・登録が完了すると、フラッシュメッセージでユーザーに登録が完了したことをアナウンスします。 ・ヘッダーにニックネームが表示されるようになります。 ログイン画面/ログアウト ・トップページヘッダーの「Log out」ボタンよりワンクリックでログアウトが可能です。 また、フラッシュメッセージでユーザーにログアウトが完了したことをアナウンスします。 ・トップページヘッダーの「Sign in」ボタンよりログイン画面に遷移します。 ・ログインに必要な情報は「メールアドレス」と「パスワード」のみです。 ・エラーメッセージは日本語化しています。 ・ログインに成功すると、トップページにリダイレクトされ、フラッシュメッセージでユーザーにログインが成功したことをアナウンスします。 ・トップページのヘッダーにニックネームが追加されます。 ・トップページ写真部分にあるログインフォームからも、ログインが可能です。 マイページ画面(ユーザーページ画面)・アカウント情報編集機能 ・トップページヘッダーに表示された、ニックネームをクリックし遷移します。 ・マイページ画面には、そのユーザーが投稿したレビューやお気に入りしたレビューを一覧で閲覧することができます。 ・表示されるレビュー一覧は、アニメーションで表示されます。 ・マイページ画面に遷移したユーザーが本人である場合、アカウント情報編集ボタンが表示されます。 ・マイページに遷移したユーザーが本人である場合、アカウント情報の編集が可能です。 ・メールアドレスやパスワード、ニックネームの変更が可能です。 ・変更を行わない項目は空白にすることで、そのまま保存されます。 ※ゲストユーザーはアカウント情報の編集は不可能です。 レビュー投稿画面 ・トップページヘッダーにあります「Post」ボタンからワンクリックでレビュー投稿画面に遷移します。 ・レビューの入力項目は写真、車種名、年式、排気量、メーカー、車種タイプ、乗り心地、燃費、メンテナンス性、維持費、速度、見た目の満足度、総合評価、レビューテキスト、で構成されています。 ・写真は任意項目で、そのほかは入力必須項目となります。 ・写真は1枚のみ投稿可能で、プレビュー表示されます。 ・車種名、レビューテキストは自由入力、年式は半角4桁入力、排気量、メーカー、車種タイプはActiveHashによるカテゴリー選択、 燃費、メンテナンス性、維持費、速度、見た目の満足度、総合評価はjQueryによる星評価でレビューを投稿します。 ・「投稿する」ボタン押下により、トップページにリダイレクトされ、フラッシュメッセージの案内とともに投稿が完了したことをお知らせします。 ・レビュー一覧に追加で表示されます。 ・一覧表示時に表示される項目は、写真、車種名、総合評価のみです。 レビュー詳細画面(お気に入り機能・コメント機能) ・一覧表示されたレビューからワンクリックでレビュー詳細画面に遷移します。 ・これは「マイページ(ユーザーページ)に表示されるレビュー一覧」、「検索結果として表示されるレビュー一覧」からも同様に、気になるレビューをワンクリックすることで詳細画面に遷移します。 ・詳細画面では、レビュー投稿で入力した全ての項目が表示されます。 ・ユーザーはあらゆる側面から気になるバイクのレビューを確認することができます。 ・レビュー詳細画面が投稿した本人のレビューである場合、「編集」ボタンと「削除」ボタンが表示されます。 ・レビューが投稿した本人のレビューではない場合、「お気に入り」登録ボタンが表示されます。 ・Ajax通信により、ワンクリックで即お気に入りに登録されます。 ・お気に入りしたレビューはマイページから一覧で管理することができます。 ・また、お気に入りの解除もワンクリックで可能です。 ・詳細画面ではコメントを投稿することが可能です。 ・レビュー投稿者に追加で質問がある場合などに便利です。 ・コメント投稿後、フラッシュメッセージで投稿が完了したことをお知らせし、詳細画面にリダイレクトします。 ・コメントは、投稿者、コメント内容、投稿時間で構成され、コメント投稿したユーザー本人である場合、コメント削除ボタンが表示されます。 レビュー編集画面・レビュー削除機能 ・レビュー詳細画面から、「編集」ボタンを押下し、編集画面に遷移します。 ・編集画面は投稿したユーザー本人のみが遷移可能です。URLを直接打ち込んでも他のユーザーは遷移できません。 ・編集画面は投稿した内容を全て保持しています。 ・ActiveHashによるカテゴリーの再選択、jQueryによる星評価の再評価も簡単に行うことができます。 ・詳細画面より「削除」ボタンを押下することで、レビューの削除が可能です。 ・アラートメッセージにより、本当に削除するか確認します。 ・確認時に「OK」ボタンを押下することにより、フラッシュメッセージが削除完了をお知らせします。 検索結果画面 ・トップページに全ての検索機能を設けています。 ・キーワード検索では、該当する車種名に一部分でも文字が含まれている場合、結果を返します。 ・検索結果に表示されるレビューはアニメーションにより、ふわっと表示されます。 ・排気量、メーカー、車種タイプはカテゴリーに該当するものをワンクリックで一覧表示させます。 ・排気量、メーカー、車種タイプ3つの項目を元に絞り込み検索も可能です。 ・必要ない項目は「指定なし」の状態で検索から省くことが可能です。 工夫したポイント 常にユーザー視点に立ち、ユーザーが「使いやすい、楽しい」と思えるようなUI/UXを意識して制作しました。 具体的なポイントとして、 ・初めてこのアプリを見ても、直感的に使用方法が理解できる。 ・アニメーションを用いて、視覚的な楽しみを作る。 ・なるべく画面遷移を少なく、ワンクリックで目的地に辿り着けるルーティング作成 ・jQueryやAjax通信により素早いレスポンスを与え、ストレスレスな操作感 などが工夫したポイントです。 苦労したポイント とにかくデプロイの一言につきます。 本アプリはDockerで開発したコンテナを、ECRにプッシュし、ECS(EC2)+VPC+RDS+S3でデプロイしたものに、Freenom+Route53でドメインを設定し本番運用しています。 過去にDockerを用いていないRailsをEC2にてデプロイをしたことがありますが、Dockerをデプロイすることは私にとって非常にハイレベルなものでした。 ネットワーク周りのエラー、接続されてもローカルでは出なかったRailsエラーにも悩まされました。 まずはDockerを再度基本から学び直し、そしてAWSでどのようにデプロイしたものが外部アクセスできるのか、学習に励み、その結果デプロイすることができました。 この経験は私の中でも非常に自信につながるものであり、引き続き学習に努め、より自分のものへと吸収していきたいと考えています。 使用技術(開発環境) サーバーサイド:Ruby on Rails フロントサイド:HTML, CSS, JavaScript, jQuery, Bootstrap テスト:RSpec インフラ:Docker, AWS(ECR+ECS+EC2+S3+VPC+S3+Route53), Freenom エディタ:VScode 課題・今後実現したい機能 レスポンシブデザイン化 現時点ではブラウザでのみしか表示が適応しておらず、スマホやタブレットサイズでも快適にアプリが使用できるレスポンシブデザイン化は必須と考えます。 具体的にはCSSにメディアクエリを用いて実装予定です。 アカウント削除機能 退会する機能が未実装であります。退会するまでのフローチャートをシンプルにして実装予定です。ただし、この機能はワンクリックでアカウントが削除されないように注意すべき点であると考えます。 検索機能の充実化 現在検索機能はトップページに集約されています。今後は検索結果ページにも検索機能を追加実装する予定です。 理由は、ユーザーが一度検索を行い、欲しい情報が得られなかった場合、少し範囲を広げて検索する行動が予測され、都度トップページに戻るのは煩わしいと考えるからです。 CI/CDパイプライン作成、デプロイの自動化 現在は下記の流れで手動デプロイを行っております。 ①ECRにイメージをプッシュ ②ECS・EC2インスタンスにSSH接続し、コンテナを再起動 特に手間があるわけでもなく、またローカルで動作をしっかり吟味した上でデプロイを行いたいので、性に合ってはいるのですが、今後はエンジニアで働くことをイメージして、CI/CDパイプラインによりgitからの自動デプロイが出来たらと考えています。 DB設計 ER図 usersテーブル Column Type Options email string null: false, unique: true encrypted_password string null: false nickname string null: false Association has_many :reviews has_many :comments has_many :likes reviewsテーブル Column Type Options bike string null: false year integer null: false displacement_id integer null: false maker_id integer null: false type_id integer null: false recommend float null: false comfort float null: false fuel float null: false maintenance float null: false cost float null: false speed float null: false look float null: false content text null: false user references null: false, foreign_key: true Association belongs_to :user has_many :comments has_many :likes commentsテーブル Column Type Options text text null: false user references null: false, foreign_key: true review references null: false, foreign_key: true Association belongs_to :user belongs_to :review likesテーブル Column Type Options user references null: false, foreign_key: true review references null: false, foreign_key: true Association belongs_to :user belongs_to :review
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】【Rails】MySQL8.0にしたらログが出力されなくなった話

以前自分はMySQL5.7のイメージを使ってdbコンテナを立ち上げて、開発してました。 その時は docker-compose up を実行したら rails sみたいな eb_1 | Started GET "/" for 172.20.0.1 at 2021-06-12 13:36:48 +0000 web_1 | Cannot render console from 172.20.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 web_1 | Processing by DrinksController#index as HTML web_1 | User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 7 LIMIT 1 web_1 | ↳ app/helpers/sessions_helper.rb:52:in `current_user' web_1 | (0.6ms) SELECT COUNT(*) FROM `drinks` WHERE `drinks`.`user_id` != 6 AND (user_id IN (SELECT followed_id FROM relationships WHERE follower_id = 7) OR user_id = 7) web_1 | ↳ app/controllers/drinks_controller.rb:14:in `index' web_1 | web_1 | From: /coffee_passport/app/controllers/drinks_controller.rb:25 DrinksController#index: こんな感じのログが出てくれました。 ある日、本番環境がMySQL8系なので、 開発環境もMySQL8.0に統一した方がバグもすくなるなると考えて docker-compose.yml version: '3' services: db: image: mysql:8.0.21 cap_add: - SYS_NICE # コンテナにLinux機能を追加するオプションのようです。SYS_NICEは、プロセスの優先度(nice値)をあげます。 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_HOST: db ports: - '3306:3306' volumes: - mysql-data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password # 認証方式を8系以前のものにする  このように書き換えて再度ビルドし docker-compose up を実行すると rails sみたいなログが出力されなくなってしまいました。 これはかなり不便なので色々調べると googleの3ページ目に http://hotatekun.hatenablog.com/entry/2021/04/04/224001 こんな感じの記事がありました。 puma.rb # workers ENV.fetch("WEB_CONCURRENCY") { 2 } # Use the `preload_app!` method when specifying a `workers` number. # This directive tells Puma to first boot the application and load code # before forking the application. This takes advantage of Copy On Write # process behavior so workers use less memory. # # preload_app! # Allow puma to be restarted by `rails restart` command. plugin :tmp_restart app_root = File.expand_path("../..", __FILE__) bind "unix://#{app_root}/tmp/sockets/puma.sock" stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true どうしてpuma.rbをこのように編集したか覚えてないのですが、 puma.rb # stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true unless ENV.fetch("RAILS_ENV", "development") == "development" stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true end # puma.rbで、標準出力が log/puma.stdout.log にリダイレクトされていたのが原因だった。 # 開発環境ではファイルにリダイレクトしない形にしたらコンソールが表示されるようになった。 と変更することで docker-compose up を実行したら ターミナルにrails sみたいなログが出力されるようになりました。 docker-compose up -d が主流?みたいですが皆様は普段どんな感じでログを見てるか気になるところです。 binding.pryで処理は止まって web_1 | 17: .includes(:user)) web_1 | 18: web_1 | 19: @title = 'Timeline' web_1 | 20: web_1 | 21: @selected = 'Selected' web_1 | 22: web_1 | 23: @random_drinks = Drink.order('RAND()').limit(5) web_1 | 24: web_1 | => 25: binding.pry web_1 | 26: web_1 | 27: end このように表示されますが、 こっから何を入力しても反応がないので これからまたどうやってbinding.pryをしようかちゃんと調べて記事にします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】【Rails】MySQL8.0にしたらログが出力されなくなったので解決した話

以前自分はMySQL5.7のイメージを使ってdbコンテナを立ち上げて、開発してました。 その時は docker-compose up を実行したら rails sみたいな eb_1 | Started GET "/" for 172.20.0.1 at 2021-06-12 13:36:48 +0000 web_1 | Cannot render console from 172.20.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 web_1 | Processing by DrinksController#index as HTML web_1 | User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 7 LIMIT 1 web_1 | ↳ app/helpers/sessions_helper.rb:52:in `current_user' web_1 | (0.6ms) SELECT COUNT(*) FROM `drinks` WHERE `drinks`.`user_id` != 6 AND (user_id IN (SELECT followed_id FROM relationships WHERE follower_id = 7) OR user_id = 7) web_1 | ↳ app/controllers/drinks_controller.rb:14:in `index' web_1 | web_1 | From: /coffee_passport/app/controllers/drinks_controller.rb:25 DrinksController#index: こんな感じのログが出てくれました。 ある日、本番環境がMySQL8系なので、 開発環境もMySQL8.0に統一した方がバグもすくなるなると考えて docker-compose.yml version: '3' services: db: image: mysql:8.0.21 cap_add: - SYS_NICE # コンテナにLinux機能を追加するオプションのようです。SYS_NICEは、プロセスの優先度(nice値)をあげます。 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_HOST: db ports: - '3306:3306' volumes: - mysql-data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password # 認証方式を8系以前のものにする  このように書き換えて再度ビルドし docker-compose up を実行すると rails sみたいなログが出力されなくなってしまいました。 これはかなり不便なので色々調べると googleの3ページ目に http://hotatekun.hatenablog.com/entry/2021/04/04/224001 こんな感じの記事がありました。 puma.rb # workers ENV.fetch("WEB_CONCURRENCY") { 2 } # Use the `preload_app!` method when specifying a `workers` number. # This directive tells Puma to first boot the application and load code # before forking the application. This takes advantage of Copy On Write # process behavior so workers use less memory. # # preload_app! # Allow puma to be restarted by `rails restart` command. plugin :tmp_restart app_root = File.expand_path("../..", __FILE__) bind "unix://#{app_root}/tmp/sockets/puma.sock" stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true どうしてpuma.rbをこのように編集したか覚えてないのですが、 puma.rb # stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true unless ENV.fetch("RAILS_ENV", "development") == "development" stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true end # puma.rbで、標準出力が log/puma.stdout.log にリダイレクトされていたのが原因だった。 # 開発環境ではファイルにリダイレクトしない形にしたらコンソールが表示されるようになった。 と変更することで docker-compose up を実行したら ターミナルにrails sみたいなログが出力されるようになりました。 docker-compose up -d が主流?みたいですが皆様は普段どんな感じでログを見てるか気になるところです。 binding.pryで処理は止まって web_1 | 17: .includes(:user)) web_1 | 18: web_1 | 19: @title = 'Timeline' web_1 | 20: web_1 | 21: @selected = 'Selected' web_1 | 22: web_1 | 23: @random_drinks = Drink.order('RAND()').limit(5) web_1 | 24: web_1 | => 25: binding.pry web_1 | 26: web_1 | 27: end このように表示されますが、 こっから何を入力しても反応がないので これからまたどうやってbinding.pryをしようかちゃんと調べて記事にします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ボリュームの中身が更新されているか確認する(初心者向け)

はじめに Dockerにてマウントする方法にバインドマウントとボリュームマウントがあるかと思います。 バインドマウントはマスター環境で作成したディレクトリにデータを直接放り込む事でコンテナに直接反映されますが、ボリュームマウントはDockerEngine上にボリュームをマウントするのでボリュームの中身を確認しづらいかと思います。 力技?でボリュームマウントで作成したボリュームの中身を確認する方法を試してみたのですが、忘れてしまいそうなので備忘録として残しておきます。 これを書いている現在、Dockerを学び始めて1ヵ月程度&エンジニアですらないので、「そんなのなんちゃってな確認方法だ」「ただの2重チェックに過ぎない」と思われるかもですが、温かくご指摘頂けると嬉しいです。 私自身インフラ的知識もプログラミングスキルも初心者ですので、初心者にも解りやすい内容になっていればい良いなと思います。 環境 ・Windows10 Home(64bit) ・DockerDesktop for Windows(WSL2) 図解 ボリュームをマウントしたapacheコンテナを起動し、そこにhtmlファイルを作成するという体で進めていきます。 ボリュームマウントでマウントされたボリュームの中身を確認するために確認用のLinuxコンテナ別途起動し、ボリュームに接続して確認をしてみます。 ①ボリュームを作成 $ docker volume create hoge_volume ②ボリュームがマウントされたApacheコンテナを起動する $ docker run --name hoge_apache -d -p 8080:80 -v hoge_volume:/usr/local/apache2/htdocs httpd 公式で用意されているApacheイメージを使用します。 これでボリュームがマウントされたApacheコンテナが立ち上がりました。 ちゃんと起動できているか確認してみます。 ブラウザにhttp://localhost:8080/と入力。ちゃんと起動できている事が確認できました。 ③同じボリュームがマウントされたlinux(ubuntu)コンテナを起動する $ docker run --name hoge_ubuntu -dit -v hoge_volume:/home ubuntu apacheコンテナと同じボリュームにマウントされたlinuxコンテナが立ち上がりました。 ④ボリューム内のhtmlファイルを更新してみる <html> <head> <meta charset="utf-8"> </head> <body> <h1>更新したよ</h1> </body> </html> ボリューム内のhtmlファイルを上記に変更します。 今回はマスター(windows)のドキュメント下に「hoge_directory」フォルダを作成し、更新用htmlファイルを作成しました。 これをcpコマンドでボリュームに移します。 $ docker cp C:\Users\[ユーザー名]\Documents\hoge_directory\index.html hoge_apache:/usr/local/apache2/htdocs/ ⑤ボリューム内がちゃんと更新されているか確認してみる cpコマンドで更新したので、Apacheコンテナのhtdocs下を調べるともちろん更新されていますが、ちゃんとボリューム内が更新されているのかLinuxコンテナから確認してみます。 Linuxコンテナでは/homeディレクトリにボリュームをマウントしているので、ここがちゃんと更新されていたら正常にボリューム内が更新されたという事になりますよね。 $ docker exec -it hoge_ubuntu /bin/sh 上記コマンドでLinuxコンテナ内に入ります。 /homeディレクトリを確認してみます。 ちゃんと更新されてました! root権限で確認したり、ボリューム内を確認する専用のイメージを使う方法等やり方は沢山あるみたいですが、自分の様な初心者ならこの方法のほうが理解しながら進められるような気がしました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JupyterNotebookでファイルを作成しようとするとpermission deniedとなる

はじめに 環境作成をしていると権限関係でエラーが生じることがたまにあります。 権限関係のエラーは解決が難しいイメージがあります。 本日は、JupyterNotebook (JupyterLab)で権限関係のエラーがでて、解決しましたのでまとめたいと思います。 環境 windows 10 Docker Desktop 3.3.0 利用したDockerfileはこちら 問題 Dockerを利用して、JupyterNotebook (JupyterLab)の環境を作成して、アクセスしました。 そして新規ファイル(.ipynb)を作成したところ以下のようなエラーが出ました。 JupyterNotebook JupyterLab permission deniedとあるとおり権限が付与されていないことによるエラーです。 また、このエラーはDocker imageをdocker runして起動したときに起きるもので、docker-compose upでコンテナを起動したときには出ませんでした。 調査 まずはDockerのコンテナの中に入り、以下のコマンドを入れます。 $ ls -la このコマンドについてはこちらを確認してください。 すると、以下のように表示されます。 今回、JupyterNotebook (JupyterLab)を利用しているディレクトリは、最後から2行目のdataというところですが、権限がrootになっています。 Jupyterを利用する場合、jovyanにする必要があります。これがエラーの原因でした。 解決方法 方法1. Dockerfileの見直し Dockerfileで./dataというディレクトリを作成しているところを確認すると、 FROM jupyter/datascience-notebook # Setting jupyter notebook environment. RUN rmdir work ARG password=not_password # install libraries ENV GRANT_SUDO=yes USER root (途中省略) RUN mkdir ./data # jupyter config COPY ./settings/jupyter_notebook_config.py .jupyter/ rootユーザーでディレクトリを作成していました。 このユーザーをjovyanに変更して、dataディレクトリを作成します。 FROM jupyter/datascience-notebook # Setting jupyter notebook environment. RUN rmdir work ARG password=not_password # install libraries ENV GRANT_SUDO=yes USER root (途中省略) # ユーザー変更 ENV GRANT_SUDO=no USER jovya RUN mkdir ./data # upyter config COPY ./settings/jupyter_notebook_config.py .jupyter/ すると、無事成功しました。 このDockerfileに関してはこちらのリポジトリで確認できます。 方法2. コマンドで権限を変更する まず、コンテナの中に入ります。 $ docker exec -it [コンテナ名] sh そのあと、権限を変更します。 # sudo chown -R [変更するユーザー名] [変更するディレクトリorファイル] $ sudo chown -R jovyan data このコマンドはこちらを参考にしました。 パスワードが求められるのでいれてください。 私の場合は、Dockerfileでパスワードを設定しています。 FROM jupyter/datascience-notebook # Setting jupyter notebook environment. RUN rmdir work ARG password=not_password (省略) パスワードはnot_passwordといれました。 password: (not_password ただし表示はされない) userからjovyanに変更されました。 ただしこの方法ではdocker runするたびに変更が必要になるので、Dockerfileで権限変更の処理をします。 Dockerfileを以下のように変更します。 FROM jupyter/datascience-notebook # Setting jupyter notebook environment. RUN rmdir work ARG password=not_password # install libraries ENV GRANT_SUDO=yes USER root (途中省略) RUN mkdir ./data # jupyter config COPY ./settings/jupyter_notebook_config.py .jupyter/ # 権限変更 RUN chown -R jovyan data これでファイルが作成できるようになりました。 おわりに 今回は権限の対処をしました。最近権限で同じようなことをしていたのでうまく対処ができました。 動かなかったらとりあえず確認してみるのは大切です。 参考記事 lsコマンドの使い方と覚えたい15のオプション【Linuxコマンド集】 Anacondaインストール後のJupyterの設定: ブラウザとパスワードの設定・nbextensionsとその他拡張機能の追加・設定
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

よく使うDockerコマンド

背景 dockerを使う機会が増えたので、特にdocker imageを作り直すときによく使うコマンドをメモしていきます。 コマンド一覧 docker-compose down コンテナを停止させる Docker desktopで、不要なimageとvolumeを削除する コマンドでやっても良いか、GUIの方が簡単 docker system df -v image/container/volume/cacheの使用量を確認する docker system prune container/network/image/cacheを削除する docker system df -v 削除後の状態を確認する docker-compose build コンテナをビルドする docker-compose run web bundle exec rake db:create DBを作成する docker-compose run web bundle exec rake db:migrate DBにマイグレーションする docker-compose up コンテナを起動する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでNode.jsのインストールに失敗する

Dockerでdocker compose up --buildした際に node-jsをインストールするとこでエラーが出たので、再発用に残しておきます。 エラー箇所 Dockerfile内 RUN apt-get install -y gnupg \ && curl -sL https://deb.nodesource.com/setup_10.x | bash - \ && apt-get install -y nodejs エラー内容 Error executing command, exiting 対処法 STEP1 エラー箇所をコメントアウト # RUN apt-get install -y gnupg \ # && curl -sL https://deb.nodesource.com/setup_10.x | bash - \ # && apt-get install -y nodejs STEP2 docker compose up --buildを再度実行 STEP3 dockerコンテナに入る docker exec -ti コンテナ名 bash STEP4 ソースの削除 rm -rf /var/lib/apt/lists/* rm -rf /etc/apt/sources.list.d/* apt-get update 参考:https://askubuntu.com/questions/1141035/error-executing-command-exiting (sudoがあると怒られたので、sudoなしで実行) STEP5 コメントアウトしたコマンドを実行 RUN apt-get install -y gnupg curl -sL https://deb.nodesource.com/setup_10.x | bash - apt-get install -y nodejs 完了 理由については、まだよくわかってませんが、とりあえず動くようにはなりました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerでpythonの開発環境を作成し、requests-htmlでのスクレイピング結果をslackに送信する

はじめに スクレイピングを行うにあたりこちらの注意事項まとめを参考にさせていただきました。 概要 requests-htmlでスクレイピングし、slackにメッセージを飛ばす仕組みを実装します。 スクレイピング対象のページが動的なページのためBeautiful Soupが使えず、requests-htmlを使用しました。 今回、個人利用の目的で 1. yahooニュースの東京都のコロナ関連情報ページをスクレイピング 2. 表示されている3件のニュースのタイトルと記事urlを取得する 3. 取得結果をslackの任意のチャンネルに投稿する という仕組みを実装します。 環境/使用する技術 MacOS Big Sur python 3.6 スクレイピングするためのライブラリ requests-html Docker version 19.03.13(開発環境構築) docker-compose version 1.27.4(開発環境構築) slack webhook 開発環境構築 pythonのコードを書くための使い捨て開発環境を作成します。Dockerを使用します。 今回使用するイメージはpythonの3.6バージョンです。 ※ requests-htmlがpython3.6のみサポートしているため 開発マシン(Mac)側では適当なディレクトリを掘ってソースコードを以下のように配置します。 ├── Dockerfile ├── docker-compose.yml └── src └── checkNews.py // スクレイピングするファイル Dockerfile Dockerfileを書きます。 touch Dockerfile Dockerfileは以下とします。 Dockerfile FROM python:3.6 WORKDIR /usr/src/pythonwork RUN apt-get update && \ pip install requests-html && \ pip install pyppeteer && \ pip install slackweb docker-compose.yml docker-compose.ymlを作成します。 touch docker-compose.yml docker-compose.ymlは以下とします。 docker-compose.yml version: "3.8" services: python: build: . volumes: - ./src:/usr/src/pythonwork tty: true working_dir: /usr/src/pythonwork コンテナの作成 コンテナを作成します。 docker-compose build 開発環境構築は以上です。 webhookの利用設定 slackに投稿する際、Incoming webhookを使うのでこちらに沿って設定を行ってください。 スクレイピングするソースコード yahooの東京都のコロナニュースの件名と記事のurlを3件取得し、slackの#generalチャンネルに投稿します。 from requests_html import HTMLSession import slackweb import re news_url = "https://news.yahoo.co.jp/pages/article/covid19tokyo" slackweb_url = "https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxx" # セッション開始 session = HTMLSession() r = session.get(news_url) # HTMLを生成 r.html.render() for num in range(1, 4): # スクレイピング article_title = r.html.find("#tab_1 > ul.dlpThumbLink > li:nth-child(" + str(num) + ") > a > span.dlpThumbText > span:nth-child(1)", first=True) article_title_text = article_title.text article_link = r.html.find("#tab_1 > ul.dlpThumbLink > li:nth-child(" + str(num) + ") > a", first=True) article_url = article_link.absolute_links # slackへ投稿 slack = slackweb.Slack(url=slackweb_url) slack.notify(text=article_title_text + '\n' + re.sub("\{|\}|'", "", str(article_url)), channel="#general", username="covid19-news-bot", icon_emoji=":eyes:", mrkdwn=True) スクレイピングを実行する コンテナを立ち上げ、コンテナ内に入ります。 docker-compose up -d docker-compose exec python bash checkNesw.pyを動かします。 初回実行ではヘッドレスブラウザをインストールします。[W:pyppeteer.chromium_downloader] start chromium download. # python checkNews.py エラー:pyppeteer.errors.BrowserError: Browser closed unexpectedlyが出力される root@353345a20664:/usr/src/pythonwork# python checkNews.py [W:pyppeteer.chromium_downloader] start chromium download. Download may take a few minutes. 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 108773488/108773488 [00:03<00:00, 32959625.14it/s] [W:pyppeteer.chromium_downloader] chromium download done. [W:pyppeteer.chromium_downloader] chromium extracted to: /root/.local/share/pyppeteer/local-chromium/588429 Traceback (most recent call last): File "checkNews.py", line 15, in <module> r.html.render() File "/usr/local/lib/python3.6/site-packages/requests_html.py", line 586, in render self.browser = self.session.browser # Automatically create a event loop and browser File "/usr/local/lib/python3.6/site-packages/requests_html.py", line 730, in browser self._browser = self.loop.run_until_complete(super().browser) File "/usr/local/lib/python3.6/asyncio/base_events.py", line 488, in run_until_complete return future.result() File "/usr/local/lib/python3.6/site-packages/requests_html.py", line 714, in browser self._browser = await pyppeteer.launch(ignoreHTTPSErrors=not(self.verify), headless=True, args=self.__browser_args) File "/usr/local/lib/python3.6/site-packages/pyppeteer/launcher.py", line 306, in launch return await Launcher(options, **kwargs).launch() File "/usr/local/lib/python3.6/site-packages/pyppeteer/launcher.py", line 167, in launch self.browserWSEndpoint = get_ws_endpoint(self.url) File "/usr/local/lib/python3.6/site-packages/pyppeteer/launcher.py", line 226, in get_ws_endpoint raise BrowserError('Browser closed unexpectedly:\n') pyppeteer.errors.BrowserError: Browser closed unexpectedly: エラーメッセージで調べてみると、ヘッドレスブラウザを使うにはライブラリが不足しているようです。 こちらの記事を参考にpyppeteerに必要なライブラリをapt-get installしました。 以下参考先サイトさまから引用させていただきます。 sudo apt-get install gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget コンテナにはrootログインしているのでsudoは省き、実行します。(※DockerfileのRUNに↓を書いておけば再発しません。その際は-yを忘れずに) apt-get install gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget 再度実行。 root@353345a20664:/usr/src/pythonwork# python checkNews.py root@353345a20664:/usr/src/pythonwork# slackに投稿できました。urlをクリックするとちゃんと記事のページを開くことができました。 参考サイト pyppeteer.errors.BrowserErrorの対応策 Dockerのバージョンとdocker-composeのサポート対応表 requests-htmlについて
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

`Uncaught Error: Module build failed (from ./node_modules/sass-loader/dist/cjs.js)`の解決法

Dockerを利用した個人開発で遭遇した下記エラーの対処方法について解説します。 Uncaught Error: Module build failed (from ./node_modules/sass-loader/dist/cjs.js): Error: Missing binding /myapp/node_modules/node-sass/vendor/linux-x64-72/binding.node Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 12.x Found bindings for the following environments: - OS X 64-bit with Node.js 12.x 開発環境 $ sw_vers ProductName: macOS ProductVersion: 11.3 BuildVersion: 20E232 解決策 docker-compose run --rm <container_name> yarn add node-sass --force docker-compose経由でDockerコンテナ上でアプリケーションを開発していたにもかかわらずdocker-composeコマンドを使わずyarn addしてしまったため、ホスト(Mac OS X)環境用のnpmライブラリがインストールされてしまっていたことが原因だとわかりました。 再ビルドすることで、Dockerコンテナ上のLinux用のnode-sassをインストールでき、無事エラーが解決しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

`Uncaught Error: Module build failed (from ./node_modules/sass-loader/dist/cjs.js)` の解決法

Dockerを利用した個人開発で遭遇した下記エラーの対処方法について解説します。 Uncaught Error: Module build failed (from ./node_modules/sass-loader/dist/cjs.js): Error: Missing binding /myapp/node_modules/node-sass/vendor/linux-x64-72/binding.node Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 12.x Found bindings for the following environments: - OS X 64-bit with Node.js 12.x 開発環境 $ sw_vers ProductName: macOS ProductVersion: 11.3 BuildVersion: 20E232 解決策 docker-compose run --rm <container_name> yarn add node-sass --force docker-compose経由でDockerコンテナ上でアプリケーションを開発していたにもかかわらずdocker-composeコマンドを使わずyarn addしてしまったため、ホスト(Mac OS X)環境用のnpmライブラリがインストールされてしまっていたことが原因だとわかりました。 再ビルドすることで、Dockerコンテナ上のLinux用のnode-sassをインストールでき、無事エラーが解決しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Python]Seleniumを用いたDocker環境でのE2Eテスト方法 メモ

Docker環境でのSeleniumを用いたE2Eテスト方法についてメモする。 構成 事前準備 Docker環境で動かすため、こちらの構成でdocker-compose.ymlやDockerfileなどdocker-seleniumを利用するための設定を準備する。 テストコードtest.py seleniumでQiita検索した結果を確認する。 テストコードの大まかな書き方 テスト前処理:ドライバ設定などを記述する。 テスト実行:ブラウザ操作とその際の期待結果を記述する。 テスト後処理:ドライバクローズなどを記述する。 import os import unittest from selenium.webdriver.common.keys import Keys from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.expected_conditions import presence_of_element_located from selenium.webdriver.common.desired_capabilities import DesiredCapabilities class SampleTest(unittest.TestCase): # テスト前処理: ドライバ設定 def setUp(self): self.driver = webdriver.Remote( command_executor=os.environ["SELENIUM_URL"], desired_capabilities=DesiredCapabilities.CHROME.copy() ) # テスト後処理:ドライバクローズ def tearDown(self): self.driver.quit() # Qiita検索 テスト def test_qiita_search(self): # 任意のHTMLの要素が特定の状態になるまで待つ # ドライバとタイムアウト値を指定 wait = WebDriverWait(self.driver, 10) # テスト対象へアクセス self.driver.get("https://qiita.com/") # 検索ボックス入力→検索実行 self.driver.find_element(By.NAME, "q").send_keys( "selenium" + Keys.RETURN) # 1件目の検索結果を取得(描画されるまで待機) first_result = wait.until( presence_of_element_located((By.CSS_SELECTOR, "h1"))) print("first_result:"+first_result.get_attribute("textContent")) # タイトルに`selenium`が含まれるかを判定 assert "selenium" in ( first_result.get_attribute("textContent")).lower() if __name__ == '__main__': unittest.main() 動作確認 ビルド→起動→コンテナの中に入る。 docker-compose build --no-cache docker-compose up -d docker-compose exec app bash コード実行 cd test python test.py 期待値 ...省略 ---------------------------------------------------------------------- Ran 1 test in 7.221s OK 参考情報 pythonでseleniumのテストコードを書いてみる unittest --- ユニットテストフレームワーク
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker login azureでAzureにログインしようとしたがno such hostでブラウザが開かない

はじめに JupyterLabの環境をデプロイしたいと思い、Azureの勉強をしているのですが、会社で利用している環境でコマンドが正しく動作しなかったのでまとめてみました。 開発環境 Vscode Docker desktop 3.3.0 問題 結論として、Docker desktopのバージョンが古いことが原因でした 以下に解決までの道のりとアップデートの方法についてまとめます。 Azure Container InstanceでACIを作成するときに以下のコマンドをpowershellに入力します。 docker login azure 本来であれば自動でブラウザが立ち上がり、microsoftの認証画面が開きログインすることでlogin successedと表示されます。 しかし、以下のような入力を求めてきてブラウザは開きません。 > username: > password: とりあえず言われた通りAzureアカウントのユーザー名とパスワードを入れたところ、以下のようなエラーがでました。 Error response from daemon: Get https://azure/v2/: dial tcp: lookup azure on 192.168.65.1:53: no such host 調べてもうーんよくわからない。 私用のPCで試した時にはブラウザが開いているのでおかしいと思い、調べて解決したことを以下にまとめます。 解決方法 直接的な解決方法はネットに落ちておらず、ツイッターにて同じ症状の方がいるくらいでした。 docker login azure doesn't popup a browser. So how do I sign in?— Matthijs Hoekstra (@mahoekst) August 8, 2020 色々、調べたところ以下の記事で手掛かりを見つけます。 この記事にこのような記述があります。(要約は以下) Docker Desktop Communityの安定板をリリースをした。 Docker CLIのクラウドインテグレーションは、ネイティブなdockerコマンドを使用して、クラウドのサーバーレスコンテナ実行環境である「Azure Container Instance (ACI)」にアプリケーションをデプロイして実行できるものです。 この記述から、Docker desktopのバージョンによって機能が追加されているのかと考えました。いまのバージョンは2020年5月に追加したもので、私用のDocker desktopは最新版にアップデートをしています。 Docker desktopを最新版にアップデート タスクバーからDockerを右クリックしてupdateを選択しアップデートをします。 アップデートの準備ができると以下のようになります。 Download and updateをクリックします。 すると最新版にアップデートできます。 その後、再度アイコンを右クリックしてupdate and restartをクリックして終了です。 確認 再度コマンドをたたいてみます。 docker login azure 無事成功しました。 docker login azureができないのはDocker desktopのバージョンが古いのが原因でした おわりに 社内のAzure環境のアカウントを頂いたときに、権限周りでエラー起きるかもとのことで、それが原因かなとも思っていましたがそんなことありませんでした。 Azureは記事が少ないのもあるのか原因解決が難しいです。 参考記事 Azure Container Instances(ACI)とDocker Desktopの連携が強化
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Python]docker-selenium環境 構築方法 メモ

環境依存しないスクレイピング/E2Eテスト環境を作りたかったため、docker-seleniumの利用方法を調べた。その備忘録記事。 docker-selenium Selenium Web アプリケーションをテストするためのフレームワーク。 各種 Web ブラウザに対する操作を自動化することができる。 docker-selenium SeleniumをDocker環境で動かすためのイメージ 構成 コード ディレクトリ構成 ルート - app ----- text --- test.py | |__ Dockerfile | |__ requirements.txt |__ docker-compose.yml docker-compose.yml version: "3" services: selenium: image: selenium/standalone-chrome-debug:3.2.0-actinium ports: - 4444:4444 - 5900:5900 app: build: ./app volumes: - ./app:/app environment: SELENIUM_URL: http://selenium:4444/wd/hub tty: true volumes: - /dev/shm:/dev/shm Dockerfile Python実行環境設定。依存ライブラリインストール含む。 FROM python:3.7 ENV PYTHONIOENCODING utf-8 WORKDIR /app COPY . . RUN pip install -r requirements.txt requirements.txt 依存ライブラリ定義 selenium test.py seleniumでGoogle検索した結果の1番目のタイトルを表示するコード。 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.expected_conditions import presence_of_element_located from selenium.webdriver.common.desired_capabilities import DesiredCapabilities if __name__ == '__main__': # Selenium サーバーへ接続する。 driver = webdriver.Remote( command_executor=os.environ["SELENIUM_URL"], desired_capabilities=DesiredCapabilities.CHROME.copy() ) # 任意のHTMLの要素が特定の状態になるまで待つ # ドライバとタイムアウト値を指定 wait = WebDriverWait(driver, 10) # Googleにアクセス driver.get("https://google.com") # "selenium"で検索 driver.find_element(By.NAME, "q").send_keys("selenium" + Keys.RETURN) # 1件目の検索結果を取得(描画されるまで待機) first_result = wait.until( presence_of_element_located((By.CSS_SELECTOR, "h3"))) print(first_result.get_attribute("textContent")) driver.quit() 動作確認 ビルド→起動→コンテナの中に入る。 docker-compose build --no-cache docker-compose up -d docker-compose exec app bash コード実行 cd test python test.py 期待値:10分で理解する Selenium - Qiitaのように検索結果が表示される。 参考情報 Dockerコンテナからseleniumを使ってスクレイピング DockerでPython-Seleniumスクレイピング環境を立てた docker-seleniumを動かしてみる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「Cannot connect to the Docker daemon . Is the docker daemon running?」 解消

Dockerの立ち上げで何度もつまづくのは面倒なので、今回出たエラーの解消法を記載しました。 1. 解決策 2. まとめ  3. 参考文献  全てはこのIs the docker daemon running?というエラーから。 docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. こちらの方の記事を参考にして書きコードを打ってもcommand not found祭り。 https://qiita.com/raySSK/items/655e63f12755012a28db $ systemctl start docker bash: systemctl: command not found $ service start docker bash: service: command not found $ systemctl start docker bash: systemctl: command not found $ systemctl enable docker bash: systemctl: command not found Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 何やってもCommand not foundと出る。 docker -v Docker version 20.10.6, build 370c289 Dockerはインストールされてるみたい。一旦Ubuntuを再起動してみた。 https://eng-entrance.com/linux-ubuntu-reboot $ sudo reboot $ docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? まだ解決しない。 1-解決策 -- LaunchpadにあるDockerアプリを確認。No containers runnning(どのコンテナも起動されていません)とあるので、このコードをターミナルにコピペ。 $docker run -d -p 80:80 docker/getting-started Unable to find image 'docker/getting-started:latest' locally latest: Pulling from docker/getting-started 540db60ca938: Already exists 0ae30075c5da: Pull complete 9da81141e74e: Pull complete b2e41dd2ded0: Pull complete 7f40e809fb2d: Pull complete 758848c48411: Pull complete 23ded5c3e3fe: Pull complete 38a847d4d941: Pull complete Digest: sha256:10555bb0c50e13fc4dd965ddb5f00e948ffa53c13ff15dcdc85b7ab65e1f240b Status: Downloaded newer image for docker/getting-started:latest 5b05fdc4d6e0cf375cb88034b8c2eca23467d802bc83f84cc1ddcf055eed3c46 やっと解決できました! $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5b05fdc4d6e0 docker/getting-started "/docker-entrypoint.…" 7 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp brave_colden 2-まとめ Is the docker daemon running?が出たら、Launchpad→Dockerapp→コードをコピペすればDockerが起動される。 はあ、俺の貴重な朝の1時間が、、 まあ、切り替えていきましょ! 3-参考文献
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerを用いてRails6の環境構築をする方法

今回は開発環境において、Dockerを用いてRails6の環境構築をする方法をご紹介いたします。 それぞれのファイルや単語の意味などの解説はしていないので、詳しい解説は Dockerを用いてRuby on Railsの環境構築をする方法( Docker初学者向け ) をご覧ください。 ( ※ Rails5の環境構築方法になります) 環境 MacOS Docker 20.10.6 docker-compose 1.29.1 Ruby 3.0.1 Rails 6.1.0 MySQL 5.7 前提 DockerおよびDocker composeのインストールを済ませてください これ以降の説明のmyappの部分はご自身のアプリケーション名に変えてください アプリケーションの作業ディレクトリを作成 mkdirで作業ディレクトリを作成します。 $ mkdir myapp 必要なファイルを用意 ファイル構成は以下のようになります。 myapp |-- Dockerfile |-- docker-compose.yml |-- Gemfile |-- Gemfile.lock それでは、先ほど作成したディレクトリの中に以下の各ファイルを作成していきます。 ① Gemfile Gemfile source 'https://rubygems.org' gem 'rails', '>= 6.1.0' ② Gemfile.lock Gemfile.lock Gemfile.lockの中身は空でOKです。 ③ Dockerfile Dockerfile FROM ruby:3.0.1 RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list # yarnをインストールするための準備 RUN apt-get update -qq && \ apt-get install -y build-essential \ libpq-dev \ nodejs \ default-mysql-client \ yarn \ # yarnをインストール vim RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp Rails6でwebpackerが搭載され、yarnのインストールが必要になりました。 ④ docker-compose.yml docker-compose.yml version: '3' services: db: image: mysql:5.7 environment: MYSQL_USER: user MYSQL_ROOT_PASSWORD: pass ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/myapp ports: - 3000:3000 depends_on: - db volumes: mysql_data: rails new を実行 $ docker-compose run web rails new . --force --database=mysql アプリケーションの作業ディレクリに移動し、上記のdocker-compose runコマンドでrails newを実行します。 ( Rails5の時は--skip-bundleのオプションをつけて、bundle installをスキップしていましたが、今回はwebpackerのインストールをしなければならないためbundle installはスキップしません。 ) docker-compose build を実行 $ docker-compose build rails new で Gemfileが更新されたので、bundle installするため、docker-compose buildを実行します。 database.yml を編集 /config/database.yml # MySQL. Versions 5.1.10 and up are supported. # # Install the MySQL driver # gem install mysql2 # # Ensure the MySQL gem is defined in your Gemfile # gem 'mysql2' # # And be sure to use new-style password hashing: # https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html # default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root # 以下2行を編集 password: pass host: db development: <<: *default database: myapp_development # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: myapp_test # As with config/secrets.yml, you never want to store sensitive information, # like your database password, in your source code. If your source code is # ever seen by anyone, they now have access to your database. # # Instead, provide the password as a unix environment variable when you boot # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database # for a full rundown on how to provide these environment variables in a # production deployment. # # On Heroku and other platform providers, you may have a full connection URL # available as an environment variable. For example: # # DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" # # You can use this database configuration with: # # production: # url: <%= ENV['DATABASE_URL'] %> # production: <<: *default database: myapp_production username: myapp password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %> password: と host:を編集します。 password: には docker-compose.yml の MYSQL_ROOT_PASSWORD:に書いたパスワードを記載します。 host: には dbと記載します。 docker-compose up -d でコンテナを起動 $ docker-compose up -d データベースを作成 以下のコマンドでデータベースを作成します。 $ docker-compose exec web rails db:create localhost:3000にアクセス localhost:3000にアクセスし、以下のページが表示されれば DockerによるRails6の環境構築 は完了です。 その後の開発の仕方は こちら を参考にしてください。 参考 Dockerを使ってRails6環境の構築をしてみる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む