20210410のdockerに関する記事は12件です。

Dcoker + python/seleniumで車屋さんのWEBページの全画面スクリーンショットを取得してみる

はじめに WEBページの全画面スクリーンショットを手軽に撮りたくなりトライアルしてみました. 備忘メモとして残します. docker/docker-composeは別途インストールしてください. 登場人物 python3実行用コンテナ ※リクエスト実行用 selenium HUB用コンテナ ※python3のリクエストの受け口 selenium Chrome用コンテナ 実行準備 クライアントPCに準備するファイル 以下のファイルを準備します. - Dockerfile - docker-compose.yml - get-sc-website.py(※後述) Dockerfile(python3実行用コンテナ) Dockerホスト⇄python3実行用コンテナでファイルをやり取りできるようにしておきます Dockerfile FROM python:3 RUN pip install --upgrade pip && pip install selenium ADD . /opt WORKDIR /opt docker-compose(python/selenium用) seleniumは単一ノードで起動します. Firefox/Operaのseleniumノードが欲しくなったら追加してください. docker-compose.yml version: '3' services: python3: restart: always build: context: . dockerfile: ./Dockerfile container_name: 'python3' working_dir: '/root/' tty: true volumes: - ./opt:/root/opt chrome: image: selenium/node-chrome:4.0.0-beta-1-20210215 volumes: - /dev/shm:/dev/shm depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 ports: - "6900:5900" selenium-hub: image: selenium/hub:4.0.0-beta-1-20210215 container_name: selenium-hub ports: - "4442:4442" - "4443:4443" - "4444:4444" docker composeで起動 docker pull python:3 docker compose up -d pythonファイルの用意 python3実行用コンテナに配置します.対象WEBページはサンプルです. get-sc-website.py import os from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.common.exceptions import WebDriverException def screenshot(driver, filename): w = driver.execute_script('return document.body.scrollWidth') h = driver.execute_script('return document.body.scrollHeight') driver.set_window_size(w, h) driver.save_screenshot(filename) if __name__ == '__main__': ## set capabilities capabilities = DesiredCapabilities.CHROME.copy() driver = webdriver.Remote( ## set selenium server command_executor='http://selenium-hub:4444', desired_capabilities=capabilities ) website = ['https://toyota.jp/', 'https://www.suzuki.co.jp/'] ## get website try: ## increments of website[] i=0 for filename in website: print(website[i]) driver.get(website[i]) filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), website[i].replace('/','').replace(':','')+".png") ## get screenshot screenshot(driver, filename) i+=1 driver.quit() except WebDriverException: print('cannot get webpage') docker上でpythonを実行 python用コンテナに配置し,スクレイプ実行 mv ./get-sc-website.py ./opt docker exec -it python3 python opt/get-sc-website.py 実行結果 しばらく待つと ./opt フォルダに <サイトURL.png> で画像が出力されます. (seleniumは実行速度が遅いです) 終わりに 注意点 selenium4.0になってからリクエストのURLが変わっています. 2.X/3.X) command_executor='http://localhost:4444/wd/hub' 4.X) command_executor='http://localhost:4444/'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dcoker + python/seleniumでWEBページの全画面スクリーンショットを取得してみる

はじめに WEBページの全画面スクリーンショットを手軽に撮りたくなりトライアルしてみました. 備忘メモとして残します. docker/docker-composeは別途インストールしてください. 登場人物 python3実行用コンテナ ※リクエスト実行用 selenium HUB用コンテナ ※python3のリクエストの受け口 selenium Chrome用コンテナ クライアントPCに準備するファイル 以下のファイルを準備します. - Dockerfile - docker-compose.yml - get-sc-website.py(※後述) Dockerfile(python3実行用コンテナ) Dockerホスト⇄python3実行用コンテナでファイルをやり取りできるようにしておきます Dockerfile FROM python:3 RUN pip install --upgrade pip && pip install selenium ADD . /opt WORKDIR /opt docker-compose(python/selenium用) seleniumは単一ノードで起動します. Firefox/Operaのseleniumノードが欲しくなったら追加してください. docker-compose.yml version: '3' services: python3: restart: always build: context: . dockerfile: ./Dockerfile container_name: 'python3' working_dir: '/root/' tty: true volumes: - ./opt:/root/opt chrome: image: selenium/node-chrome:4.0.0-beta-1-20210215 volumes: - /dev/shm:/dev/shm depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 ports: - "6900:5900" selenium-hub: image: selenium/hub:4.0.0-beta-1-20210215 container_name: selenium-hub ports: - "4442:4442" - "4443:4443" - "4444:4444" docker composeで起動 docker pull python:3 docker compose up -d pythonファイルの用意 python3実行用コンテナに配置します.対象WEBページはサンプルです. get-sc-website.py import os from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.common.exceptions import WebDriverException def screenshot(driver, filename): w = driver.execute_script('return document.body.scrollWidth') h = driver.execute_script('return document.body.scrollHeight') driver.set_window_size(w, h) driver.save_screenshot(filename) if __name__ == '__main__': ## set capabilities capabilities = DesiredCapabilities.CHROME.copy() driver = webdriver.Remote( ## set selenium server command_executor='http://selenium-hub:4444', desired_capabilities=capabilities ) website = ['https://AAA.jp/', 'https://BBB.jp/'] ## get website try: ## increments of website[] i=0 for filename in website: print(website[i]) driver.get(website[i]) filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), website[i].replace('/','').replace(':','')+".png") ## get screenshot screenshot(driver, filename) i+=1 driver.quit() except WebDriverException: print('cannot get webpage') python用コンテナに配置し,スクレイプ実行 mv ./get-sc-website.py ./opt docker exec -it python3 python opt/get-sc-website.py 実行結果 終わりに 注意点 selenium4.0になってからリクエストのURLが変わっています. 2.X/3.X) command_executor='http://localhost:4444/wd/hub' 4.X) command_executor='http://localhost:4444/'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker上のphpMyAdminでアップロード上限が派生したときの解決法

前提 DockerでphpMyAdminのイメージを利用してめでたくphpMyAdminがローカルで利用できるようになっていること。 この記事で解決する問題 インポート機能で大きなサイズのファイルをインポートした時に、次のようなエラーが発生した。 ファイルサイズが PHP の設定で許可された最大値を超えています。 解決方法 概要 php.iniのupload_max_filesizeを修正し、phpMyAdminのファイルアップロー上限を変更する。 docker-compose.ymlで次のようにapacheイメージのphp.iniをvolumeでマウントする web: (中略) volumes: - ./web/php.ini:/etc/php.ini マウントしたphp.iniの upload_max_filesizeを修正する upload_max_filesize = 256M docker-compse.ymlでphpMyAdminのファイルアップロー上限を変更する。 phpmyadmin: (中略) environment: UPLOAD_LIMIT: 256M これで、デフォルトで(最長: 2,048KiB)のところを、256Mまでのファイルをアップロードできるようになります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでIntervention/Imageを使う際に、GD拡張機能を使えるようにするためのDockerfileの書き方

環境 ・Docker, docker-composeを用いてLEMP(laravel, php-fpm, nginx, MySQL)環境 ・php-fpm7.3 ・MySQL8.0 ・nginx1.8 概要 LaravelでIntervention/Imageを使って画像のアップロード機能を実装する際に、以下のエラーが出た。 エラー GD Library extension not available with this PHP installation 「このPHPインストール環境では、GD拡張機能は使えませんよ」という意味。 同様の事例 同様の事例を調べたところ、以下の記事がヒットした。 LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法 この記事によると、「Intervention/Image」はPHP5.4以上では、画像処理ライブラリのGDまたはImageMagickをインストールする必要があり、下記の対処を行えば良いとのこと。 apt-get update apt-get install php7.0-gd しかし、Dockerfileに上記apt-get install php7.0-gdを追記してもそんなパッケージはありませんと怒られてしまう。 対処 DockerでGD拡張機能を使うためにDockerfileをどのように書き換えれば良いか模索した結果以下の記事とその参考元のDockerfileの使い方の表記を発見。 ・ DockerでのGD拡張についてPHP/Laravel ・ https://hub.docker.com/_/php 上記を参考にphp実行環境のDockerfileを以下のように修正 Dockerfile FROM php:7.4-fpm-buster SHELL ["/bin/bash", "-oeux", "pipefail", "-c"] ENV \ COMPOSER_ALLOW_SUPERUSER=1 \ COMPOSER_HOME=/composer COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer RUN apt-get update RUN apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales \ + libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \ //追記:GD拡張に必要なパッケージ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ locale-gen en_US.UTF-8 && \ localedef -f UTF-8 -i en_US en_US.UTF-8 && \ mkdir /var/run/php-fpm && \ mkdir /var/log/php && \ docker-php-ext-install intl pdo_mysql zip bcmath && \ + docker-php-ext-configure gd --with-freetype --with-jpeg && \ //追記 + docker-php-ext-install -j$(nproc) gd && \ //追記 composer config -g process-timeout 3600 && \ composer config -g repos.packagist composer https://packagist.org COPY ./php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf COPY ./php.ini /usr/local/etc/php/php.ini WORKDIR /work/backend 結論 GD拡張機能を使えるようにするためには、Dockerfileに下記コードを追記する必要がありました。 apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev docker-php-ext-configure gd --with-freetype --with-jpeg && \ docker-php-ext-install -j$(nproc) gd 参考 ・ LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法 ・ DockerでのGD拡張についてPHP/Laravel ・ https://hub.docker.com/_/php  →特に参考になりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでIntervention/Imageを使う際に、GD拡張機能を使うためのDockerfileの書き方

環境 ・Docker, docker-composeを用いてLEMP(laravel, php-fpm, nginx, MySQL)環境 ・php-fpm7.3 ・MySQL8.0 ・nginx1.8 概要 LaravelでIntervention/Imageを使って画像のアップロード機能を実装する際に、以下のエラーが出た。 エラー GD Library extension not available with this PHP installation 「このPHPインストール環境では、GD拡張機能は使えませんよ」という意味。 同様の事例 同様の事例を調べたところ、以下の記事がヒットした。 LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法 この記事によると、「Intervention/Image」はPHP5.4以上では、画像処理ライブラリのGDまたはImageMagickをインストールする必要があり、下記の対処を行えば良いとのこと。 apt-get update apt-get install php7.0-gd しかし、Dockerfileに上記apt-get install php7.0-gdを追記してもそんなパッケージはありませんと怒られてしまう。 対処 DockerでGD拡張機能を使うためにDockerfileをどのように書き換えれば良いか模索した結果以下の記事とその参考元のDockerfileの使い方の表記を発見。 ・ DockerでのGD拡張についてPHP/Laravel ・ https://hub.docker.com/_/php 上記を参考にphp実行環境のDockerfileを以下のように修正 Dockerfile FROM php:7.4-fpm-buster SHELL ["/bin/bash", "-oeux", "pipefail", "-c"] ENV \ COMPOSER_ALLOW_SUPERUSER=1 \ COMPOSER_HOME=/composer COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer RUN apt-get update RUN apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales \ + libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \ //追記:GD拡張に必要なパッケージ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ locale-gen en_US.UTF-8 && \ localedef -f UTF-8 -i en_US en_US.UTF-8 && \ mkdir /var/run/php-fpm && \ mkdir /var/log/php && \ docker-php-ext-install intl pdo_mysql zip bcmath && \ + docker-php-ext-configure gd --with-freetype --with-jpeg && \ //追記 + docker-php-ext-install -j$(nproc) gd && \ //追記 composer config -g process-timeout 3600 && \ composer config -g repos.packagist composer https://packagist.org COPY ./php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf COPY ./php.ini /usr/local/etc/php/php.ini WORKDIR /work/backend 結論 LEMP環境下でGD拡張機能を使えるようにするためには、Dockerfileに下記コードを追記する必要がありました。 apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev docker-php-ext-configure gd --with-freetype --with-jpeg && \ docker-php-ext-install -j$(nproc) gd 参考 ・ LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法 ・ DockerでのGD拡張についてPHP/Laravel ・ https://hub.docker.com/_/php  →特に参考になりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Kubernetesとは

@ぱんだまと申します。 web系エンジニア歴半年になり、Kubernetesを用いたマイクロサービス開発に興味がでたためこちらをまとめてみました。 内容 Kubenetesのざっくりとしたまとめ Kubernetesをローカル上へインストール kubectlコマンドを叩いてPodを実際に起動してみる となっています。まだKubernetesを触った事が無い方や入門中の方向けです。 もし間違っている部分等ありましたらご指摘いただけると幸いです。 そもそもKubernetesって? Kubernetesは自動デプロイ、スケーリング、アプリ・コンテナの運用自動化のために設計されたオープンソースのプラットフォームです。Kubernetesによって要求に迅速かつ効率良く対応ができます。Dockerは単一のサーバ上でコンテナを実行することを目的として開発されたものですが、それとは対照的にKubernetesは複数のサーバ上でコンテナを分散実行し、それを管理するためのコンテナオーケストレーション機能が中心となっています。 Kubernetesの構成 Kubernetesのクラスタは大きくMasterとNodeの2つのコンポーネントと、Kubernetesのクラスタ管理情報を保存するetcdで構成されています。 ・コンポーネントの図 Masterコンポーネントのサービス構成 kube-apiserver Kubernetesを操作するためのAPIが実装されたサービスでありMasterコンポーネントのフロントエンドにあたる kube-controller-manager Kubernetesが扱うコンテナを始めとする様々なリソースの状態を管理するサービス kube-scheduler KubernetesのNodeに対するコンテナの割り当てを管理するサービス cloud-controller-manager Kubernetesが連携するクラウドプロバイダのリソースを管理するサービス Nodeコンポーネントのサービス構成 kubelet Nodeを管理するエージェントサービスであり、Masterコンポーネントと連携してコンテナ実行を管理する。 kubeproxy Masterコンポーネントと連携して複数のコンテナへのトラフィック分散を制御するサービス Container Runtime Docker等のコンテナを実行するランタイムサービス Kubernetesのメリット アプリケーションやバッチなどのワークロードを組み合わせてサービスを構成する場合、複数のコンテナを実行して連携する必要があります。Kubernetesは複数のコンテナを実行するのに必要な様々な機能を備えており、これらの機能を利用することで以下のメリットが得られます。 ・アプリを迅速に予定通りにデプロイする (コンテナをサーバー群へ展開する) ・稼働中にアプリをスケールする(稼働中にコンテナ数を変更する) ・新機能をシームレスに提供開始する (稼働中にロールアウトする) ・コンテナを共存させて稼働率を高くする 実際にDockerからKubernetesをインストールしてみる。 ここからは実際にKubernetesをインストールして使用してみましょう! 今回はローカル環境に開発用のKubernetesをインストールする方法となっています。 より本格的に使用する場合は各クラウドプロバイダが提供するkubernetesのサービスを利用したり複数のサーバにKubernetesをインストールしてクラスタを構築する事が必要です。 DockerはKubernetesをサポートしているため設定を有効化するだけでkubernetesをインストールできるみたいです! (Kubenetesの設定はデフォルトでは無効化されているため次の手順で設定を有効化する必要があります。) ①ツールバーの「preference」から設定画面を開く ②Kubernetesタブを開き「Enable Kubernetes」のチェックボックスを有効化します。 ③「Apply」をクリックするとKubernetesのインストールが開始されます ④数分でインストール完了しチェックがつきます。 Kubernetesの操作は、専用のコマンドラインクライアントである「kubectl」を使用しますDockerではKubernetesをインストールするとkubectlも一緒にインストールされるためすぐにコマンドを使う事ができます! 実際にkubectlを使用してKubernetesのクラスタ情報を取得してみましょう。 クラスタ情報は kubectl cluster-info ↑ このコマンドを実行することで使用できます。 このコマンドを実際に入力してみると、、、 $ kubectl cluster-info Kubernetes master is running at https://kubernetes.docker.internal:6443 KubeDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. 上記のようにクラスタ情報が取得できたら成功となります! DeploymentによるPodの管理 インストールが完了したらKubernetesを使用してコンテナを起動してみます。 Kubernetesは「マニフェスト」と呼ばれる定義ファイルに「リソース」を記述して登録することでコンテナを実行します。リソースはコンテナの管理や設定ファイルの管理といった用途に合わせて様々な種類が用意されており複数のリソースと組み合わせてコンテナの分散実行を実現しています。 コンテナの管理に使用するリソースとして[Pod]があります。Podは1つ以上のコンテナグループを表し、Kubernetesにおけるコンテナ管理の基本単位になっています。 マニフェストに定義したPodをKubernetesに登録することでコンテナを実行できますが複数のコンテナを分散実行するような場合にはその分だけ複数のPodを定義する事になり管理が複雑化します。そこで複数のPodを管理するために「Deployment」がkubernetesには用意されています。 次にDeploymentの定義をKubernetesに登録してコンテナが起動できるかを確認してみます。 まずマニフェストファイルをdeployment.yamlに保存します。 deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15.7 ports: - containerPort: 80 次に下記コマンドを使用してKubernetesにマニフェストファイルの内容を登録します。 $ kubectl apply -f deployment.yaml deployment.apps/nginx-deployment created これでpodの登録が完了しました! 実際に登録されたPodを確認してみましょう。 $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-7d4d8467d9-4748n 1/1 Running 0 4m27s nginx-deployment-7d4d8467d9-mc5t6 1/1 Running 0 4m27s nginx-deployment-7d4d8467d9-ppnkg 1/1 Running 0 4m27s 無事登録された事が分かります! 次回はもう少しじっくりとkubectlを使ってKubernetesをいじってみたいと思います! 読んでいただきありがとうございました! 参考文献・サイト 技術評論社 「みんなのDocker・Kubernetes」 著者 五十嵐 綾様 今さら人に聞けない Kubernetes とは? https://qiita.com/MahoTakara/items/85096f8b2632c802ab22
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Kubernetes初心者がインストールからPodを起動させるまで

@ぱんだまと申します。 web系エンジニア歴半年になり、Kubernetesを用いたマイクロサービス開発に興味がでたためこちらをまとめてみました。 内容 Kubenetesのざっくりとしたまとめ Kubernetesをローカル上へインストール kubectlコマンドを叩いてPodを実際に起動してみる となっています。まだKubernetesを触った事が無い方や入門中の方向けです。 ※もし間違っている部分等ありましたらご指摘いただけると幸いです。 そもそもKubernetesって? Kubernetesは自動デプロイ、スケーリング、アプリ・コンテナの運用自動化のために設計されたオープンソースのプラットフォームです。Kubernetesによって要求に迅速かつ効率良く対応ができます。Dockerは単一のサーバ上でコンテナを実行することを目的として開発されたものですが、それとは対照的にKubernetesは複数のサーバ上でコンテナを分散実行し、それを管理するためのコンテナオーケストレーション機能が中心となっています。 Kubernetesの構成 Kubernetesのクラスタは大きくMasterとNodeの2つのコンポーネントと、Kubernetesのクラスタ管理情報を保存するetcdで構成されています。 ・コンポーネントの図 Masterコンポーネントのサービス構成 kube-apiserver Kubernetesを操作するためのAPIが実装されたサービスでありMasterコンポーネントのフロントエンドにあたる kube-controller-manager Kubernetesが扱うコンテナを始めとする様々なリソースの状態を管理するサービス kube-scheduler KubernetesのNodeに対するコンテナの割り当てを管理するサービス cloud-controller-manager Kubernetesが連携するクラウドプロバイダのリソースを管理するサービス Nodeコンポーネントのサービス構成 kubelet Nodeを管理するエージェントサービスであり、Masterコンポーネントと連携してコンテナ実行を管理する。 kubeproxy Masterコンポーネントと連携して複数のコンテナへのトラフィック分散を制御するサービス Container Runtime Docker等のコンテナを実行するランタイムサービス Kubernetesのメリット アプリケーションやバッチなどのワークロードを組み合わせてサービスを構成する場合、複数のコンテナを実行して連携する必要があります。Kubernetesは複数のコンテナを実行するのに必要な様々な機能を備えており、これらの機能を利用することで以下のメリットが得られます。 ・アプリを迅速に予定通りにデプロイする (コンテナをサーバー群へ展開する) ・稼働中にアプリをスケールする(稼働中にコンテナ数を変更する) ・新機能をシームレスに提供開始する (稼働中にロールアウトする) ・コンテナを共存させて稼働率を高くする 実際にDockerからKubernetesをインストールしてみる。 ここからは実際にKubernetesをインストールして使用してみましょう! 今回はローカル環境に開発用のKubernetesをインストールする方法となっています。 より本格的に使用する場合は各クラウドプロバイダが提供するkubernetesのサービスを利用したり複数のサーバにKubernetesをインストールしてクラスタを構築する事が必要です。 DockerはKubernetesをサポートしているため設定を有効化するだけでkubernetesをインストールできるみたいです! (Kubenetesの設定はデフォルトでは無効化されているため次の手順で設定を有効化する必要があります。) ①ツールバーの「preference」から設定画面を開く ②Kubernetesタブを開き「Enable Kubernetes」のチェックボックスを有効化します。 ③「Apply」をクリックするとKubernetesのインストールが開始されます ④数分でインストール完了しチェックがつきます。 Kubernetesの操作は、専用のコマンドラインクライアントである「kubectl」を使用します。 DockerではKubernetesをインストールするとkubectlも一緒にインストールされるためすぐにコマンドを使う事ができます! 実際にkubectlを使用してKubernetesのクラスタ情報を取得してみましょう。 クラスタ情報は kubectl cluster-info ↑ このコマンドを実行することで使用できます。 このコマンドを実際に入力してみると、、、 $ kubectl cluster-info Kubernetes master is running at https://kubernetes.docker.internal:6443 KubeDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. 上記のようにクラスタ情報が取得できたら成功となります! DeploymentによるPodの管理 インストールが完了したらKubernetesを使用してコンテナを起動してみます。 Kubernetesは「マニフェスト」と呼ばれる定義ファイルに「リソース」を記述して登録することでコンテナを実行します。リソースはコンテナの管理や設定ファイルの管理といった用途に合わせて様々な種類が用意されており複数のリソースと組み合わせてコンテナの分散実行を実現しています。 コンテナの管理に使用するリソースとして「Pod」があります。Podは1つ以上のコンテナグループを表し、Kubernetesにおけるコンテナ管理の基本単位になっています。 マニフェストに定義したPodをKubernetesに登録することでコンテナを実行できますが複数のコンテナを分散実行するような場合にはその分だけ複数のPodを定義する事になり管理が複雑化します。そこで複数のPodを管理するために「Deployment」がkubernetesには用意されています。 次にDeploymentの定義をKubernetesに登録してコンテナが起動できるかを確認してみます。 まずマニフェストファイルをdeployment.yamlに保存します。 deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15.7 ports: - containerPort: 80 上記yamlファイルはnginxのコンテナを実行する設定を記載しています。 次に下記コマンドを使用してKubernetesにマニフェストファイルの内容を登録します。 $ kubectl apply -f deployment.yaml deployment.apps/nginx-deployment created これでpodの登録が完了しました! 実際に登録されたPodを確認してみましょう。 $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-7d4d8467d9-4748n 1/1 Running 0 4m27s nginx-deployment-7d4d8467d9-mc5t6 1/1 Running 0 4m27s nginx-deployment-7d4d8467d9-ppnkg 1/1 Running 0 4m27s 無事Podが起動された事が分かります! 次回はもう少しじっくりとkubectlを使ってKubernetesをいじってみたいと思います! 読んでいただきありがとうございました! 参考文献・サイト 著者 五十嵐 綾様 「みんなのDocker・Kubernetes」 ~技術評論社~ 今さら人に聞けない Kubernetes とは? https://qiita.com/MahoTakara/items/85096f8b2632c802ab22
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Hubにイメージをプッシュする

こんにちは。 プログラミング初学者です。 ローカル環境でdockerの構築が終わり、railsでのアプリ作成を行っている最中です。 今更ながらDockerHubにイメージをプッシュしたので、備忘録的にまとめてみました。 また、色々参考記事とかみたのですが、私がみたものと今のDockerHubではUIが若干異なっているので、画像付きでまとめてみました。 概要 目的:DockerHubに自作のイメージをプッシュする。 DockerHubとは? ユーザーが作成したコンテナをアップロードして公開・共有できるサービスで、ここで公開されているコンテナは自由にダウンロードして自分のサーバーに簡単にデプロイできる。公開されているコンテナは「リポジトリ」という単位で管理され、タグを使ったバージョン管理も可能だ。 参考記事: Dockerコンテナをクラウドサービス上で共有できる「Docker Hub」を使ってみる 前提条件 ・DockerHubのアカウント作成済み ・GitHubにリポジトリのプッシュ済み 実行 DockerHubとGitHubの連携。(実施済みは飛ばしてヨシ) ①トップページより自分のアカウントタブをクリックし、「Account Settings」へ遷移する。 ②左のメニューより「Linked Accounts」のタブをクリック。画面中央やや下に「GitHub」があり、その右の方にある「Connect」をクリック。 ③GitHubの画面へ遷移するので、パスワードを入力し、ログインする。 ④再度DockerHubの先程の画面にリダイレクトされる。画像のように、コンセントマークの斜線と「Connect」の文字が消えていれば連携完了。 DockerHubへイメージをプッシュ! ①トップページより青色背景に白文字の「Create Repository」をクリック ②自分のDockerHubIDであることを確認の上、NameやDescriptionにイメージの名前、説明などを簡単に記載する。「Visibility」はお好みに合わせて、プライベートかパブリックを選択する。(DockerHub無料枠ではプライベートリポジトリの数に制限があるみたいなので注意。) ③「Build Settings」にてGitHubを選択すると、自分のGitHubIDを選べ、その後自分がGitHubにプッシュしたリポジトリたちの中から、DockerHubにプッシュしたいリポジトリを選択することができる。 ④さらに「BUILD RULES +」をクリックすることで詳細の設定が可能。 デフォルトでは「Source Type」がBranchで、「Source」がmaster、「Docker Tag」がlatestで「Dockerfile location」がDockerfileとなっています ここでは「Docker Tag」のlatestを1.0に変更し、バージョンを番号で管理することとします。 また、「Dockerfile location」はGitHubにプッシュしているリポジトリの中に、ルートディレクトリにしっかりとDockerfileという名前でファイルを保存してあれば、変更しなくても大丈夫です。 ⑤では、「Create & Build」で実行しましょう!! するとプッシュしたリポジトリのメイン画面へ遷移します。 その裏側ではBUILDが実行されています。(これには数分〜数十分の時間がかかる場合があります。) 「Builds」のタブに遷移し、下の方にAutomated Buildsの欄において、「Latest Build Status」がPENDINGとかIN PROGRESSであればビルド中です。 SUCCESSになれば完了ですね! ⑤ビルドが完了すると、「General」タブよりプッシュしたものの詳細が閲覧できます。 「Tags and Scans」のTagの1.0(これは先程指定したDocker Tagですね)を選択するとイメージレイヤーなどが閲覧できます。 また、使用したGitHubのリポジトリ内にREADMEがあれば、それもこの「General」タブの下の方で閲覧ができます。すごい! これでプッシュ完了です。パブリックにしたことで全世界のユーザーがdocker pullコマンドであなたのプッシュしたdocker imageを入手することができちゃいます。 また、Dockerfileを変更するたびにプッシュしておくことで、バージョン管理ができ、GitHubのように万が一エラーが生じた時に戻したりするときに使えますね。ありがたや。 まとめ ビルドに時間がかかって、「なぜかプッシュできてない??」とテンパってしまったので、備忘録的にまとめてみましたが、なんら難しい手順はありませんね。。。 ターミナルからでもdocker pushコマンドでプッシュしていけるので、これも簡単で良いですね。 ご覧いただきありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【21.04.09】DockerでRails x MySQLの環境構築

Docker公式リファレンス バージョン指定について RailsもRubyもMySQLも基本「これから開発するよ!」って時はその時の最新版を指定すればokです。 ・既存コードに関して改修をする ・保守する場合 時には、バージョンの変更はリスクなので、固定する方がよいらしいです。 ・DockerhubにあるMySQLのimageはこちら ・DockerhubにあるRubyのimageはこちら 私の環境 % sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H524 まずは必要ファイルを作っていきます。 プロジェクトファイルを新規作成 & その下に移動 terminal. mkdir projectfile && cd projectfile 必須6ファイルを一気に新規作成 terminal. %touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh,.env} Dockerfileの編集 ここまでできたらvimでDockerfileを開いて以下をコピペ % vi Dockerfileで開けます。 ※Dockerfile=Docker imageを作るための設計書 ※Dockerfileのコマンドについては公式リファレンスのこちらを参照してください。 dockerfile. FROM ruby:3.0.1 ENV LANG C.UTF-8 ENV APP_ROOT /app # install required libraries 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 && \ apt-get update -qq && \ apt-get install -y --no-install-recommends \ build-essential \ nodejs \ yarn && \ apt-get clean && \ rm --recursive --force /var/lib/apt/lists/* # create working directory RUN mkdir $APP_ROOT WORKDIR $APP_ROOT # bundle install COPY Gemfile $APP_ROOT/Gemfile COPY Gemfile.lock $APP_ROOT/Gemfile.lock RUN bundle install --jobs 4 --retry 3 # create app in container COPY . $APP_ROOT # script to be executed every time the container starts COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process CMD ["rails", "server", "-b", "0.0.0.0"] ・curlコマンド=サーバから、もしくはサーバへデータ転送を行うコマンド docker-compose.ymlの編集 docker-compose.yml version: '3.7' services: db: image: mysql:8.0.20 volumes: - mysql:/var/lib/mysql:delegated ports: - '3307:3306' command: --default-authentication-plugin=mysql_native_password env_file: .env web: build: context: . dockerfile: Dockerfile command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" tty: true stdin_open: true env_file: .env depends_on: - db ports: - '3000:3000' volumes: - .:/app:cached - bundle:/usr/local/bundle:delegated - node_modules:/app/node_modules - tmp-data:/app/tmp/sockets volumes: mysql: bundle: node_modules: tmp-data: Gemfileの編集 Gemfile. source 'https://rubygems.org' gem 'rails', '6.1.3.1' 少なって感じだけど、 source 'https://rubygems.org'で大体必要なgem達は引っ張ってきてくれるみたいなので大丈夫。     .envファイルの編集 env. MYSQL_ROOT_PASSWORD=password TZ=Japan entrypoint.shの編集 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"       参考記事 【Dockerで環境構築】Rails 6 & MySQL 8   
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【21.04.09】DockerでRails6 x MySQL8の環境構築

Docker公式リファレンス バージョン指定について RailsもRubyもMySQLも基本「これから開発するよ!」って時はその時の最新版を指定すればokです。 ・既存コードに関して改修をする ・保守する場合 時には、バージョンの変更はリスクなので、固定する方がよいらしいです。 ・DockerhubにあるMySQLのimageはこちら ・DockerhubにあるRubyのimageはこちら 私の環境 % sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H524 作業の流れ STEP1. 各種ファイルの用意 STEP2. rails new でアプリ作成 STEP3. イメージのビルド STEP4. database.yml の設定と DB 接続 STEP5. コンテナ起動 STEP1. まずは必要ファイルを作っていきます。 プロジェクトファイルを新規作成 & その下に移動 terminal. mkdir projectfile && cd projectfile 必須6ファイルを一気に新規作成 terminal. %touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh,.env} ※ここでターミナルで%lsで見てみても、.envファイルが見当たらないと思いますが、ちゃんと作られてるのでご安心を。 Dockerfileの編集 ここまでできたらvimでDockerfileを開いて以下をコピペ % vi Dockerfileで開けます。 ※Dockerfile=Docker imageを作るための設計書 ※Dockerfileのコマンドについては公式リファレンスのこちらを参照してください。 dockerfile. FROM ruby:3.0.1 ENV LANG C.UTF-8 ENV APP_ROOT /app # install required libraries 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 && \ apt-get update -qq && \ apt-get install -y --no-install-recommends \ build-essential \ nodejs \ yarn && \ apt-get clean && \ rm --recursive --force /var/lib/apt/lists/* # create working directory RUN mkdir $APP_ROOT WORKDIR $APP_ROOT # bundle install COPY Gemfile $APP_ROOT/Gemfile COPY Gemfile.lock $APP_ROOT/Gemfile.lock RUN bundle install --jobs 4 --retry 3 # create app in container COPY . $APP_ROOT # script to be executed every time the container starts COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process CMD ["rails", "server", "-b", "0.0.0.0"] ・curlコマンド=サーバから、もしくはサーバへデータ転送を行うコマンド docker-compose.ymlの編集 docker-compose.yml version: '3.7' services: db: image: mysql:8.0.20 volumes: - mysql:/var/lib/mysql:delegated ports: - '3307:3306' command: --default-authentication-plugin=mysql_native_password env_file: .env web: build: context: . dockerfile: Dockerfile command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" tty: true stdin_open: true env_file: .env depends_on: - db ports: - '3000:3000' volumes: - .:/app:cached - bundle:/usr/local/bundle:delegated - node_modules:/app/node_modules - tmp-data:/app/tmp/sockets volumes: mysql: bundle: node_modules: tmp-data: Gemfileの編集 Gemfile. source 'https://rubygems.org' gem 'rails', '6.1.3.1' 少なって感じだけど、 source 'https://rubygems.org'で大体必要なgem達は引っ張ってきてくれるみたいなので大丈夫。     .envファイルの編集 .envファイル=秘密鍵などを隠しておくためのファイルです。 env. MYSQL_ROOT_PASSWORD=password TZ=Japan entrypoint.shの編集 普通にdockerを立てると、pidsファイルになんらかの数字が書き込まれてしまってエラーの原因(この記事みたいな)になります。 なので、それを事前に防いでおくためのコードをこのentrypoint.shに記述しておきます。 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"    STEP2. Docker上でrails new terminal. docker-compose run --rm web rails new . --force --no-deps --database=mysql --skip-turbolinks --skip-test docker-compose run --rm web bin/rails webpacker:install (↑のコマンドdocker-compose run --rm web rails new . --force --no-deps --database=mysql --skip-turbolinks --skip-test --webpackerだけでできる気がする) たくさんファイルができました! terminal. % ls Dockerfile config package.json Gemfile config.ru postcss.config.js Gemfile.lock db public README.md docker-compose.yml storage Rakefile entrypoint.sh tmp app lib vendor babel.config.js log yarn.lock bin node_modules STEP3. config/database.ymlを編集 config/database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('MYSQL_USERNAME') { 'root' } %> password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %> host: <%= ENV.fetch('MYSQL_HOST') { 'db' } %> development: <<: *default database: rails_app_dev test: <<: *default database: rails_app_test production: <<: *default database: rails_app_prd username: app password: hoge   Dockerイメージをビルドし、DB作成 docker-compose build docker-compose run web bin/rails db:create コンテナを起動 docker-compose up -d Your're on Rails!が出たら成功! 補足 docker上でRails開発をする時のコマンドたち terminal. $ docker-compose run web bundle exec rails コマンド モデルの作成 terminal. docker-compose run web bundle exec rails g model User コントローラの作成 terminal. docker-compose run web bundle exec rails g controller Homepages index terminal. docker-compose run web bundle exec rails g rspec:install Docker上でMySQLに接続する方法 参考記事: 【Docker×MySQL】Docker環境下でMySQLコンテナに接続する方法(テーブル情報を確認) docker psでdbコンテナの名前を確認。(※以下の場合は、上から2つめのコンテナのproject_file_db_1が名前) % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7de3cc82f8db project_file_web "entrypoint.sh bash …" 14 minutes ago Up 14 minutes 0.0.0.0:3000->3000/tcp project_file_web_1 026f77ef5f58 mysql:8.0.20 "docker-entrypoint.s…" 2 hours ago Up 2 hours 33060/tcp, 0.0.0.0:3307->3306/tcp project_file_db_1 以下のコマンドでMySQLコンテナに接続(project_file_db_1の所は各自のDBコンテナ名にしてください) 前述した % docker exec -it project_file_db_1 bash root@026f77ef5f58:/# 接続できたらMySQLにアクセス。 root@026f77ef5f58:/#mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) root@026f77ef5f58:/# 参考記事 【Dockerで環境構築】Rails 6 & MySQL 8 【Rails】Rails 6.0 x Docker x MySQLで環境構築
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【21.04.09】DockerでRails6 x MySQL8で開発環境を構築する

Docker公式リファレンス バージョン指定について RailsもRubyもMySQLも基本「これから開発するよ!」って時はその時の最新版を指定すればokです。 ・既存コードに関して改修をする ・保守する場合 時には、バージョンの変更はリスクなので、固定する方がよいらしいです。 ・DockerhubにあるMySQLのimageはこちら ・DockerhubにあるRubyのimageはこちら 私の環境 % sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H524 作業の流れ STEP1. 各種ファイルの用意 STEP2. rails new でアプリ作成 STEP3. イメージのビルド STEP4. database.yml の設定と DB 接続 STEP5. コンテナ起動 STEP1. まずは必要ファイルを作っていきます。 プロジェクトファイルを新規作成 & その下に移動 terminal. mkdir projectfile && cd projectfile 必須6ファイルを一気に新規作成 terminal. %touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh,.env} ※ここでターミナルで%lsで見てみても、.envファイルが見当たらないと思いますが、ちゃんと作られてるのでご安心を。 Dockerfileの編集 ここまでできたらvimでDockerfileを開いて以下をコピペ % vi Dockerfileで開けます。 ※Dockerfile=Docker imageを作るための設計書 ※Dockerfileのコマンドについては公式リファレンスのこちらを参照してください。 dockerfile. FROM ruby:3.0.1 ENV LANG C.UTF-8 ENV APP_ROOT /app # install required libraries 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 && \ apt-get update -qq && \ apt-get install -y --no-install-recommends \ build-essential \ nodejs \ yarn && \ apt-get clean && \ rm --recursive --force /var/lib/apt/lists/* # create working directory RUN mkdir $APP_ROOT WORKDIR $APP_ROOT # bundle install COPY Gemfile $APP_ROOT/Gemfile COPY Gemfile.lock $APP_ROOT/Gemfile.lock RUN bundle install --jobs 4 --retry 3 # create app in container COPY . $APP_ROOT # script to be executed every time the container starts COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process CMD ["rails", "server", "-b", "0.0.0.0"] ・curlコマンド=サーバから、もしくはサーバへデータ転送を行うコマンド docker-compose.ymlの編集 docker-compose.yml version: '3.7' services: db: image: mysql:8.0.20 volumes: - mysql:/var/lib/mysql:delegated ports: - '3307:3306' command: --default-authentication-plugin=mysql_native_password env_file: .env web: build: context: . dockerfile: Dockerfile command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" tty: true stdin_open: true env_file: .env depends_on: - db ports: - '3000:3000' volumes: - .:/app:cached - bundle:/usr/local/bundle:delegated - node_modules:/app/node_modules - tmp-data:/app/tmp/sockets volumes: mysql: bundle: node_modules: tmp-data: Gemfileの編集 Gemfile. source 'https://rubygems.org' gem 'rails', '6.1.3.1' 少なって感じだけど、 source 'https://rubygems.org'で大体必要なgem達は引っ張ってきてくれるみたいなので大丈夫。     .envファイルの編集 .envファイル=秘密鍵などを隠しておくためのファイルです。 env. MYSQL_ROOT_PASSWORD=password TZ=Japan entrypoint.shの編集 普通にdockerを立てると、pidsファイルになんらかの数字が書き込まれてしまってエラーの原因(この記事みたいな)になります。 なので、それを事前に防いでおくためのコードをこのentrypoint.shに記述しておきます。 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"    STEP2. Docker上でrails new terminal. docker-compose run --rm web rails new . --force --no-deps --database=mysql --skip-turbolinks --skip-test docker-compose run --rm web bin/rails webpacker:install (↑のコマンドdocker-compose run --rm web rails new . --force --no-deps --database=mysql --skip-turbolinks --skip-test --webpackerだけでできる気がする) たくさんファイルができました! terminal. % ls Dockerfile config package.json Gemfile config.ru postcss.config.js Gemfile.lock db public README.md docker-compose.yml storage Rakefile entrypoint.sh tmp app lib vendor babel.config.js log yarn.lock bin node_modules STEP3. config/database.ymlを編集 ↓のpasswordなどは任意で登録。 config/database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('MYSQL_USERNAME') { 'root' } %> password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %> host: <%= ENV.fetch('MYSQL_HOST') { 'db' } %> development: <<: *default database: rails_app_dev test: <<: *default database: rails_app_test production: <<: *default database: rails_app_prd username: app password: hoge ↑ここでusernameをappじゃなく、サービス名にしておくと吉。 Dockerイメージをビルドし、DB作成 docker-compose build docker-compose run web bin/rails db:create コンテナを起動 docker-compose up -d Your're on Rails!が出たら成功! 補足 docker上でRails開発をする時のコマンドたち terminal. $ docker-compose run web bundle exec rails コマンド モデルの作成 terminal. docker-compose run web bundle exec rails g model User コントローラの作成 terminal. docker-compose run web bundle exec rails g controller Homepages index terminal. docker-compose run web bundle exec rails g rspec:install Docker上でMySQLに接続する方法 参考記事: 【Docker×MySQL】Docker環境下でMySQLコンテナに接続する方法(テーブル情報を確認) docker psでdbコンテナの名前を確認。(※以下の場合は、上から2つめのコンテナのproject_file_db_1が名前) % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7de3cc82f8db project_file_web "entrypoint.sh bash …" 14 minutes ago Up 14 minutes 0.0.0.0:3000->3000/tcp project_file_web_1 026f77ef5f58 mysql:8.0.20 "docker-entrypoint.s…" 2 hours ago Up 2 hours 33060/tcp, 0.0.0.0:3307->3306/tcp project_file_db_1 以下のコマンドでMySQLコンテナに接続(project_file_db_1の所は各自のDBコンテナ名にしてください) 前述した % docker exec -it project_file_db_1 bash root@026f77ef5f58:/# 接続できたらMySQLにアクセス。 root@026f77ef5f58:/#mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) root@026f77ef5f58:/# 参考記事 【Dockerで環境構築】Rails 6 & MySQL 8 【Rails】Rails 6.0 x Docker x MySQLで環境構築
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails6】初心者が見様見真似でDockerとCircleCIを既存Railsアプリに導入した結果…

アプリの環境 rails6.0.3.6 ruby2.6.5 bundler2.1.4 mysql5.6 最初に…僕なりのイメージ 実装してみた感じこういうイメージで捉えておくと良さそう Docker関係 Dockerfile…仮想コンテナの環境構築をするファイル。 docker componse build するとここに書いてあるコマンドが実行される。 docker-compose.yml…仮想コンテナで使用するDBなど詳細設定を行うファイル。 docker compose up をするとここに書いてある内容を元にアプリが立ち上がる entrypoint.sh…仮想環境を立ち上げる際に最初に読み込まれる内容を決めるファイル CircleCI関係 config.yml…Githubへのpushが行われた際にここに書いてある内容が順に実行される。手順書的な感じ。雰囲気だけはDockerfileに近い 【Docker編】やったこと https://qiita.com/Tomohisa_koyama/items/5f2d32fd0677aa244b72 こちらにruby, rails, mysqlともに同じバージョンのものを発見しましたのでこれを参考にしました。 FROM ruby:2.6.5 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 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN gem install bundler # これがないとbundlerがないって言われる RUN bundle install COPY . /myapp COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] 参考サイトとの違いは gem install bundler を実行しているか否か。これは以下サイトを参考にしました。 https://qiita.com/kenz-dev/items/e3d970b59bf106cab19e docker-compose.yml 参考サイト通りです。 version: "3" services: db: image: mysql:5.6.47 env_file: database.env ports: - "3306:3306" volumes: - ./db/mysql/volumes:/var/lib/mysql web: env_file: web.env build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" stdin_open: true tty: true volumes: - .:/myapp - gem_data:/usr/local/bundle ports: - "3000:3000" depends_on: - db volumes: mysql_data: gem_data: 【追記】 環境変数が読み込めなくてエラーが起こったので以下サイトを参考に外部ファイルから読み込めるよう設定しました。 https://qiita.com/KEINOS/items/518610bc2fdf5999acf2 mysql周りで必要な設定 以下を参考にやりました。 https://qiita.com/nanakenashi/items/180941699dc7ba9d0922 気をつけるべきはMYSQL_ROOT_PASSWORDが必須であることでしょう。 ローカルではパスワードなしでもrootユーザー動かせますがdockerの場合はpasswordなしだと docker-compose upのときにエラーが出ます。 entrypoint.sh 参考サイト通り #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" この時点で docker compose build docker compose up をすると仮想環境が立ち上がるはずです。 【CircleCI編】やったこと CircleCIはちょっと複雑でした。 どうやら事前にcommandオプションで実行する内容を定義してからstepsを書く、というのもあるみたいですね?? https://qiita.com/AK4747471/items/b2161784065f21cd1645 こちらのサイトがconfig.ymlの記述自体は理解しやすかったのでこれを基準にカスタマイズしました。 config.yml version: 2.1 orbs: slack: circleci/slack@4.3.0 jobs: build: docker: - image: circleci/ruby:2.6.5-node-browsers environment: - BUNDLER_VERSION: 2.1.4 - RAILS_ENV: 'test' - image: circleci/mysql:5.6 environment: - MYSQL_ALLOW_EMPTY_PASSWORD: 'true' - MYSQL_ROOT_HOST: '127.0.0.1' working_directory: ~/sample_app steps: - checkout - restore_cache: keys: - v1-dependencies-{{ checksum "Gemfile.lock" }} - v1-dependencies- - run: name: install dependencies command: | gem install bundler -v 2.1.4 bundle install --jobs=4 --retry=3 --path vendor/bundle - save_cache: paths: - ./vendor/bundle key: v1-dependencies-{{ checksum "Gemfile.lock" }} # database setup - run: mv ./config/database.yml.ci ./config/database.yml # database setup - run: name: setup database command: | bundle exec rake db:create bundle exec rake db:schema:load # install yarn - run: name: install yarn command: yarn install #run rubocop - run: name: Rubocop command: | bundle exec rubocop -a bundle exec rubocop -A # run tests - run: name: run rspec command: bundle exec rspec # collect reports - store_test_results: path: /tmp/test-results - store_artifacts: path: /tmp/test-results destination: test-results - slack/notify: event: fail mentions: '@ユーザー名' template: basic_fail_1 - slack/notify: event: pass mentions: '@ユーザー名' template: basic_success_1 このymlファイルを使うと以下を実行できます。 自動コード整形(rubocop) 自動テスト(rspec) Slackへの通知 苦労した点 特段難しい箇所はなかったですが、CircleCIからSlackへの通知がなかなか飛ばなくて苦戦しました。 Slackへの通知は以下URLから公式の情報を元にやりましょう。というのも昨年あたりにSlackとCircleCIの連携方法が変更になったこともあり、 古い情報を載せているブログなどもあるためです。簡単に言うと、Webhookを使った連携が昔のやり方で、今はOAuthを使って連携しているようです。 SlackAppでcircleciと検索すると公式のアプリが出てきますが、それはもう使われていない?ようです。 細かいカスタマイズとかは以下URLが詳しいです。最初はとりあえずtemplateでいいと思いますが、jobsが失敗したときだけ通知したいとかそういう場合は別途設定が必要なので徐々にカスタマイズしていきましょう。 あとは、環境変数の設定が必要になるのですがどこからやるのか記載がなくちょっと探しました。 Project Setting→Environment Variablesと進むと環境変数をまとめて設定できます。Rspec実行時に必要な環境変数もここで設定しましょう。 最後に 初めてのCI導入でしたがいざ導入してみると非常に便利で感動しました。もっと早くしっておけばよかったです。 特に感動したポイントは 毎回rubocopとテストの実行を自動でやってくれるのでコードの管理の手間が省ける rubocopとテストの実行を抜けもれなくやってくれるのであとになってやり直しをしなくて済む Circle CIが頑張ってくれている間に他の作業ができる といったあたりです。チームで開発しているとコードレビューの手間も省けそうですよね! 以上、参考になれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む