20210501のdockerに関する記事は18件です。

docker-compose で mysql コンテナを python コンテナで実行させてみた

はじめに docker で mysql と python のコンテナを別々に立ち上げてから python コンテナを mysql につなげて実行する記事はよくありますが docker-compose でコンテナの起動を一気にやってしまう記事はなかなか見つからなかったので上げました。 この記事で行うこと docker-compose で mysql と python3 のコンテナの起動 python3 のコンテナの起動後、mysql に接続してテーブルを作成&確認 環境 ubuntu 18.04 を使用 docker と docker-compose をインストール済であること ファイル構成 /srv/docker/mysql/ ├── docker-compose.yml ├── db/ │ ├── data/ │   ├── Dockerfile │   ├── my.cnf ├── log/ ├── python/ │ ├──  sample.py │   └── Dockerfile └── root 手順 ディレクトリを作成します $ mkdir -p /srv/docker/mysql/db/data $ cd /srv/docker/mysql $ mkdir log $ mkdir python $ mkdir python $ mkdir root docker-compose.yml 作成 /srv/docker/mysql/ ディレクトリで docker-compose.yml を作成します。 docker-compose.yml version: '3' services: # MySQL db: image: mysql:5.7 container_name: mysql_host environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: test_database MYSQL_USER: docker MYSQL_PASSWORD: docker TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: - ./db/data:/var/lib/mysql - ./log/mysql:/var/log/mysql - ./db/my.cnf:/etc/mysql/conf.d/my.cnf ports: - 3306:3306 ## For static IP address networks: python_network: ipv4_address: 192.168.2.2 ## python3 python3: restart: always build: context: ./python container_name: "python3" working_dir: "/root/src" tty: true volumes: - ./python:/root/src links: - db networks: - python_network networks: python_network: driver: bridge ipam: driver: default config: - subnet: 192.168.2.0/24 gateway: 192.168.2.1 解説 基本は mysql と python3 を docker-composeで立ち上げる内容になってます。 networks: について python3で mysqlに接続するときに毎回 IP アドレスを聞くのが面倒なので、 "networks: " を使ってmysql のIPアドレスを固定化させています。 python3 のIPアドレスは固定させなくても大丈夫ですが、mysqlコンテナと同じネットワークで起動させないと(networks: で、mysqlと同じネットワークを指定)mysql と接続できないです。 こちらのサイトを参考にしました mysql コンテナの設定 my.cnf 編集 my.cnf [mysqld] # 文字コード、整合順序の設定 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4 user = docker password = docker Dockerfile 編集 mysql のログ取りや my.cnfを有効にする設定をします。 /srv/docker/mysql/db/Dockerfile.  FROM mysql:5.7 RUN touch /var/log/mysql/mysqld.log ADD ./db/my.cnf /etc/mysql/conf.d/my.cnf RUN chmod 644 /etc/mysql/my.cnf python3 コンテナの設定 Dockerfile 編集 mysql と接続するためのパッケージをインストールします /srv/docker/mysql/python/Dockerfile. FROM python:3.7 RUN pip install --upgrade setuptools RUN pip install mysql-connector-python mysql コンテナと接続&実行 python ファイルの作成 /srv/docker/mysql/python/sample.py import mysql.connector # connect mysql cnx = mysql.connector.connect( host='192.168.2.2', port='3306', user='docker', password='docker', database='test_database' ) cursor_=cnx.cursor()    # create new database query = " create database if not exists test_database" cursor.execute(query2) #create new table query2 = "create table if not exists test (id int, data varchar(20))" cursor.execute(query2)    #check table query3 = "SHOW TABLES" cursor.execute(query3) print(cursor.fetchall()) 解説 connect mysql について host には mysql のIPアドレスを書きます。今回はdocker-compose で固定化させたIPアドレス使用してます docker-compose でmysql のIPアドレスを固定化させていない場合、次の手順で確認します mysql コンテナのIPアドレス確認方法 $ docker-compose up -d $ docker exec -it mysql_host sh # hostname -i 192.168.2.2 実行 1. コンテナの起動 docker-compose で mysql と python3 のコンテナを起動させます $ cd /srv/docker/mysql $ docker-compose up -d ちゃんと起動できてるか確認します。 State が Up になっていればOKです $ docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------- mysql_host docker-entrypoint.sh mysql ... Up 0.0.0.0:3306->3306/tcp,:::330 6->3306/tcp, 33060/tcp python3 python3 Up State が up じゃなかったらログを確認します $ docker-compose logs 2. python3 コンテナを mysql コンテナに接続 & mysql を実行 python3 のコンテナの起動し、sample.pyを実行します sample.py で作成したテーブル名が出力されれば成功です! $ sudo docker exec -it python3 sh # python3 sample.py [('test',)]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerコンテナ間でssh接続をする

Dockerコンテナ間でssh接続をする ssh学習用に、ssh接続できるようなコンテナ2つを立てた。 その備忘録。 ※ほぼほぼこちらを参考にさせていただいた。 https://qiita.com/3104k/items/16102a64fb1bae6665af コンテナ2つを起動 Dockerfile。 FROM centos:7 # yum update RUN yum -y update && yum clean all # ssh install RUN yum install -y openssh-server openssh-clients CMD ["/usr/sbin/init"] RUN mkdir ~/.ssh && \ touch ~/.ssh/authorized_keys && \ chmod 600 ~/.ssh/authorized_keys Dockerイメージ生成 $ docker build -t fukafukafukka/centos_for_ssh_lesson . Dockerコンテナ起動 $ docker run --privileged -d -v `pwd`:`pwd` -it --rm --name master -p 8080:80 -p 2222:22 fukafukafukka/centos_for_ssh_lesson $ docker run --privileged -d -v `pwd`:`pwd` -it --rm --name slave -p 8090:80 -p 2233:22 --link master:mas fukafukafukka/centos_for_ssh_lesson slaveコンテナ内でssh-keyを生成 $ docker exec -it slave bash # cd ~/.ssh # ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: // 省略 slaveコンテナ内で~/.ssh/configの設定 masterコンテナのIPをチェック。 # ping master PING mas (172.17.0.2) 56(84) bytes of data. 64 bytes from mas (172.17.0.2): icmp_seq=1 ttl=64 time=1.53 ms 64 bytes from mas (172.17.0.2): icmp_seq=2 ttl=64 time=0.184 ms ^C --- mas ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.184/0.858/1.532/0.674 ms ~/.ssh/configファイルを設定する。 # vi ~/.ssh/config Host master HostName 172.17.0.2 User root Port 2222 IdentityFile ~/.ssh/id_rsa slaveコンテナ内の公開鍵をコピー masterコンテナ配置用のslaveコンテナ内の公開鍵をコピーしておく。 # vi id_rsa.pub // 中身をctl + c でコピー。 masterコンテナ内へ公開鍵を配置 $ docker exec -it master bash # cd ~/.ssh # vi authorized_keys // slaveコンテナ内でコピーした公開鍵をペーストする masterコンテナ内でsshポートをデフォルトから2222へ修正する // コピーしてバックアップしておく。 # cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org # vi /etc/ssh/sshd_config // 以下のようにデフォルトではなっているので、Portを2222にしてコメントアウトを外す。 # If you want to change the port on a SELinux system, you have to tell # SELinux about this change. # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER # #Port 22 ← Port 2222に変更する。 上記の通り修正したら、sshdを再起動する。 # sshd -t # systemctl restart sshd.service slaveコンテナよりmasterコンテナへssh接続する # ssh master Last login: Sat May 1 02:49:38 2021 from 172.17.0.3
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】実務未経験の介護士が共同開発に参加して学んだこと

0. はじめに はじめまして! この記事では、「実務未経験の介護士の私が Rails 共同開発に挑戦し、そこで学んだことや躓いたこと、反省した点」などについてまとめています。 チームでの開発現場経験を積むことで、「コミュニケーションの適切な取り方」や「わからない部分の質問の仕方」、「コンフリクトの解消の仕方」など、一人での学習では決して学ぶことのできない貴重な経験を積ませていただくことができました。 今回はそのような共同開発の現場で実際に学んだことをまとめて、今後の自分の成長につなげることができたらなと考えております! 1. 自己紹介 まずは簡単な自己紹介からさせて頂きます! スペック 27歳 介護士 → エンジニアを目指している駆け出しエンジニア 学習中の言語:Ruby, Ruby on Rails 今後学習予定の言語や知識:Javascrict, AWS 趣味 カラオケ(高音域が出ないことが悩みなので、いつかボイストレーニングを習いたい) 野球(球速は遅いが、コントロールには安定感がある) 筋トレ・運動全般(毎日頑張っています?) メンタリストDaiGoさんの動画を視聴しながら、実用的な技術を生活に取り入れる 性格 介護士として忍耐強く働いてきたということもあり、衝動的な性格から理性的に行動するように。 比較的、温厚な性格だと思う。 2. 今回の共同開発に参加しようと思った動機 まず、「なぜ今回の共同開発に参加しようと思ったのか?」の根本的な動機の部分を述べさせて頂きます。端的に言うと、以下のものを「得たい!」と思ったので、共同開発に参加させて頂きました。 コミュニケーションスキルの向上 チームでの開発経験 問題にぶち当たった時に自分で原因を特定し、解決を図るための「自走力」 試行錯誤した上でどうしてもわからない場合、素直に質問できる柔軟性 これらのものを「共同開発」に参加することを通して獲得したいなと思いました。 結果的に、特に「コミュニケーション」の部分に関してはスキルの向上ができたのと、以前よりもより自信を持つことができた気がします。 ここについての具体的なやり取りに関しては後述させて頂きます! 3. Rails 共同開発で取り組んだ内容 共同開発で取り組んだ内容を簡単にご説明していきます! 成果物 今回の共同開発では「ECサイト」の購入者視点の画面の実装に取り組みました。 概要 開発期間:3/1 ~ 4/30(2ヶ月間) 週1回のチームミーティングを行い、進捗状況の確認を行う 週2~3回の作業会を行い、それぞれわからないところを質問し合う 構成メンバー 講師・TA:現役エンジニア2名 共同開発メンバー:現役インフラエンジニア1名、未経験2名 使用した言語・技術 バックエンド Ruby(バージョン:2.7.1) Ruby on Rails(バージョン:6.0.3.5) フロントエンド HTML5 CSS3 Bootstrap(5.0.0.beta2) インフラ Docker docker-compose データベース MySQL2(0.5.3) 使用したツール・環境 Slack:レビュー依頼、進捗状況の確認、日報の共有などをしました。 GitHub:タスク管理・確認、プルリクエストを出す、コードレビューを受ける、受けた指摘に対応し、コミットを出すなどをしました。 Googleドライブ:モックアップ、基本設計(ER図/画面遷移図)、画面定義書などのファイルを管理・共有のために使用しました。 Git / Sourcetree:コミットやプッシュなどの git 操作をするために利用しました。 Sequel Pro:DB を視覚的に管理できるツール Boost Note:「1タスク1メモ」といった感じで、学んで点や躓いた点を随時メモしました。 DeepL:英語対策のための翻訳アプリ 使用したエディター:Visual Studio Code 使用したPC:Mac ER図 実装した機能 新規ユーザ登録機能 ログイン / ログアウト処理 商品検索 商品詳細へ カートへ カートを開く 購入確定 Top画面に戻る 履歴を開く 注文検索 注文キャンセル ユーザ情報を開く ユーザ情報修正 / 退会処理 修正確定 GitHub https://github.com/quest-academia/qa-rails-ec-training-violet 4. Rails 共同開発で私が担当した箇所 ①ユーザー登録ページ 「お客様情報登録」にお客様(ユーザー)が登録に必要な情報を入力するためのページを作成しました。 ②商品詳細画面 ■ 商品が存在する場合 ■ 商品が存在しない場合 「商品詳細画面」を商品が存在する場合と存在しない場合の二つに分けて、それぞれの画面が表示されるようなページを作成しました。 ③商品検索画面 ■ 検索結果にヒットする商品が存在する場合 ■ 検索結果にヒットする商品が存在しない場合 「商品検索画面」に検索フォームや商品の一覧、ページネーション機能などを入れて、お客様(ユーザー)が商品を検索できるようなページを作成しました。 5. 【必ず身に付けておきたい】 講師に学んだプルリクエストの出し方 共同開発では、開発業務以外にも Git や GitHub の操作方法がとても学びになりましたが、その中でも特に「 Pull Request(プルリクエスト )の出し方」が個人的には参考になりました! 今後の開発を進めていく上での基礎として、必ず身に付けておきたいと思いました。 ▼ プルリクエストを出す際の雛形となるテンプレート 以下は講師が提供してくださったテンプレートを元に僕が作成したプルリクエストの一例です。 プルリクエスト出す際は、以下のようなフォーマットをもとに作成しました。 プルリクエストの最終的な確認項目 このプルリクエストで実行したこと(概要) 対象 issue 重点的に見て欲しいところ(不安なところ) 実装できなくて後回しにしたところ チェックリスト(動作確認・ rubocop の実行など) その他の参考情報(参考にした記事のリンクなど) このようなフォーマットを元に書くことによって、レビュアーの方にとってわかりやすいプルリクエストの作成に繋がると感じました。 特に「重点的に見て欲しいところ(不安なところ)」の項目では、「問題に躓いた時にうまく人に頼れるスキル」も大事になって来ると思うので、不安だったことについては小さなことであっても、必ず書くようにしました。 また、予想完了時間や実質完了時間、作業内容、納期などもタスクに取り組む前に予測・設定しました。実務では「担当するタスクを細かい作業項目に分解して、一つずつ取り組んでいくスキル」が必要になってくると思うので、思いつく限りのことはなるべく言語化して書くようにしました。 作業内容は、最初は全ての作業項目を洗い出すことはできず、取り組みながら後から修正を加えたりしました。 ただ、プルリクエストを出してマージされるまでにかかった時間が、予想完了時間を大幅に超えてしまっていたり、納期が遅れてしまったりしたことは反省点です? はじめから無理な目標を設定しすぎない方が良いと思いました。 ▼ 1指摘1コミット また、コードレビューを受ける際は「1指摘1コミット」でやり取りをするようにしました。つまり、複数の指摘を同時に受けたとしても、対応する際は一つずつコミットを出して個別に対応していくということ。 これは講師の方から「意外と知らない人が多いけど、大事なこと」として教わりました。 以下のような感じです↓ 基本的なことかもしれませんが、こう言った基礎的なことが個人的にはとても大事になってくると思うので、今後も実践を通して身に付けていきたいです。 6. Rails 共同開発で躓いた点・大変だったこと 共同開発において躓いたことや大変だったこと、またそれに対する僕の対応です! 主に、以下の2点でつまずきました。 ① コンフリクトの発生 ② if文を用いた View ファイルの条件分岐 ① コンフリクトの発生 コンフリクト発生に関しては、共同開発が始まった初っ端から躓いてしまい、かなり焦りました? まだ始まったばかりなのにいきなり難しい問題に出くわして「自分にはやっぱり向いてないんじゃないかな・・・」と勘違いしてしまった記憶があります? その時はなんとか解決したいと思い、検索を繰り返し問題への対処に当たりました。 とりあえず問題の理解と解決策がなんとなく理解できたので、それを実行しようと思う意思とそれが今後の開発にあたり問題のない対処法かどうかを確認をしたかったので、講師の方に質問してみました。 以下が僕が講師の方に質問させていただいた際のやり取りの記録になります。 僕からの講師への質問 (Slack より引用)文字が小さくてすいません? この質問への講師からの回答は1往復で済み、なんとか「コンフリクトの解消」にまで至りました! とても嬉しかったですし、次回以降同じような問題に出くわしたとしても、以前のように無駄に焦ったりはしなくなりました。 ② if文を用いた View ファイルの条件分岐 「if文を用いた商品に関しての条件分岐」については、 html.erb 内で if 文を使って「商品が存在するページ」と「商品が存在しないページ」に分岐することができるようにするタスクだったのですが、メソッドの書き方が間違っており、苦戦しました。 苦戦したコードの内容:商品テーブルから指定されたIDの商品の詳細を取得する 本来はコントローラー内で以下のように記載しなければなりませんでした。 def show @product = Product.find_by(id: params[:id]) end しかし僕は、以下の二つの間違いをずっと繰り返していました。 def show @product = Product.find(params[:id]) # ← find_by を使ってない end def show @product = Product.find_by(params[:id]) # ← find_by の引数にカラム指定をしていない end 最終的には講師の方に記述ミスを指摘してもらい、解決に至りましたが、「find_by メソッドを使う時はカラムを指定する」というところがすっかり抜けていました。 このようにコードの記述ミス然り、アルファベットの記述ミスやファイル名の命名違い、全角スペースでのインデントなど、細かいミスがまだまだ目立つなと思いました。 今後はこのようなミスをできるだけ少なくできるよう、必ず独自の「メモ」を取るようにして、同じ間違いを繰り返さない工夫をしたいと思います。 7. Rails 共同開発に参加して良かったこと 2021年3月頃までは僕は主に一人でプログラミング学習に取り組んでいました。 しかし、将来的にもしエンジニアになることができたら、一人での開発ではなくチーム単位での開発となり、お互いの進捗状況を確認しあったり、わからないことを相談しあったりするなどと言った「協調性」が必ず必要になってくると思いました。 そのため、早めにそのスキルを身につけておくことによって、「技術面でのサポート」はどうしても頂かなければならない時が多々あるかと思いますが、そのような技術的なサポートをして頂く際の「質問力」であったり、互いにスムーズで円滑なやりとりを行うための「コミュニケーション能力」の面においては、なるべく一緒に仕事をさせていただく方々の負担にならないようにしたいなと思いました。 また、個人的に「チーム単位での活動」や「誰かと協力すること」、「コミュニケーション能力」にいささかの不安があったため、実際の現場に近い環境で現役のエンジニアさんやチーム開発参加者たちと共に「テキストベース」や「 ZOOM などでお互いに顔を合わせた状態でのコミュニケーション」に積極的に参加して場数を踏むことによって、苦手分野を克服したいなと思いました。 たとえここで失敗したとしても、苦手分野の克服に挑戦したことによって自分なりの改善策や解決策などのデータが得られると思ったので、積極的に挑戦して行くべきだと判断しました。 ありがたいことに今回の共同開発では、みなさん向上心があり親切な方々ばかりだったので支えて頂いたことの方が多かった印象があるのですが? 、それでも僕なりに役に立ちそうな情報は共有するようにしたり、読み手に負担をかけないわかりやすい文章を作成することにとても神経を使いました。 この経験によって、コミュニケーションのスキルが今までよりも段違いに向上したのではないかと思います。 8. さいごに【まとめ】 今回この「共同開発」というものに参加させてもらうことによって、 コンフリクトの解消 GitHub の見方・操作・やりとりの仕方 Git の操作やプルリクエストの出し方 開発するものに対する意思の疎通や進捗状況の確認 タスクへの取り組み方や管理の仕方 などの個人での開発・学習では決して学ぶことのできない多くのことを学び、経験させていただきました。 また、現役のRailsエンジニアの方からは「技術力は正直まだまだ足りてないですが、コミュニケーションの取り方はハイレベルですね」といった評価をして頂けたのはとても嬉しかったです! 今後はこれらのことをよりスムーズにできるようにブラッシュアップさせて、実務に入った時に周りの方々に「この人との仕事は余計なストレスがないし、スムーズでやりやすいな」と思ってもらえるように、備えて行きたいと思います。 拙い文章でしたが、最後までご覧頂き、ありがとうございました! Twitter :@kunikuni2992
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでPython-Seleniumスクレイピング環境を立てた

はじめに メイン機以外で定期実行されるクローラを作りたいと思ったわけですが、その場合ローカル環境に全く依存しない形が取れれば最高だということで、Docker環境の構築に乗り出しました。 Dockerを全く知らない状態のプログラミング初心者でしたが、同じ境遇の方には役立つだろうと思います。 あまりに詳しく書けるほど余白は広くないので、あくまで備忘録的な範囲で留めておこうと思います。 ※作業は主にWindowsで行います。 全体図 かなり簡素な図ですが、こんな感じです。 Python実行環境とSeleniumHQ/docker-seleniumは別のコンテナとして立てて、docker-composeで関係性を持たせます。 そしてSeleniumHQ/docker-seleniumにより、簡単にVNC接続してブラウザの挙動をチェックできます。 ちなみに、SeleniumHQ/docker-seleniumがあれば、ChromeやChromeDriverのセットアップは完全に不要になります。 スクレイピング用のコードで、driverを定義する箇所を書き換えるだけです。 環境構築 Docker 最近はWindows10 Homeでも簡単にインストールできるようになったようです。 Dockerのインストーラの指示に従っていれば使える状態になります。 VSCode(任意) Remote-Containersプラグインによって、ローカル開発のような感覚でデバッグも楽々です。 docker-compose.ymlやDockerfileの他に、devcontainer.jsonなるVSCode用の設定ファイルを用意します。 devcontainer.jsonに盛り盛りの設定をすることも可能なようですが、あくまで素の状態で実行できなければあまり意味がないので、まずコマンドラインで動作確認をしてからVSCode用の設定を整えるのがいいと思われます。 VNC Docker環境は完全に閉じた環境なので、ホストマシンのブラウザを見ながらのデバッグができません。 そこで、Docker環境内にあるLinux上のデスクトップ画面を表示するために、VNCという技術を使います。 RealVNCで動作確認済みです。 ディレクトリ構成 全体 .devcontainer\ devcontainer.json app\ .vscode\ launch.json settings.json source\ test.py Dockerfile requirements.txt build.sh docker-compose.yml .devcontainer\*と.vscode\*はVSCode用の設定ファイルです。 dockcker-compose.ymlでapp\DockerfileによるイメージとSeleniumHQ/docker-seleniumを関連付けます。 build.sh build.sh #!/bin/sh cd `dirname $0` docker-compose build --no-cache docker-compose up -d docker-compose exec app bash dockerコマンド入力分の効率化目的です。 3行目(cd ...)があると、実行場所に制限がなくなって便利です。 docker-compose.yml docker-compose.yml version: "3" services: app: build: ./app volumes: - ./app:/app environment: SELENIUM_URL: http://selenium:4444/wd/hub tty: true selenium: image: selenium/standalone-firefox-debug ports: - 4444:4444 - 5900:5900 volumes: - /dev/shm:/dev/shm test.py内で、Selenium_URLを用いてdriverを定義しています。 tty: trueでコンテナの起動状態を維持します。(後でexecするため) SeleniumHQ/docker-seleniumでは、Firefoxを利用しています。 2021/05/01現在のDocker for Windowsのバグによって、Chromeが動作しないようです。(該当issue) どうしてもChromeを利用したければ、volumesを/dev/shm:/dev/shmでなく、shm_size: "2gb"などとすればいいようです。 Dockerfile Dockerfile FROM python:3.7-slim-buster ENV PYTHONIOENCODING utf-8 ENV TZ="Asia/Tokyo" ENV LANG=C.UTF-8 ENV LANGUAGE=en_US:en WORKDIR /app COPY ./requirements.txt ./requirements.txt RUN pip install -r requirements.txt Python環境のベースイメージは軽量版を利用しています。 wgetやcurlなどで色々入れたい場合は通常版を利用するのが吉でしょう。今回はシンプルな構成なので軽量版で十分でした。 requirements.txt requirements.txt autopep8 selenium test.py test.py from datetime import datetime as dt import os from time import sleep from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities driver = webdriver.Remote( command_executor=os.environ["SELENIUM_URL"], desired_capabilities=DesiredCapabilities.FIREFOX.copy() ) driver.get("https://www.nict.go.jp/JST/JST5.html") driver.implicitly_wait(3) sleep(1) driver.save_screenshot("{0:%Y_%m_%d__%H_%M_%S}".format(dt.now()) + ".png") driver.quit() 日本標準時を表示するサイトのスクリーンショットを保存するプログラムです。 重要な部分は、driver = webdriver.Remote(...あたりです。 docker-compose.ymlで定義した環境変数を利用しています。 FIREFOX.copy()も環境変数で表してもいいと思われます。 ちなみに、selenium/standalone-firefox-debugを単体で起動しても同様に使えるため、通常のローカルにおけるスクレイピングでもこれでよさそうです。(とはいえ今回Docker環境を用意したので、ローカルでの開発は不要になりましたが。) devcontainer.json devcontainer.json { "dockerComposeFile": "../docker-compose.yml", "service": "app", "workspaceFolder": "/app", "settings": { "terminal.integrated.shell.linux": "/bin/bash" }, "extensions": [ "streetsidesoftware.code-spell-checker", "ms-python.python", "ms-python.vscode-pylance", "njpwerner.autodocstring" ] } docker-compose.ymlをチラチラ見ながら書きます。 拡張機能は、好きなものを入れるといいでしょう。 launch.json launch.json { "version": "0.2.0", "configurations": [ { "name": "Python: Current File", "type": "python", "request": "launch", "program": "${file}", "console": "integratedTerminal", "args": [ "&&", "exit" ] } ] } これにより、Docker環境にRemote-Containersで接続した状態でデバッガを利用できます。 特筆事項はありませんが、普段から個人的な趣味として"args": ["&&", "exit"]をつけています。Python Debug Consoleだったかが無限増殖していくので、何となく気分が悪いという理由です。デバッグ終了後に当該コンソールを自動で終了します。 settings.json settings.json { "python.pythonPath": "/usr/local/bin/python", "python.languageServer": "Pylance" } 詳細なファイルの内容 GitHubで公開しています。 利用手順 上記リポジトリをクローン 自分が再利用しやすいように作ってあるので、それなりに便利ではあるだろうと思います。 git clone https://github.com/ryoheiszk/python-selenium-on-docker とりあえずビルド ./build.sh 基本的にLinuxで利用するためにシェルスクリプトとして用意していますが、WindowsユーザでGitBashなどを利用していない場合、次のコマンドを順番に実行しても同じことです。 docker-compose build --no-cache docker-compose up -d docker-compose exec app bash VNCテスト 何もしていない状態のブラウザが既に待機しているので、WindowsならRealVNC等で接続テストをします。 Linuxの場合は、TigerVNC Viewerなんかでいいのではないかと思います。 localhost:5900→secret 接続ができたら何かロゴが表示されている状態だろうと思います。 テストスクリプト実行 cd source/ pyhon test.py すると、VNC Viewerの方でブラウザが表示されると思います。 ルートディレクトリにスクリーンショットが保存されていたら成功です。 (要らないので消しておきましょう) VSCodeでコーディング あとは、Remote-Containersの機能を利用し、VSCodeでDocker環境に入りコーディングするだけです。 必要なパッケージなどあれば、requirements.txtに追記してリビルドしておきます。 さいごに この程度のことは結構な人がやっていそうでしたが、意外と正解の答えが見つからずに苦戦しました。 特に、Dockerに関して全く無知の状態からだったので大変でしたが、いい勉強になったと思います。 今後の開発環境はおおよそDockerで構築していければと思うようになりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初学者による】Dockerに初めて触るぞ! $ docker run hello-world まで

$ docker run hello-world 初めてこのコマンドを打つまでの解説 Dockerに必要なもの Dockerコンテナ Dockerイメージ Dockerfile Dockerコンテナとは? 実行環境 このDockerコンテナの中でOSとかプログラミング言語とかが動くぞ Dockerイメージとは? Dockerコンテナを起動させるためのベース アプリのコードやOSの情報などをひとまとめにしたもの DVDのリッピングなどをしたことがある人は、.iso というファイルを見たことがあるのでは。 あれも映像とか音声がひとまとまりになってるでしょ?あれみたいなやつ DockerイメージからDockerコンテナが作られそして起動する ということを覚えておこう Dockerfileとは Dockerイメージの構成情報を記述するファイル $ docker run hello-world は何をしてんのさ Docker童貞の方々は、導入後とりあえずこのコマンドを打っていることでしょう $ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world d1725b59e92d: Pull complete Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ なにやらいっぱい表示されていますが、要は "hello-world"というイメージをもとにコンテナを作成、そして起動したということ。 そもそもこのhello-worldは、 「Hello from Docker! This message shows that your installation appears to be working correctly.」というメッセージを表示するだけのイメージ。 なのでコンテナは自動的に停止するぞ 細かく見ていくと... Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world d1725b59e92d: Pull complete Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Status: Downloaded newer image for hello-world:latest これは、「君のパソコン内にhello-worldというイメージは見当たんない! だから公式のライブラリ(Docker Hub)からイメージをダウンロードするぞ!そして完了したぞ!」 という意味 $ docker run 〇〇 とするだけで、 Dockerイメージをすでに持ってれば起動してくれるし、 無くても「ねーよそんなもん」と言うだけでなく気を効かせてDocker Hubまで見に行ってくれるスゴイ奴 もちろん持ってもいない、Docker Hubにも存在しないコンテナ名を入れても無駄だぞ $ docker run sonzaishimasenn Unable to find image 'sonzaishimasenn:latest' locally docker: Error response from daemon: pull access denied for sonzaishimasenn, repository does not exist or may require 'docker login': denied: requested access to the resource is denied. See 'docker run --help'.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

モデルとシーダーの作成(Laravelでウェブアプリを作ろう④)

モデル モデルはテーブルとマッピングされたオブジェクトで、DB操作を行うためにクラスです。 モデルの作成 モデルはテーブル名の単数系を名前につけることで、自動的にそのテーブルとマッピングします。 ローカル環境でのモデルの作成 php artisan make:model モデル名 docker環境でのモデルの作成 docker-compose exec app php artisan make:model モデル名 シーダーの作成(初期レコードを挿入ファイル) シーダーはテストデータやマスタデータなどのアプリケーション起動時に必要なレコードをコマンドで登録する仕組みです。 シーダーの作成 シーダーファイルの作成 php artisan make:seeder データベースのテーブル名TableSeeder シーディング時に[public function run()]関数が呼ばれるので、ここに追加したいレコードの情報を記載しておきます。 最後にforeachでcreate関数を呼び出して登録処理を行います。 UseresTableSeeder.php <?php namespace Database\Seeders; use Illuminate\Database\Seeder; use \App\Models\User; class DatabaseSeeder extends Seeder { public function run() { $users = [ [ 'title' => "タイトル1", 'description' => "説明1", ], [ 'title' => "タイトル2", 'description' => "説明2", ], [ 'title' => "タイトル3", 'description' => "説明3", ] ]; //一括登録 foreach($users as $user) { User::create($user); } } } シーディング ローカル環境でのシーディング php artisan db:seed docker環境でのシーディング docker-compose exec app php artisan db:seed mysqlに対しselect文を発行し、レコードが追加できていればOKです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ModelとSeederの作成(Laravelでウェブアプリを作ろう④)

Model(モデル) Modelはテーブルとマッピングされたオブジェクトで、DB操作を行うためにクラスです。 Modelの作成 Modelはテーブル名の単数系を名前につけることで、自動的にそのテーブルとマッピングします。 ローカル環境でのModelの作成 php artisan make:model モデル名 docker環境でのModelの作成 docker-compose exec app php artisan make:model モデル名 Seeder(シーダー) Seederはテストデータやマスタデータなどのアプリケーション起動時に必要なレコードをコマンドで登録する仕組みです。 Seederの作成 Seederの作成 php artisan make:seeder データベースのテーブル名TableSeeder シーディング時に[public function run()]関数が呼ばれるので、ここに追加したいレコードの情報を記載しておきます。 最後にforeachでcreate関数を呼び出して登録処理を行います。 UseresTableSeeder.php <?php namespace Database\Seeders; use Illuminate\Database\Seeder; use \App\Models\User; class DatabaseSeeder extends Seeder { public function run() { $users = [ [ 'title' => "タイトル1", 'description' => "説明1", ], [ 'title' => "タイトル2", 'description' => "説明2", ], [ 'title' => "タイトル3", 'description' => "説明3", ] ]; //一括登録 foreach($users as $user) { User::create($user); } } } Seeding(シーディング) ローカル環境でのSeeding php artisan db:seed docker環境でのSeeding docker-compose exec app php artisan db:seed mysqlに対しselect文を発行し、レコードが追加できていればOKです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

マイグレーションの作成(Laravelでウェブアプリを作ろう③)

マイグレーションは、データベースのテーブルに関する情報を設定するファイルで、テーブルごとに作成します。 テーブルにはどんなカラム(フィールド)があって、そのカラムにはどんな情報が付与されるのかを設定します。 マイグレーションファイルの作成 手動でも作成は行えますが、コマンドで実行する方が確実です。 注意点としては、マイグレーションファイルを複数作成した場合、一括実行を行うと実行される順番はファイルを作成した順番になります。 そのため外部キーの設定をする場合に参照するテーブルを先に生成しておかないとエラーになるため注意が必要です。 php artisan make:migration create_テーブル名_table --create=テーブル名 作成されたファイルは[database>migrations]に格納されます。 デフォルトで3つファイルが作成されています。 [public function up()]こちらのメソッドに、テーブルの作成時に行いたい処理を記載します。 記載の仕方は以下のようになります。 2014_10_12_000000_create_users_table.php public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } よく使うカラムのキーやそのほかの情報については以下を参照してください //文字列 $table->string('カラム名', バイト数); //数字 $table->integer('カラム名'); //正の数のみ $table->unsignedInteger('カラム名'); //真偽値 $table->boolean('is_archived') //作成日及び更新日 $table->timestamps(); //インクリメント $table->increments('カラム名'); //nullを許容する(デフォルトではnotnullになっている) $table->型名('カラム名')->nullable(); //デフォルト値の設定 $table->型名('カラム名')->default(値); //プライマリーキー(idをincrementsにした時点で自動的にprimarykeyになっているため基本的には不要) $table->primarykey(['カラム名']); //ユニークキー $table->unique(['カラム名']); //外部キー $table->foreign('参照元のカラム名')->references('参照先のカラム名')->on('参照先のテーブル'); マイグレーションの実行 マイグレーションの実行にはコマンドで実行します ローカル環境でアプリケーションを開いている場合 php artisan migrate docker環境でアプリケーションを開いている場合 docker-compose exec app php artisan migrate テーブルが追加されていれば成功です 補足 詳しくは記載しませんが、MySQL接続の際のコマンドです dockerのコンテナ名の確認 docker ps docker環境でMySQLに接続するコマンド docker exec -it コンテナ名 mysql -u ログインユーザー名 -p
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Migrateの作成(Laravelでウェブアプリを作ろう③)

Migrate(マイグレート) Migrateは、データベースのテーブルに関する情報を設定するファイルで、テーブルごとに作成します。 テーブルにはどんなカラム(フィールド)があって、そのカラムにはどんな情報が付与されるのかを設定します。 Migrateの作成 手動でも作成は行えますが、コマンドで実行する方が確実です。 注意点としては、Migrateを複数作成した場合、一括実行を行うと実行される順番はファイルを作成した順番になります。 そのため外部キーの設定をする場合に参照するテーブルを先に生成しておかないとエラーになるため注意が必要です。 php artisan make:migration create_テーブル名_table --create=テーブル名 作成されたファイルは[database>migrations]に格納されます。 デフォルトで3つファイルが作成されています。 [public function up()]こちらのメソッドに、テーブルの作成時に行いたい処理を記載します。 記載の仕方は以下のようになります。 2014_10_12_000000_create_users_table.php public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } よく使うカラムのキーやそのほかの情報については以下を参照してください //文字列 $table->string('カラム名', バイト数); //数字 $table->integer('カラム名'); //正の数のみ $table->unsignedInteger('カラム名'); //真偽値 $table->boolean('is_archived') //作成日及び更新日 $table->timestamps(); //インクリメント $table->increments('カラム名'); //nullを許容する(デフォルトではnotnullになっている) $table->型名('カラム名')->nullable(); //デフォルト値の設定 $table->型名('カラム名')->default(値); //プライマリーキー(idをincrementsにした時点で自動的にprimarykeyになっているため基本的には不要) $table->primarykey(['カラム名']); //ユニークキー $table->unique(['カラム名']); //外部キー $table->foreign('参照元のカラム名')->references('参照先のカラム名')->on('参照先のテーブル'); Migration(マイグレーション) Migrationにはコマンドで実行します ローカル環境でMigration php artisan migrate docker環境でMigration docker-compose exec app php artisan migrate テーブルが追加されていれば成功です 補足 詳しくは記載しませんが、MySQL接続の際のコマンドです dockerのコンテナ名の確認 docker ps docker環境でMySQLに接続するコマンド docker exec -it コンテナ名 mysql -u ログインユーザー名 -p
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerでコンテナの作成とその接続設定(Laravelでウェブアプリを作ろう②)

データベースを利用するためにはアプリケーションサーバーとデータベースサーバーを接続しなければいけません。データベースの情報を作っているとき(docker-compose.yml)に接続情報(.env)についても記載してしまいます。 データベースを作成 Docker上にservice名をdbという名前で作成し、test_dbデータベースを作成、test_userというユーザーをpasswordというパスワードで作成してください。 docker-compose.yml version: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: test_db MYSQL_USER: test_user MYSQL_PASSWORD: password TZ: 'Asia/Tokyo' volumes: - ./docker/db/sql:/docker-entrypoint-initdb.d ports: - 3306:3306 versiondocker-composeのバージョン services立ち上げるコンテナのホスト名 image使うイメージの種類(:バージョン) environtmen環境変数- MYSQL_ROOT_PASSWORD:ルートアカウントのパスワード- MYSQL_DATABASE:データベース名- MYSQL_USER:作成するユーザー名- MYSQL_PASSWORD:上記のユーザーのパスワード- TZ:タイムゾーン volumes初期化するボリュームのパス ports使用するポート(3306が多い) 接続設定 dockerに接続するための情報を記載する (基本的にはdocker-compose.ymlに記載してある内容をコピーする) .env DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=test DB_USERNAME=test_user DB_PASSWORD=password DB_CONNECTIONdocker-compose.ymlで立ち上げるデータベースの種類 DB_HOSTdocker-compose.ymlの[services] DB_PORTdocker-compose.ymlの[ports] DB_DATABASEdocker-compose.ymlの[ports] DB_USERNAMEdocker-compose.ymlの[MYSQL_USER] DB_PASSWORDdocker-compose.ymlの[MYSQL_PASSWORD]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-compose環境でのmysql接続方法まとめ

前提 wsl2を使ったDocker環境 docker-composeでmysqlをPython flaskの環境を構築 flaskサーバからmysqlサーバに接続 wsl2のコマンドラインからmysqlを使用 docker-compose.yml version: '3' services: db: image: mysql:8.0 container_name: mysql_host ports: - "3306:3306" #<---wsl2から接続する場合に必要。flask_hostからの接続には不要 environment: MYSQL_ROOT_PASSWORD: secret volumes: - ./db/data:/var/lib/mysql - ./db/init:/docker-entrypoint-initdb.d flask: build: . container_name: flask_host ports: - "5000:5000" volumes: - .:/workspace:cached tty: true environment: TZ: Asia/Tokyo # command: flask run --host 0.0.0.0 --port 5000 $ docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------- mysql_host docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp sample1_flask_1 python3 Up 0.0.0.0:5000->5000/tcp 接続方法まとめ 接続元 記述方法 flaskサーバからmysqlに接続 mysql_hostmysqlサーバのdocker hostnameを使用 wsl2からmysqlに接続 127.0.0.1※.wslconfigに追記が必要※localhostと記述するとmysql.sockを使って接続しようとするので接続できない .wslconfig [wsl2] memory=2GB swap=2GB localhostForwarding=true memory, swapの記述は、localhost接続とは関係ありません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Selenium + Headless Chrome + Jupyter Notebook + Docker

GWに調べたことのメモです。 Jupyter Notebook上でSeleniumを動かすことのできるDockerイメージを作成します。 Seleniumがどんなものか手っ取り早く試してみるための環境です。 参考記事 本記事の作成には、以下の記事を参考に作成させていただきました。 【2019年版】Ubuntu18.04 にChromeとSeleniumをインストール Rails + postgres + chromedriverのdocker-compose環境を作る Dockerイメージ作成 まずは、Dockerfileの全体です。 Dockerfile FROM jupyter/scipy-notebook:latest USER root WORKDIR /tmp # 必要なツールとIPAフォントをインストールします RUN apt-get update && apt-get install -y gnupg curl fonts-ipafont fonts-ipaexfont # Google Chromeをインストールします RUN wget https://dl.google.com/linux/linux_signing_key.pub \ && apt-key add linux_signing_key.pub \ && echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list \ && apt-get update \ && apt-get install -y google-chrome-stable \ && google-chrome --version # Chrome Driverをインストールします RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` \ && curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip \ && unzip /tmp/chromedriver_linux64.zip \ && mv chromedriver /usr/local/bin/ # PermissionError: [Errno 13] Permission denied: '/home/jovyan/.local/share/jupyter' # となぜか怒られるのでとりあえず所有者を変更 RUN chown -R jovyan /home/jovyan/.local USER jovyan # selenium導入 RUN pip install selenium WORKDIR /home/jovyan 上記を使って、jupyter-seleniumというイメージを作成します。 $ docker build -t jupyter-selenium . Dockerfileポイント説明 上のDockerfileのポイントをいくつか説明していきます。 Dockerのベースイメージには、jupyter/scipy-notebookを使っています。 Google Chromeインストール 【2019年版】Ubuntu18.04 にChromeとSeleniumをインストールの記事を基にGoogle Chromeをインストールします。 RUN wget https://dl.google.com/linux/linux_signing_key.pub \ && apt-key add linux_signing_key.pub \ && echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list \ && apt-get update \ && apt-get install -y google-chrome-stable \ && google-chrome --version Chrome Driver導入 https://chromedriver.storage.googleapis.com/LATEST_RELEASE というところで、最新のChrome Driverのバージョンが取れるようなので、それを利用します。 解凍したChrome Driverをパスの通った場所に配置します。 RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` \ && curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip \ && unzip /tmp/chromedriver_linux64.zip \ && mv chromedriver /usr/local/bin/ Jupyter Notebook起動 作成したイメージを使って、Jupyter Notebookを起動します。 カレントディレクトリにworkというディレクトリを作業用に作成し、マウントしておきます。 $ docker run -d -v $(pwd)/work:/home/jovyan/work -p 8888:8888 --name jupyter-selenium jupyter-selenium コンテナに入って、rootユーザで色々作業するときは、以下のように起動します。 参考: https://jupyter-docker-stacks.readthedocs.io/en/latest/using/common.html#docker-options $ docker run -u root -e GRANT_SUDO=yes -d -v $(pwd)/work:/home/jovyan/work -p 8888:8888 --name jupyter-selenium jupyter-selenium ブラウザでアクセスするためのURLは以下で取得します。 0.0.0.0の部分をlocalhost等に変えて、http://localhost:8888/?token=(トークン)で、Jupyter Notebookにアクセスします。 (手元のMac環境では、0.0.0.0そのままでも動きました。) $ docker exec -it jupyter-selenium jupyter notebook list Currently running servers: http://0.0.0.0:8888/?token=(トークン) :: /home/jovyan Jupyter Notebookを開いたら、Python 3のノートブックを作成します。 Seleniumコード ChromeをHeadlessモードで起動して、Google検索するためのコードを書きます。 Pythonは初心者なので、おかしなところはご容赦ください。 初期化 ChromeをHeadlessモードで起動するためのオプションを指定して、Web Driverを初期化します。 from selenium import webdriver from selenium.webdriver.chrome.options import Options from IPython.display import Image # WebDriverが既に起動したら閉じておく(Pythonでこんな書き方で良いかは自信はない) try: driver.quit() print("driver is closed.") except NameError: print("driver is not initialized.") options = Options() options.binary_location = '/usr/bin/google-chrome' options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--window-size=1280,1024') driver = webdriver.Chrome('chromedriver', options=options) Google検索 Googleのページを開きます。 スクリーンショットを取得して、保存します。 また、IPython.displayを使って、ノートブック上に画像を表示します。 参考: JupyterNotebook上に画像を表示する2つの方法 driver.get('https://www.google.com/') print(driver.title) assert driver.title == "Google" driver.save_screenshot('screenshot_google.png') Image("screenshot_google.png") 検索ボックスに「Selenide」と入力し、検索します。 ちなみにSelenideは、SeleniumのJavaラッパーのテストフレームワークです。 search_box = driver.find_element_by_name("q") search_box.send_keys('Selenide') search_box.submit() print(driver.title) driver.save_screenshot('screenshot_search.png') Image("screenshot_search.png") 最後に、Web Driverを閉じます。 driver.quit() 備考: 要素クリック直前・直後の処理を定義 要素をクリックする直前・直後に行う処理を定義する場合は、初期化時のコードをおそらく以下のようにすれば良さそうです。 待機処理やスクリーンショットの取得をクリック毎に行うような場合に使います。 使っているフレームワークや対象サイトの特性に応じて、上手に活用するとSeleniumの苦手なAjax処理の待機をうまくできたりします。 参考: 【Python】before_click/after_click・・・要素がクリックされる直前/直後の処理を実施する from selenium.webdriver.support.events import EventFiringWebDriver, AbstractEventListener # ・・・ class MyListener(AbstractEventListener): def before_click(self, element, driver): #要素をクリックする直前の処理 print("before_click:" + driver.current_url) def after_click(self, element, driver): #要素をクリックした直後の処理 print("after_click:" + driver.current_url) base_driver = webdriver.Chrome('chromedriver', options=options) driver = EventFiringWebDriver(base_driver, MyListener())
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS ECR/ECS チュートリアルメモ

AWS ECS チュートリアル ECS の起動自体は下記のURLの通りで、マウスを何度かカチカチすれば、AWS で用意されているデフォルトコンテナが起動し、Webページを参照できるため、詳細は割愛。 AWS Fargate での Amazon ECS の開始方法 Amazon ECS入門 〜公式のDockerイメージを使って10分で構築してみる〜 [初心者向け]コンテナのメリットをおさらいしながら、Amazon ECSでお手軽サービス作成してみた オリジナルコンテナを使用する 作業流れ AWS CLI 利用ユーザの追加 Docker実行環境で コンテナイメージを作成する AWS EC2 に Docker をインストールしても良いし、オンプレで Docker 環境を用意するでもOK。 作成したイメージを Amazon Elastic Container Registry(AWS ECR) に登録 この作業は GUI が用意されていないかもしれない。 aws-cli で Private / Public リポジトリを作り分ける方法がわからなかった。。。 AWS ECR に登録したコンテナイメージから AWS ECS クラスタ作成 AWS ECS の撤収 AWS ECR の撤収 1. AWS CLI 利用ユーザの追加 AWS ECS 利用ユーザに付与するポリシーについては、Amazon Elastic Container Service アイデンティティベースのポリシーの例 に IAM 管理ポリシーの内容っぽい設定例が紹介されている。が、使い方よくわからない 設定が面倒そうなので、Amazon ECS でのセットアップ のところで、ルートユーザ的な権限を付与する方法が紹介されていたので、それで IAM 管理ポリシー問題を、一旦、回避。 2. Dcoker コンテナイメージの作成 Dockerfile の準備 Dockerfile FROM ubuntu:18.04 # Install dependencies RUN apt-get update && \ apt-get -y install apache2 # Install apache and write hello world message RUN echo 'Hello Work...orz' > /var/www/html/index.html # Configure apache RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \ echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh イメージ作成 $ docker build -t hello-work . 動作確認 $ docker run -t -i -p 80:80 hello-work 確認が終わったら Ctrl+c でコンテナを停止します。 3. AWS ECR への登録 awscli のインストール $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ unzip awscliv2.zip && \ sudo ./aws/install $ echo 'complete -C aws_completer aws' >> $HOME/.bashrc $HOME/.barhrc のような感じで、aws_completer を設定しておくと、aws コマンドのサブコマンドで tab 補完が使えるようになります。 awscli の初期設定 $ aws configure AWS Access Key ID [None]: {アクセスキー(各自)} AWS Secret Access Key [None]: {シークレットアクセスキー(各自)} Default region name [None]: ap-northeast-1 Default output format [None]: json AWSのアカウントが複数ある場合は、aws configure --profile userid で、ユーザIDごとに設定できます。 AWS ECR リポジトリの準備 AWS ECR リポジトリ作成 $ aws ecr create-repository --repository-name hello-repository AWS CLI で作る ECRリポジトリはプライベートリポジトリっぽいです。Private/Public を切り替えるサブコマンドが見つからなかった。 この辺は、リポジトリ作った後に Private/Public を確認したほうがいいかもです。 リポジトリが作成されると、リポジトリの登録情報が表示されます。その中で、repositoryUri の情報を控えておきます。 コンテナイメージのタグ付け 3.1 で控えておいた repositoryUri で、コンテナイメージにタグ付けをします。 $ docker tag hello-work <repositoryUri> AWS ECR にコンテナを登録 $ aws ecr get-login-password | docker login --username AWS --password-stdin <aws_account_id.dkr.ecr.region.amazonaws.com> $ docker push <repositoryUri> docker login で指定する URL は ドメイン のところだけで、リポジトリ名までは含めません。 ドメインで認証して、ドメイン内のリポジトリを指定して push する、という感じです。 4. AWS ECS クラスタ作成 コンテナの定義 custom の 設定 ボタン押下 項目 設定値 コンテナ名 適当 イメージ repositoryUri:イメージタグ メモリ 128 MB TCPポート 80 詳細コンテナ設定 デフォルト(何も設定しない)のまま サービスを定義する ロードバランサーの種類 Application Load Balancer を選択 ロードバランサーに ALB を指定しないと プライベートIP、パブリックIP がセットされなかった。 カスタムコンテナの場合は ALB 無しの運用はできないのだろうか。。。 5. AWS ECS の撤収作業 AWS ECS クラスター 作成したクラスター名を選択 作成したクラスターの詳細画面の クラスターの削除 ボタンを押下 delete me を入力して 削除 ボタン押下 CloudFormation の方から削除する方法もあるらしい。 6. AWS ECR の撤収作業 Amazon ECR イメージの試用を終了したら、レポジトリを削除し、イメージストレージに対して課金されないようにします。 $ aws ecr delete-repository --repository-name hello-repository --force 参考サイト AWS公式 Amazon Elastic Container Service とは AWS ECSの料金 Amazon ECS における Docker の基本 Docker コンテナのデプロイ AWS CLI AWS CLI v2のコマンド補完を有効にする ハンズオン Amazon ECR + ECS CLI ハンズオン
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

サーバーを再起動した後Dockerが動かなくなったのでつまづいた。 エラー内容 ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running? If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable. 解決方法 dockerを起動できていなかったそう 以下のコードで起動できる $ sudo systemctl start docker
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeでMySQL簡易構築

MySQLに接続してみよう 材料 さくらVPS docker-compose MySQL公式サンプルデータベース teraterm 準備 mysql-test/ + docker-compose.yml + conf.d/ + data/ + docker-entrypoint-initdb.d/ + world.sql.gz docker-compose.yml # vim: set ts=2 et: version: '3.1' services: db: image: mysql:8.0.24 volumes: - ./data:/var/lib/mysql - ./conf.d:/etc/mysql/conf.d - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d command: --default-authentication-plugin=mysql_native_password cap_add: - SYS_NICE ports: - "3306:3306" restart: always environment: MYSQL_ROOT_PASSWORD: my-secret-pw MYSQL_DATABASE: world MYSQL_USER: user1 MYSQL_PASSWORD: pass1 phpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOSTS=db - PMA_USER=root - PMA_PASSWORD=my-secret-pw ports: - 10080:80 $ wget https://downloads.mysql.com/docs/world.sql.gz $ mv world.sql.gz docker-entrypoint-initdb.d/ TeraTermでポートフォワード設定 起動&確認 docker-compose up // or start http://localhost:10080 でブラウザアクセスするとphpmyadminが起動 なお、PyCharmであればSSHトンネルの使用という機能でTeraTermでのSSHポートフォワードの設定の代わりができる(Professional版) dockerのmysql8環境でmbind: Operation not permitted 【SQL】MySQL公式サンプルデータベースを使う - Qiita TeraTerm SSH転送(ポートフォワード)機能よりローカルIPアドレスでphpmyadminログイン - 協栄情報ブログ PyCharmでSSHトンネル経由でDBに接続する - Qiita
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS7に最新版のPython3をInstallする方法

Background 自作のHPで動かしているサーバOSはCentOS7と少し古いversionを使っています。それで今まではPython3.6だったのですが、asyncioの記述がシンプルになっているのとセイウチ構文をどこかで書いてみたいと思っていたのでPython3.9.4にアップデートかけてみました。 普通であれば yum install python3でインストールすればいいのですが、デフォルトだとpython3.6だったと思います。なのでここでは公式ページからソースファイルをダウンロードし、makeを使ってコンパイルしてpython3.9.4をインストールしようと思います。 Caution 注意点としては以下の通りです。 CentOS7でのgccのバージョンは4.8 バージョン5以上でないとmakeでエラーになる インストールした後にコマンドパスPATH、共有ライブラリパスLD_LIBRARY_PATHにパスを通す ./configure の実行高速化パラメータ--enable-optimizations を使わない 付けないときと比べて2倍から5倍の実行速度があるのですが付けるとエラーになります。 ./configure で --enable-shared を付けないと pip3 install mod_wsgi するときにエラーになる。 Development #必要なパッケージをインストール yum groupinstall -y "Development Tools" yum install -y kernel-devel kernel-headers bzip2-devel libdb-devel libffi-devel yum install -y gdbm-devel xz-devel ncurses-devel readline-devel tk-devel uuid-devel openssl-devel #zlibをインストール wget http://zlib.net/zlib-1.2.11.tar.gz \ && tar xvzf zlib-1.2.11.tar.gz \ && cd zlib-1.2.11 \ && ./configure \ && make -j4 \ && make install #gccをインストール + 7系にスイッチ yum install -y centos-release-scl yum install -y devtoolset-7 && scl enable devtoolset-7 bash # python3.9.4 をインストール wget https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tgz \ && tar xvzf Python-3.9.4.tgz \ && cd Python-3.9.4 \ && ./configure \ --with-ensurepip \ --enable-shared \ --enable-ipv6 \ --prefix=/usr/local/python3.9 \ && make \ && make altinstall # パスを通す ln -sf /usr/local/python3.9/bin/python3.9 /usr/bin/python3 ln -sf /usr/local/python3.9/bin/pip3.9 /usr/bin/pip3 echo 'LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/python3.9/lib"' >> ~/.bashrc echo 'PATH="$PATH:/usr/local/python3.9/bin"' >> ~/.bashrc source ~/.bashrc # pip をアップデート pip3 install --upgrade pip Reference CentOS7でldconfigを使って共有ライブラリを追加する DockerfileでPATHを通す時はRUNではなくENVを使おう [解決済み]Python3.8.5で「ssl module in python is not available」 Dockerfileで、あえてsourceコマンドで環境変数を設定 UbuntuでPythonをソースからインストール pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available python: error while loading shared libraries: libpython3.4m.so.1.0: cannot open shared object file: No such file or directory “ssl module in Python is not available” when installing package with pip3 python 3.8 Could not import runpy module
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

raydiumをdockerでローカル上に実行したい

raydiumとは何か これです。 今流行り?のdefiの銘柄の一つ 先日twitterで盛り上がってましたが引用するのは面倒なので割愛します。 なぜローカルでraydiumを動かす必要があるのか そもそもraydiumをローカルで動かすってなんだよってところからかもしれません。 普通、defiでスワップやステークする際にはそれぞれのサイトにアクセスします、pancakeswapとか色々 ところが、彼らも普通のサーバーなので重くなる時があります。 そう、IDOの時(多分) じゃあどうするか ローカルで動かせば簡単にチェーンにブロードキャストできますよね。 知らんけど。 じゃあ構築しよう ※windows向けに書きます こちらからcloneしてください。 そのまえにgitの環境が必要ですね ここから「Download」をぽちっと押して、 すべてそのままnext連打してください。 コマンドプロンプトを起動して、以下のようになればインストールできています。 まず失敗しません。 お次はお好きなディレクトリで git clone https://github.com/raydium-io/raydium-ui.git してください。 お好きなディレクトリにきっといろいろファイルが落ちてきていると思います。 ちなみにgitのreadmeには下記のようなことが書いてありますが。 # install dependencies $ yarn install # serve with hot reload at localhost:3000 $ yarn dev # build for production and launch server $ yarn build $ yarn start # generate static project $ yarn generate dockerで起動する場合は使いません。 vue(nuxt.js)で書かれているのでそれにそってdockerを構築します。 dockerをインストールしましょう。 左のDownload for Windowsでいいです。 あとはひたすらnext 次は以下のファイルを用意します。 Dockerfile FROM node:10.14.1-alpine EXPOSE 3000 ENV HOST 0.0.0.0 WORKDIR /usr/src COPY ./package.json ./ RUN npm install COPY . . 拡張子はいりません。先ほどcloneしたお好きなディレクトリに直置きしてください。 それともう一つ docker-compose.yml version: "3" services: local-raydium: build: context: . dockerfile: Dockerfile container_name: local-raydium ports: - "3000:3000" command: npm run dev volumes: - /usr/src/node_modules - .:/usr/src これは拡張子いるので注意して、同じように直置きしてください。 ここまできたらあとはcloneしたお好きなディレクトリにコマンドプロンプトでもpowershellでもいいので移動して docker-compose up -d --build しばらくするとdoneとか出ると思うので、おもむろにdockerを見てみます。 こうなっていたら完了です。 ブラウザで http://localhost:3000/ にアクセスしましょう。 お疲れ様でした。LAUNCH APPからいつものraydiumをお楽しみください。 素晴らしいと思ったら Raydium FfQc2RFvcddDerTBMjaZFVYKFLhcLvVyknqJR85PGBs9
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Terraform環境をdockerで構築

概要 AWSのリソースは基本的にTerraformで構築していますが、人によってTerraform実行環境に差分が発生していたことが気になったので、Dockerを使用しできるだけ差分をなくすことが目標です。 ここでは、Terraformを実行するための最低限のセットアップを行っています。 前提条件 前提条件は以下の通りです。 Dockerがインストール済みであること。 構成 ディレクトリ構成は以下の通りです。 . ├── .aws (awsの認証情報を格納) │   ├── config │   └── credentials ├── docker-compose.yml ├── dockerfile └── src (Terraformソースを格納) Dockerfileは以下の通りです。 aws-cli、Terraformなど最低限必要なものをインストールしています。 FROM python:3.6 # install aws-cli RUN pip install awscli # install command RUN apt-get update && apt-get install -y vim wget unzip vim sudo # install terraform RUN wget https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip RUN unzip ./terraform_0.13.0_linux_amd64.zip -d /usr/local/bin/ RUN mkdir ~/.aws # 初期ディレクトリ WORKDIR /opt Docker-compose.ymlは以下の通りです。 docker-compose.yml version: '3' services: terraform_env: build: . volumes: - ./src:/opt/src - ./.aws:/root/.aws 構築 実際にDocker環境を構築します。 手順は以下の通りです。 イメージのビルド 以下コマンドを実行し、イメージのビルドを行います。 $ docker-compose build コンテナの立ち上げ 以下コマンドを実行し、イメージからコンテナを立ち上げます。 コマンド実行後、コンテナの/optにログインされます。 $ docker-compose run --rm terraform_env bash Creating work_terraform_env_run ... done root@cd820124c743:/opt# ls src コマンドの確認 Terraform、aws-cliがインストールされている確認します。 root@1a285d2a39e4:/opt# aws --version aws-cli/1.19.60 Python/3.6.13 Linux/5.10.25-linuxkit botocore/1.20.60 root@1a285d2a39e4:/opt# terraform --version Your version of Terraform is out of date! The latest version is 0.15.1. You can update by downloading from https://www.terraform.io/downloads.html Terraform v0.13.0 後は src/以下にTerraformのファイルを作成し、実際にリソースを構築していきましょう。 備考 credentials をプロフィール毎に分ける際は、Terraformの provider でどの環境を使用するか定義する必要があります。 credentials [test_env] aws_access_key_id = xxxxxxxxxx aws_secret_access_key = xxxxxxxxxx [test] aws_access_key_id = xxxxxxxxxx aws_secret_access_key = xxxxxxxxxx provider.tf provider "aws" { region = "ap-northeast-1" profile = "test_env" }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む