- 投稿日:2020-01-25T23:27:06+09:00
CentOS7 Docker + Docker Compose のインストール
この記事に書かれている事
CentOS7 への Docker 及び Docker-compose のインストール
- SeLinuxの無効化
いろいろと制限が出るから無効化しちゃいましょう。- Dockerのインストール
- 動作確認
- Docker Composeのインストール
しばらく触らないと忘れちゃうので備忘録として、、、
SeLinuxの無効化
- コマンドで監視モードに変更
- 再起動後は無効化されるように設定ファイルを変更
[user01@cent7 ~] getenforce Enforcing [user01@cent7 ~] sudo setenforce 0 [user01@cent7 ~] getenforce Permissive [user01@cent7 ~] sudo vi /etc/sysconfig/selinux # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. ##SELINUX=enforcing SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted [user01@cent7 ~]Dcokerのインストール
古いモジュールの削除
以前インストールしていたら古いモジュールを削除しましょう。
[user01@centos7 ~]$ sudo yum remove docker \ > docker-client \ > docker-client-latest \ > docker-common \ > docker-latest \ > docker-latest-logrotate \ > docker-logrotate \ > docker-engine \ > docker-engine-selinux [user01@centos7 ~]$ sudo rm /etc/yum.repos.d/docker.repo必要な関連パッケージをインストール
[user01@centos7 ~]$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2Dockerのインストール
- Docker リポジトリを追加
- Docker インストール
[user01@centos7 ~]$ sudo yum-config-manager \ --add-repo https://download.docker.com/linux/centos/docker-ce.repo [user01@centos7 ~]$ sudo yum install docker-ce docker-ce-cli containerd.ioDocker管理者をdockerグループに追加
グループ docker に参加させることで sudo せずに dockerコマンドを実行できるようになります。
この設定をしなくてもsudoすれば良いだけなので必要に応じて任意で実行してください。
以下の設定例では $USER (ログイン中のユーザ) をDocker管理者に追加しています。[user01@centos7 ~]$ LANG=C man usermod [user01@centos7 ~]$ sudo usermod -aG docker $USER [sudo] user01 のパスワード: [user01@centos7 ~]$ id $USER uid=1000(user01) gid=1000(user01) groups=1000(user01),10(wheel),980(docker) [user01@centos7 ~]$usermod -a の瀬説明は LANG=ja_JP.UTF-8 では出てきません。
LANG=Cで確認してください。動作確認
- Docker の起動
- Docker 自動起動設定
- 動作確認
[user01@centos7 ~]$ sudo systemctl start docker [user01@centos7 ~]$ sudo systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. [user01@centos7 ~]$ sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since 土 2019-03-09 12:16:43 JST; 17s ago Docs: https://docs.docker.com Main PID: 12648 (dockerd) CGroup: /system.slice/docker.service mq12648 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.470344031+09:00" level=info msg="[graphdriver] using prior storage driver: overlay" 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.470393144+09:00" level=warning msg="[graphdriver] WARNING: the overlay st... release" 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.474175363+09:00" level=info msg="Graph migration to content-addressabilit... seconds" 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.475348040+09:00" level=info msg="Loading containers: start." 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.076457928+09:00" level=info msg="Default bridge (docker0) is assigned wit... address" 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.342253505+09:00" level=info msg="Loading containers: done." 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.372317576+09:00" level=info msg="Docker daemon" commit=774a1f4 graphdrive...n=18.09.3 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.372423919+09:00" level=info msg="Daemon has completed initialization" 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.398960579+09:00" level=info msg="API listen on /var/run/docker.sock" 3月 09 12:16:43 centos7 systemd[1]: Started Docker Application Container Engine. Hint: Some lines were ellipsized, use -l to show in full. [user01@centos7 ~]$ [user01@centos7 ~]$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535 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:Docker Composeのインストール
とりあえず手順通りにインストール。変数の扱いに注意。
ただ、最新版をインストールしたい場合 github を参照し最新版のversionを確認して curl で指定する URLのバージョン番号を調整しましょう。依存パッケージの導入
alpine Linux の場合しか書いてないのでとりあえずスルー
Docker Compose のインストール
すごく簡単です。
- github のファイルをダウンロード
- 実行権限を付与
- 必要なら Link を作成
Install Docker Compose に書いてるコマンドサンプル(失敗します) [user01@cent7 ~]$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose こっちのコマンドを実行 [user01@cent7 ~]$ sudo curl -L https://github.com/docker/compose/releases/download/v1.25.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 0 617 0 0 1354 0 --:--:-- --:--:-- --:--:-- 1356 100 16.4M 100 16.4M 0 0 1328k 0 0:00:12 0:00:12 --:--:-- 1676k [user01@cent7 ~]$ sudo chmod +x /usr/local/bin/docker-compose [user01@cent7 ~]$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
- 投稿日:2020-01-25T23:17:31+09:00
【Docker】Qiita 週間いいね数ランキング【タグ別】
他のタグ
集計期間
01月18日 ~ 01月25日
いいね数ランキング
1位: 「procs:新しいプロセス表示・検索ツール」の更新紹介
Mac
Windows
Linux
Rust
Docker
35いいね
@dalanceさん(01月23日 16時28分の投稿)2位: Laradockを使ってLaravel環境を構築した
PHP
Laravel
Docker
docker-compose
LaraDock
17いいね
@inagackyさん(01月20日 09時37分の投稿)3位: 2020年の開発者が知っておくべき11の必須技能→回答編 → 並べ替え→項目合併(8項目)→内容追記
Python
Git
Docker
自己評価
13いいね
@kaizen_nagoyaさん(01月22日 02時33分の投稿)4位: 【スターターキット】Scrapy&MariaDB&Django&Dockerでデータ自動収集ボットシステムを構築する
Python
Django
mariadb
Docker
Scrapy
9いいね
@Makotunesさん(01月20日 16時17分の投稿)5位: DockerとSELinux
SELinux
Docker
5いいね
@ttt_okamotoさん(01月24日 07時33分の投稿)6位: 『フカシギの数え方』 おねえさんといっしょ:組み合わせ爆発の凄さ
Python
Docker
graphillion
数え上げ
組み合わせ爆発
5いいね
@kaizen_nagoyaさん(01月21日 02時23分の投稿)7位: DjangoアプリをDocker上に構築しAWS Fargateにデプロイする
Python
Django
AWS
Docker
Fargate
4いいね
@keita_gawaharaさん(01月23日 13時05分の投稿)8位: Autosar文書を読む(準備)
英語
Docker
規格
AUTOSAR
略号
4いいね
@kaizen_nagoyaさん(01月19日 12時59分の投稿)9位: Dockerで入れたPostgreSQLへのPDO接続でエラーが出て悩んだ。
PHP
PostgreSQL
PDO
Docker
docker-compose
2いいね
@jiiiimyさん(01月23日 04時48分の投稿)10位: Macのlocalhost上で動作しているサービスへDocker内部から接続する方法
Mac
Docker
2いいね
@falconwsさん(01月22日 14時54分の投稿)11位: Docker DesktopのGUIにダッシュボードが搭載されてコンテナやボリュームがわかりやすくなったぞ
Docker
2いいね
@ko1nksmさん(01月22日 03時13分の投稿)12位: pip3ベースでデータサイエンス環境を作るためのDockerfile
Python
pip
Docker
dockerfile
pip3
2いいね
@hanonさん(01月20日 16時02分の投稿)13位: 【初学者向け】セキュリティ対策入門②〜SQLインジェクション編〜
PHP
初心者
セキュリティ
Docker
2いいね
@junkimatsudaさん(01月20日 12時33分の投稿)14位: Laravelの開発環境3つとそれぞれのメリット、デメリット
PHP
Vagrant
Laravel
Docker
2いいね
@falconwsさん(01月20日 10時46分の投稿)15位: Docker x 可視化がうまくいかずハマったのでまとめてみた!
Python
Linux
Ubuntu
OpenCV
Docker
2いいね
@oreyutaroverさん(01月19日 23時55分の投稿)16位: Kubernetesの構築
Docker
kubernetes
2いいね
@nozomi-nishinoharaさん(01月19日 08時13分の投稿)17位: DockerでTesseractの環境を構築してみた。。。
環境構築
Docker
tesseract-ocr
2いいね
@penpentaさん(01月19日 05時24分の投稿)18位: [Docker入門]コンテナにsshでアクセスするための設定メモ
SSH
初心者
入門
Docker
コンテナ
2いいね
@kuboshu83さん(01月19日 05時11分の投稿)19位: GCP+DockerでHTTPSな静的ページを公開する
Docker
HTTPS
googlecomputeengine
gcp
2いいね
@kotaroooo0さん(01月19日 04時07分の投稿)20位: DockerでDBの設定が完了するまでアプリケーションのコンテナを立ち上げないようにしようとしたらハマった
ShellScript
Django
mariadb
Docker
docker-compose
1いいね
@keii1111さん(01月25日 08時24分の投稿)21位: [イメージ図付]Nginx+gunicorn+FlaskをDocker化[前編]
Python
nginx
Flask
Docker
dockerfile
1いいね
@mintak21さん(01月24日 13時26分の投稿)22位: Dockerを使って数分でOpenCV&Python環境を構築して試す
Python
OpenCV
Docker
Python3
1いいね
@hashitoさん(01月24日 00時08分の投稿)23位: DockerでHello,World
Python
Docker
1いいね
@keita_gawaharaさん(01月23日 11時50分の投稿)24位: WSL1でDocker使いたい
Docker
1いいね
@nabさん(01月23日 04時17分の投稿)25位: SpringBootでグループウェアの開発③〜DB接続の続き〜
Docker
MyBatis
SpringBoot
MySQL8.0
1いいね
@r_saikiさん(01月22日 15時55分の投稿)26位: 外部からGCE上のDockerコンテナ内のMySQLへ接続
WordPress
MySQL
SSH
Docker
gce
1いいね
@awesomestさん(01月22日 08時41分の投稿)27位: LaravelのDockerでX-debugを有効にする
PhpStorm
xdebug
Laravel
Docker
1いいね
@dabiddoさん(01月22日 07時53分の投稿)28位: Dockerを使って簡単にローカルtomcat環境を作る
Docker
docker-compose
1いいね
@hikarurightさん(01月22日 01時06分の投稿)29位: SpringBootでグループウェアの開発②〜DB接続〜
Docker
SpringBoot
MySQL8.0
1いいね
@r_saikiさん(01月21日 14時32分の投稿)30位: Docker上のFlask + Nginxでコンソールにログを出力する
Python
nginx
Flask
uwsgi
Docker
1いいね
@shin1103@githubさん(01月21日 07時20分の投稿)31位: Docker MySQLのバージョン変更する方法
MySQL
Laravel
Docker
LaraDock
1いいね
@tsurutadesuさん(01月20日 11時54分の投稿)32位: GitBucketをMySQL8で立ち上げるdocker-composeファイル
Docker
GitBucket
docker-compose
MySQL8.0
1いいね
@bunaImageさん(01月20日 06時11分の投稿)33位: ラズパイ・ウェブ地図の作り方
geo
RaspberryPi
Docker
1いいね
@hfuさん(01月19日 21時26分の投稿)34位: Windows10 HomeでのDockerを使ったpython環境構築手順メモ
Python
Windows
環境構築
Docker
1いいね
@feketerigo210さん(01月19日 14時04分の投稿)35位: DockerでMediaWikiとVisualEditorを入れたログ
mediawiki
Docker
1いいね
@MirrgieRianaさん(01月19日 12時28分の投稿)36位: pip環境のdockerでjupyter notebookを使いたかった(opticspy)
Python
pip
Docker
Python3
Jupyter
1いいね
@YamKentaさん(01月19日 06時28分の投稿)37位: k8s環境ハンズオン webアプリケーション構築実践編
Docker
kubernetes
1いいね
@gamelike319さん(01月19日 04時55分の投稿)38位: TruffleBox (React&Truffle)を用いたDockerでのdapps(ブロックチェーンアプリ)の開発環境の構築
Docker
React
ブロックチェーン
truffle
DApps
1いいね
@dl10yrさん(01月19日 03時55分の投稿)
- 投稿日:2020-01-25T23:17:31+09:00
【Docker】Qiita 週間いいね数ランキング【自動更新】
他のタグ
集計期間
01月20日 ~ 01月27日
いいね数ランキング
1位: DockerとSELinux
SELinux
Docker
59いいね
@ttt_okamotoさん(01月24日 16時33分の投稿)2位: 「procs:新しいプロセス表示・検索ツール」の更新紹介
Mac
Windows
Linux
Rust
Docker
42いいね
@dalanceさん(01月24日 01時28分の投稿)3位: 2020年の開発者が知っておくべき11の必須技能→回答編 → 並べ替え→項目合併(8項目)→内容追記
Python
Git
Docker
自己評価
13いいね
@kaizen_nagoyaさん(01月22日 11時33分の投稿)4位: 『フカシギの数え方』 おねえさんといっしょ:組み合わせ爆発の凄さ: docker(111)
Python
Docker
graphillion
数え上げ
組み合わせ爆発
5いいね
@kaizen_nagoyaさん(01月21日 11時23分の投稿)5位: アラフォーのおっさんが一ヶ月でWebサービスを作った話
Go
Docker
React
文字認識
TensorFlow
4いいね
@othAnさん(01月26日 12時00分の投稿)6位: DjangoアプリをDocker上に構築しAWS Fargateにデプロイする
Python
Django
AWS
Docker
Fargate
4いいね
@keita_gawaharaさん(01月23日 22時05分の投稿)7位: 機械学習したデーターを爆速で販売するサービスをDockerで構築してみた
Python
Flask
Express
Docker
nuxt.js
3いいね
@masamunetさん(01月27日 15時50分の投稿)8位: Docker for Windows で Kubernetesが起動しないときのトラブルシューティング
Docker
kubernetes
docker-for-windows
3いいね
@ynottさん(01月26日 09時03分の投稿)9位: LaravelのインフラをDockerで作ってみた
Laravel
Docker
2いいね
@moyashimanjyuさん(01月27日 12時22分の投稿)10位: CentOS7 Docker + Docker Compose のインストール
CentOS
Docker
centos7
docker-compose
2いいね
@kichiseさん(01月25日 23時27分の投稿)11位: [イメージ図付]Nginx+gunicorn+FlaskをDocker化[前編]
Python
nginx
Flask
Docker
dockerfile
2いいね
@mintak21さん(01月24日 22時26分の投稿)12位: Dockerで入れたPostgreSQLへのPDO接続でエラーが出て悩んだ。
PHP
PostgreSQL
PDO
Docker
docker-compose
2いいね
@jiiiimyさん(01月23日 13時48分の投稿)13位: Macのlocalhost上で動作しているサービスへDocker内部から接続する方法
Mac
Docker
2いいね
@falconwsさん(01月22日 23時54分の投稿)14位: docker-compose で Cloud Datastore Emulatorを立ち上げpythonアプリと連携する
Python
Docker
datastore
gcp
docker-compose
2いいね
@komtakiさん(01月22日 23時29分の投稿)15位: Docker DesktopのGUIにダッシュボードが搭載されてコンテナやボリュームがわかりやすくなったぞ
Docker
2いいね
@ko1nksmさん(01月22日 12時13分の投稿)16位: [Docker入門]勉強して得られたDockerの知見を色々まとめてみた(Windows・Python)
Python
Linux
初心者
Docker
Python3
1いいね
@simonritchieさん(01月27日 08時13分の投稿)17位: DockerでMysqlコンテナを作る
MySQL
Docker
1いいね
@h0geさん(01月26日 22時03分の投稿)18位: 簡単なForm作成から学ぶVue(TypeScript)の書き方 その0 環境構築編
Docker
Vue.js
1いいね
@Kept1994さん(01月26日 21時45分の投稿)19位: コード内で環境名 (dev,stg,prod) を使用しないことのすすめ
JavaScript
Node.js
Docker
サーバー
環境変数
1いいね
@ku6ryoさん(01月26日 17時26分の投稿)20位: GoとRedisでAPIを実装する (Part.1)
Go
Redis
nosql
Docker
docker-compose
1いいね
@Moreroさん(01月26日 15時19分の投稿)21位: 【Docker】Qiita 週間いいね数ランキング【自動更新】
Docker
1いいね
@kou_pg_0131さん(01月25日 23時17分の投稿)22位: DockerでDBの設定が完了するまでアプリケーションのコンテナを立ち上げないようにしようとしたらハマった
ShellScript
Django
mariadb
Docker
docker-compose
1いいね
@keii1111さん(01月25日 17時24分の投稿)23位: nuxt dockerで使う個人的な設定
Docker
nuxt.js
hot-reload
1いいね
@nicelandさん(01月25日 10時05分の投稿)24位: Dockerを使って数分でOpenCV&Python環境を構築して試す
Python
OpenCV
Docker
Python3
1いいね
@hashitoさん(01月24日 09時08分の投稿)25位: DockerでHello,World
Python
Docker
1いいね
@keita_gawaharaさん(01月23日 20時50分の投稿)26位: WSL1でDocker使いたい
Docker
1いいね
@nabさん(01月23日 13時17分の投稿)27位: SpringBootでグループウェアの開発③〜DB接続の続き〜
Docker
MyBatis
SpringBoot
MySQL8.0
1いいね
@r_saikiさん(01月23日 00時55分の投稿)28位: 外部からGCE上のDockerコンテナ内のMySQLへ接続
WordPress
MySQL
SSH
Docker
gce
1いいね
@awesomestさん(01月22日 17時41分の投稿)29位: LaravelのDockerでX-debugを有効にする
PhpStorm
xdebug
Laravel
Docker
1いいね
@dabiddoさん(01月22日 16時53分の投稿)30位: Dockerを使って簡単にローカルtomcat環境を作る
Docker
docker-compose
1いいね
@hikarurightさん(01月22日 10時06分の投稿)31位: SpringBootでグループウェアの開発②〜DB接続〜
Docker
SpringBoot
MySQL8.0
1いいね
@r_saikiさん(01月21日 23時32分の投稿)32位: Docker上のFlask + Nginxでコンソールにログを出力する
Python
nginx
Flask
uwsgi
Docker
1いいね
@shin1103@githubさん(01月21日 16時20分の投稿)
- 投稿日:2020-01-25T22:42:45+09:00
dockerで始めたNode-REDにnode-red-node-discoveryをインストールする
node-red-node-discoveryがインストールできない
「パレットの管理」からnode-red-node-discoveryノードをインストールしようとしても、失敗してしまった。
node-red-node-discovery - npm
にはplease read the install instructions for the underlying npm.
For Debian / Ubuntu this requires installing
sudo apt-get install libavahi-compat-libdnssd-devと書いてあるが、dockerで実行しているのでそもそもコマンドが実行できない…
その後もsudoコマンドがなかったり、apt-getがなかったりで色々苦労したので、メモを残しておく。インストール手順
dockerにrootでbashログインする。
docker exec -it --user root mynodered /bin/bashパッケージマネージャapkを使ってlibdnsをインストールする。
apk update apk apk add avahi-compat-libdns_sd avahi-devその後、Node-REDの「パレットの管理」からnode-red-node-discoveryがインストールできる。
追記
実行に失敗する
上記手順でインストールできて安心していたところ、discoverノードを使っても
Error: dns service error: unknown
となってしまい、実行に失敗してしまう。対処方法 募集中
avahi-discover
を実行してみて、エラーに関係しそうな以下パッケージをインストールしてみたapk add py-gtk py-dbus dbus py-avahi py-gdbm py-gobject py-gobject3 gtk+3.0が、
bash-5.0# avahi-discover Traceback (most recent call last): File "/usr/bin/avahi-discover", line 304, in <module> main() File "/usr/bin/avahi-discover", line 297, in main main_window = Main_window() File "/usr/bin/avahi-discover", line 70, in __init__ self.ui.add_from_file(path) gi.repository.GLib.Error: g-file-error-quark: Failed to open file “/usr/share/avahi/interfaces/avahi-discover.ui”: No such file or directory (4)の解決法がわからず断念。
- 投稿日:2020-01-25T20:56:31+09:00
docker-compose upを用いてDockerコンテナ上でDjangoを起動する
はじめに
docker-composeを用いてDockerコンテナ上でDjangoを起動させます。Macを使用します。
docker-composeを使う理由
Docknizeされたアプリケーションでは、データベースやミドルウェアのコンテナを分け、複数のコンテナでアプリケーションを構成することがあります。
それぞれのコンテナでDocker runを実行するのは面倒です。その際、docker-composeを用いると複数のコンテナを一つのコマンドで制御することが可能となります。
docker-composeはコンテナの振る舞いをdocker-compose.ymlに記載し制御します。機能毎にコンテナを分ける構成はAWSのチュートリアルでも紹介されておりマイクロサービスと呼ばれています。
マイクロサービスを意識した構成の利点としてはアプリケーションの開発やテストが機能ごとの小さな単位で実施できる事です。
また、各コンテナを疎結合として設計すると機能毎に独立した開発ができるため、他チームの作業を意識することなく開発、デプロイ、スケールさせることが可能です。
私の経験したスタートアップの開発でも、マイクロサービスを意識した設計をしたことで、並行した開発や小さな機能単位での検証や、テストができ便利でした。本記事はDjangoアプリをDocker上に構築しAWS Fargateにデプロイするプロジェクトの一部です。
Dcokerfileの作成
下準備として、Pipenvを用いて仮想環境にDjangoをインストールしてください。
詳細手順については別に記事を書いているのでリンクを参照してください。
https://qiita.com/keita_gawahara/items/487a635d226fb0705b13プロジェクトのルートフォルダにDockerfileを作成します。
$ touch DockerfileDockerfileに以下の内容を追記します。
FROM python:3.7-slim ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 WORKDIR / COPY Pipfile Pipfile.lock / RUN pip install pipenv && pipenv install --system COPY . /docker buildコマンドでDockerfileをビルドします。
$ docker build . Sending build context to Docker daemon 155.1kB ... Step 7/7 : COPY . / ---> d239897dhfii9u” Successfully built d26473003af$touch docker-compose.ymldocker-compose.ymlに以下の内容を追記します。
version: '3.7' services: web: build: . command: python manage.py runserver 0.0.0.0:8000 ports: - 8000:8000docker-compose up コマンドを用いてコンテナを起動します。
$ docker-compose up Creating network... ... web_1 | System check identified no issues (0 silenced). web_1 | July 13, 2019 - 16:47:03 web_1 | Django version 2.2.3, using settings 'hello_project.settings' web_1 | Starting development server at http://0.0.0.0:8000/ web_1 | Quit the server with CONTROL-C.http://127.0.0.1:8000 をブラウザで表示するとDjango welcome pageが表示されました。これでDocker上にDjangoを起動することができました。
CONTROL-Cで終了させたあとdocker-compose downを用いてコンテナを完全に停止させます。
$ docker-compose down
- 投稿日:2020-01-25T20:44:27+09:00
dockerの使用でメモリが不足していたら(windows)
- 投稿日:2020-01-25T18:12:25+09:00
Docker-composeでbundle installしてるのにgemの内容反映されないんですけど
注意事項
完全に個人用メモです。公式情報でもなんでもありません。ググってこの記事に来てしまった方はお気をつけください。違っていたら即直しますのでガンガンご指摘ください。(個人用メモなので追加もしていきます)
そもそもbundle installしたらサーバー再起動しろや
なので、gemfile編集してbundle installしたら以下のコマンド打てば良い(環境によるけど)
docker-compose restart
・・・コンテナ再起動そしたらGemの内容が反映されます。
docker勉強不足だって、はっきりわかんだね。
イメージをビルドしなおしたりコンテナ削除したりしなくて良い
dockerを理解してないと以下のようなコマンドを打ち始めます
docker-compose build
・・・イメージビルド
docker-compose up -d
・・・コンテナ作成&起動結果、コンテナが増えまくるわけです。(えぇ。。。)
コンテナやたら多いと思ったら原因これかよw(錯乱)
まあこの方法でも解決できるんですけどね。。
- 投稿日:2020-01-25T17:32:59+09:00
JetsonNano+Docker上のコンテナをホストマシンと同じセグメントに配置した時のメモ
Jetson Nano + Docker上のコンテナに、サーバを複数作ろうとしたときにコケたのでメモ。
難しく考えていたけど下の参考記事のおかげで結構簡単に解決できた。
というかたぶんこれがなかったら解決できなかった・・感謝しかない環境
- 開発キット:JetPack 4.3
- OS: 18.04.3 LTS
- Docker: 19.03.5
作りたいもの
DockerでJetson Nano上に複数サーバを構築して、あたかもホストマシンと同じセグメント上にいるかのように見せかけたいと思い、格闘しました。
単にポート変換でも行けると思うんですが、それだとあんまりイケてないなーと感じたので戦ってみました。ホストのネットワーク設定
まずはJetson Nanoのネットワーク(eth0)を確認します。
$ ifconfig ... eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 xxxx:xx:xxxx:xxxx:xxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x0<global> inet6 xxxxxxxxxxxxxxxxxxxx prefixlen 64 scopeid 0x20<link> ether xxxxxxxxxxxxxxxxx txqueuelen 1000 (Ethernet) RX packets 138314 bytes 105082864 (105.0 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 42142 bytes 3724547 (3.7 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 151 base 0x5000 ...Dockerのネットワーク設定(macvlan)
Dockerのnetworkコマンドでネットワークの一覧を確認できますが、インストール時に構成されるネットワーク設定では上の絵の環境は作成できません。
そこで、macvlanインターフェースを作成し、コンテナ起動時にそのネットワークを利用するよう設定します。
macvlanとは?
1つの物理NICに対して、仮想的なNICを複数作成することができる機能のようです。詳細は別の方の記事を参照。
Dockerのネットワーク作成
ホストのネットワーク設定をもとに、Docker createでネットワークを作成します。以下のコマンドは、Jetson Nanoのeth0上にmacvlanのネットワークを作成します。
# ネットワークの作成 $ docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 shared_nw # 作成したネットワークの確認 $ docker network inspect shared_nw [ { "Name": "shared_nw", "Id": "552a5787314480bd94c43582f7a46968d7bea985b93d7a90f3923a859be32e73", "Created": "2020-01-24T00:31:59.856134246+09:00", "Scope": "local", "Driver": "macvlan", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.1.0/24", "Gateway": "192.168.1.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": { "parent": "eth0" }, "Labels": {} } ]Dockerコンテナの起動
ネットワークが作成できたので、あとはこのネットワークを利用したコンテナを起動します。
例ということで、素のApacheサーバを192.168.1.12に起動させます。# Jetson Nanoと同じセグメント上のIP:192.168.1.12にWebサーバを起動 $ docker run -itd --net=shared_nw --ip=192.168.1.12 httpdWebブラウザでアクセスすると、よく見る「It Works!」を見ることができます。
制限事項
この方法でコンテナを起動した際、制限としてJetson Nanoからコンテナへのアクセスができなくなります。
(今回の場合、例えばJetson NanoからApacheサーバへWebブラウザを使ってアクセスができません)
これはmacvlanの機能上回避する方法はないみたいです。
- 投稿日:2020-01-25T17:32:24+09:00
DockerのMySQLコンテナにSequelProで接続する
docker-compose.yaml
docker-compose.yamlversion: "3" services: mysql: container_name: [MySQLのコンテナ名] image: mysql:5.7 environment: MYSQL_DATABASE: [データベース名] MYSQL_USER: [ユーザー名] MYSQL_PASSWORD: [パスワード] MYSQL_ROOT_PASSWORD: [パスワード] ports: - "4306:3306" volumes: - mysql-data:/var/lib/mysqlポート →
"4306:3306"
おそらくほとんどの人が、ローカルでMySQLを起動していると思います。特別に設定していなければ、
ローカルの3306番
のポートがMySQLに使われていると思います。なので、今回は、ローカルの4306番をMySQLコンテナの3306番と繋ぐように設定しています。
ターミナルからMySQLコンテナに入って確認する場合
MySQLコンテナに入ります。
ターミナル$ docker exec -it [MySQLのコンテナ名] bashコンテナに入れたら、MySQLに接続します。
ターミナル$ mysql -u root -p パスワードが要求されるので、入力して完了。ターミナルから直接MySQLコンテナに接続したい場合
ターミナル$ mysql -u root -p -h 127.0.0.1 -P 4306注意点は2つあり、
・ホストはlocalhostを使用せず、IPアドレスを直接入力する
・ポート番号を指定する際は、大文字のPを使用するSequelProで接続
- 投稿日:2020-01-25T17:24:07+09:00
DockerでDBの設定が完了するまでアプリケーションのコンテナを立ち上げないようにしようとしたらハマった
はじめに
個人的にDjangoの環境をDockerで一発で整えられるようにしたいので、いろいろ試行錯誤しています。
→GitHubリポジトリDockerでDBから何からまとめて管理しようとするときにはいくつかハマる箇所があると思いますが、そのひとつにDockerコンテナを立ち上げたときに、データベースの初期設定が完了してないのにアプリケーションコンテナがデータベースに接続しにいって失敗し、一生再起動し続けるというものがあります。
一見、アプリケーションコンテナ側の設定でdepends_onにデータベースを入れとけば良さそうですが、depends_onは起動順序のみを保証し、コンテナ内部の処理は全く感知してくれないので、自力で起動制御する必要があります。
参考:http://docs.docker.jp/compose/startup-order.htmlその対策を行う上でいくつかハマったところがあったのでご紹介します。
環境
- Django
- MariaDB
- nginx(今回は関係ない)
- gunicorn(今回は関係ない)
ハマったこと
- Debianのリポジトリからmysql-clientが消え去っていた
- bashでmysqlコマンドを打つときにダブルクォーテーションをうまく使えなかった
- docker-composeのentrypointで、wait-for-it.shを実行するとき、引数でコマンドを渡そうと思ったらうまく渡らなかった
基本的な戦略
- Djangoコンテナの起動時にshellscriptでMariaDBに対して疎通確認を行う
- まだ繋がらないなら待つ
- 繋がったらDjangoのコマンド実行!
1. Debianのリポジトリからmysql-clientが消え去っていた
文字通りです。最初はDjango用のコンテナにmysql-clientをインストールしてmysqlコマンドで疎通確認をしようとしていました。
DockerfileRUN apt-get update && apt-get install -y mysql-clientするとこんなエラーが、、、
E: Package 'mysql-client' has no installation candidate
調べてみるとDebianのリポジトリからmysql-clientが消えていました?
Debianリポジトリ:https://packages.debian.org/stable/database/
代わりにdefault-mysql-clientとmariadb-clientができていたので、mariadb-clientをインストールすることにしました。DockerfileRUN apt-get update && apt-get install -y mariadb-client2. bashでmysqlコマンドを打つときにダブルクォーテーションをうまく使えなかった
Dockerの公式サイトをみると、DBの準備が整うまで待つにはこうするといいよ!と書かれていました。
#!/bin/bash set -e host="$1" shift cmd="$@" until psql -h "$host" -U "postgres" -c '\l'; do >&2 echo "Postgres is unavailable - sleeping" sleep 1 done >&2 echo "Postgres is up - executing command" exec $cmdなのでPostgreSQLをMariaDB用に変えて以下のようにしていました。
wait-for-mariadb.sh#!/bin/bash set -e . ./mariadb.env #MariaDB用の環境ファイル host="$1" shift cmd="$@" until mysql -h "$host" -u "$MYSQL_USER" -p "$MYSQL_PASSWORD" -e "show databases;" "$MYSQL_DATABASE" ; do >&2 echo "MariaDB is unavailable -sleeping" sleep 1 done >&2 echo "MariaDB is up -executing command" exec $cmdまあこれが普通に間違いなんですが、、、
問題はuntilの行で、実際には以下のように実行されます(変数には適当に入れてます)。wait-for-mariadb.shmysql -h sample -u sampleuser -p samplepassword -e "show databases;" sampledatabasemysqlのコマンドでは、-optionなら引数をクォーテーションで囲う、--optionなら=でつなぐように書くので、これだと正しく実行されません。
参考:https://mariadb.com/kb/en/mysql-command-line-client/正しくは以下のように実行されなければいけません。
wait-for-mariadb.shmysql -h "sample" -u "sampleuser" -p "samplepassword" -e "show databases;" sampledatabaseこれで小一時間くらいハマり、原因がやっとわかったので、ダブルクォーテーションをエスケープすればいいと考えて、以下のように変えてみました。
wait-for-mariadb.sh~略~ until mysql -h "\"$host\"" -u "\"$MYSQL_USER\"" -p "\"$MYSQL_PASSWORD\"" -e "show databases;" "$MYSQL_DATABASE" ; do ~略~しかしこれでもうまくいかなかったので(だれか教えてください泣)、結局以下のようにしました。
wait-for-mariadb.sh~略~ until mysql --host="$host" --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" -e "show databases;" "$MYSQL_DATABASE" ; do ~略~3. docker-composeのentrypointで、wait-for-xxx.shを実行するとき、引数でコマンドを渡そうと思ったらうまく渡らなかった
最初、docker-composeの設定を以下のようにしていました。
docker-compose.ymlversion: '3' services: django: ~略~ entrypoint: ./wait-for-mariadb.sh mariadb "python manage.py migrate && gunicorn my_docker_django_project.wsgi -b 0.0.0.0:3031"これで2番目の引数にコマンドが渡って、それをそのまま実行すればいいと思ってました。
wait-for-mariadb.shshift cmd="$@" exec $cmdするとこんなエラーが?
django_1 | python manage.py migrate && gunicorn my_docker_django_project.wsgi -b 0.0.0.0:3031 django_1 | usage: manage.py migrate [-h] [--noinput] [--database DATABASE] [--fake] django_1 | [--fake-initial] [--plan] [--run-syncdb] [--version] django_1 | [-v {0,1,2,3}] [--settings SETTINGS] django_1 | [--pythonpath PYTHONPATH] [--traceback] [--no-color] django_1 | [--force-color] [--skip-checks] django_1 | [app_label] [migration_name] django_1 | manage.py migrate: error: unrecognized arguments: my_docker_django_project.wsgi -b 0.0.0.0:3031どうやら&&以降のgunicornコマンドがpython manage.py migrateの引数だと思われてるようです。。。
migrateしないとアプリケーションサーバは起動してほしくないので、結局以下のようにshellscriptにベタ書きすることにしました。wait-for-mariadb.sh#!/bin/bash set -e . ./mariadb.env host="$1" shift cmd="$@" until mysql --host="$host" --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" -e "show databases;" "$MYSQL_DATABASE" ; do >&2 echo "MariaDB is unavailable -sleeping" sleep 1 done >&2 echo "MariaDB is up -executing command" python manage.py migrate && gunicorn my_docker_django_project.wsgi -b 0.0.0.0:3031 exec $cmd最後に
よかったら定期的にGitHub更新していくので見ていってください:)
https://github.com/keii1111/my_docker_django参考情報
- 投稿日:2020-01-25T16:56:13+09:00
Docker + rails + mysqlで開発環境を構築
はじめに
今回は、railsの開発環境をDocker+rails+mysqlで用意します。
構成
構成はローカルのMacにDockerを立て、webとdbコンテナをdocker-composeで管理します。
開発環境
Docker 19.03.5
Ruby 2.6.5
Rails 5.2.4
MySQL 5.7.29前提条件
Macを利用
Docker Desktopをインストール
まずは、ローカルのMacにDocker Desktopをインストールします。
https://www.docker.com/get-started
「Download Desktop and Take a Tutorial」のボタンをクリックすると画面が遷移し、
アカウントがある人はログイン、ない人は「Sign Up」を押してアカウントを作成します。アカウント作成後、ログインし 「Get started with Docker Desktop」を押すと画面が遷移するので「Download Docker Desktop for Mac」を押しダウンロードします。
ダウンロード完了後、インストールします。
install後、Macのターミナルにてdocker versionと打ち、バージョンが出れば無事インストールは完了です。$ docker version Client: Docker Engine - Community Version: 19.03.5 API version: 1.40 Go version: go1.12.12 Git commit: 633a0ea Built: Wed Nov 13 07:22:34 2019 OS/Arch: darwin/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.5 API version: 1.40 (minimum version 1.12) Go version: go1.12.12 Git commit: 633a0ea Built: Wed Nov 13 07:29:19 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: v1.2.10 GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339 runc: Version: 1.0.0-rc8+dev GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657 docker-init: Version: 0.18.0 GitCommit: fec3683web(rails)コンテナの構築
開発を行うために任意の作業ディレクトリを作成します。
$ mkdir task_app/ $ cd task_appGemfileの準備
オプションでディレクトリのマウントを指定していることで、Docker環境で作成されたGemfileがローカル環境に作成されます。
$ docker run --rm -v `pwd`:/task_app -w /task_app ruby:2.6 bundle init Unable to find image 'ruby:2.6' locally 2.6: Pulling from library/ruby 8f0fdd3eaac0: Pull complete d918eaefd9de: Pull complete 43bf3e3107f5: Pull complete 27622921edb2: Pull complete dcfa0aa1ae2c: Pull complete 0e1f1dc37f65: Pull complete c76a82442849: Pull complete 5161fd3df3c4: Pull complete Digest: sha256:f38fce2b70ba23e90d6397995bea8419b86dd3f20b73846681adb52c63c0b002 Status: Downloaded newer image for ruby:2.6 Writing new Gemfile to /task_app/GemfileGemfileがローカルに作成されますので、railsのバージョンを指定します。
利用したいバージョンに合わせて適宜修正してください。$ vi Gemfile # gem "rails" gem 'rails', '~> 5.2.3'Dockerイメージの作成
rails環境のDockerイメージを作成します。
Dockerfileの作成 → ビルド → Dockerイメージ(task_app)
※Dockerfileはないので新規作成します。
$ vi Dockerfile FROM ruby:2.6 WORKDIR /task_app COPY Gemfile /task_app/Gemfile RUN bundle install $ docker build -t task_app . Sending build context to Docker daemon 3.072kB Step 1/4 : FROM ruby:2.6 ---> a161c3e3dda8 Step 2/4 : WORKDIR /task_app ---> Running in a6b5dec7f0ed Removing intermediate container a6b5dec7f0ed ---> 16367607e3e5 Step 3/4 : COPY Gemfile /task_app/Gemfile ---> 99de34366eef Step 4/4 : RUN bundle install ---> Running in 8839dbf87256 Fetching gem metadata from https://rubygems.org/............. Fetching gem metadata from https://rubygems.org/. Resolving dependencies... Fetching rake 13.0.1 Fetching rails 5.2.4.1 Installing rails 5.2.4.1 Bundle complete! 1 Gemfile dependency, 41 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. Post-install message from i18n: HEADS UP! i18n 1.1 changed fallbacks to exclude default locale. But that may break your application. If you are upgrading your Rails application from an older version of Rails: Please check your Rails app for 'config.i18n.fallbacks = true'. If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be 'config.i18n.fallbacks = [I18n.default_locale]'. If not, fallbacks will be broken in your app by I18n 1.1.x. If you are starting a NEW Rails application, you can ignore this notice. For more info see: https://github.com/svenfuchs/i18n/releases/tag/v1.1.0 Removing intermediate container 8839dbf87256 ---> 89e179509cba Successfully built 89e179509cba Successfully tagged task_app:latest $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE task_app latest 89e179509cba About a minute ago 926MB作成されてますね。
Railsアプリの作成
作成したDockerイメージ(task_app)を利用してrails newを実行し、Railsアプリを作成します。
$ docker run --rm -v `pwd`:/task_app task_app rails new . -B --database=mysql exist create README.md create Rakefile create .ruby-version create config.ru create .gitignore conflict Gemfile Overwrite /task_app/Gemfile? (enter "h" for help) [Ynaqdhm] force Gemfile run git init from "." Initialized empty Git repository in /task_app/.git/ create package.json create app create app/assets/config/manifest.js create app/assets/javascripts/application.js create app/assets/javascripts/cable.js create app/assets/stylesheets/application.css create app/channels/application_cable/channel.rb create tmp/storage create tmp/storage/.keep remove config/initializers/cors.rb remove config/initializers/new_framework_defaults_5_2.rbRailsからデータベースへ接続するためのdatabase.ymlファイルが作成されますので修正します。
$ vi config/database.yml default: &default adapter: mysql2 encoding: utf8 pool: username: root password: xxxxxxx #追加: MysqlのMYSQL_ROOT_PASSWORDと同じ値 host: db #追加: MySQLのコンテナ名と同じ値。この後構築します。docker-compose.ymlにwebコンテナを追加します。
Railsが起動するDockerイメージを作成します。
$ vi Dockerfile FROM ruby:2.6 RUN apt-get update -qq && apt-get install -y nodejs #追加 WORKDIR /task_app COPY Gemfile /task_app/Gemfile RUN bundle install CMD ["rails", "server", "-b", "0.0.0.0"] #追加RailsアプリはDocker Composeを利用して起動させます。
docker-compose.ymlを作成し、webコンテナの起動設定をdocker-compose.ymlに記載します。# vi docker-compose.yml version: '3' services: web: build: . ports: - '3000:3000' volumes: - .:/task_appコンテナを停止するとmysqlのデータが消えてしまうため、データ永続化のため、volumesを入れています。
Dockerfileを編集したのでdocker-composeコマンドでDockerイメージをビルドします。
$ docker-compose build Building web Step 1/6 : FROM ruby:2.6 ---> a161c3e3dda8 Step 2/6 : RUN apt-get update -qq && apt-get install -y nodejs ---> Running in c287be3cb98f Reading package lists... Building dependency tree... Reading state information... The following additional packages will be installed: libc-ares2 libnode64 libuv1 nodejs-doc Suggested packages: npm The following NEW packages will be installed: libc-ares2 libnode64 libuv1 nodejs nodejs-doc 0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded. Need to get 6753 kB of archives. After this operation, 30.4 MB of additional disk space will be used. * For more details, please refer to the Sass blog: https://sass-lang.com/blog/posts/7828841 Removing intermediate container 711351e6bba5 ---> 5486636e708a Step 6/6 : CMD ["rails", "server", "-b", "0.0.0.0"] ---> Running in 82d851651892 Removing intermediate container 82d851651892 ---> a895f6cec871 Successfully built a895f6cec871 Successfully tagged task_app_web:latest $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE task_app_web latest a895f6cec871 8 minutes ago 1.02GB task_app latest 89e179509cba About an hour ago 926MBここまででweb(rails)コンテナの構築が完了です。
db(mysql)コンテナの構築
depends_onにdbコンテナを追加します。
※depends_onはwebとDBコンテナの作成順序と依存関係を定義します。# vi docker-compose.yml version: '3' services: web: build: . ports: - '3000:3000' volumes: - .:/task_app depends_on: #追加 - db #追加 db: #追加 image: mysql:5.7 #追加 volumes: #追加 - ./mysql:/var/lib/mysql #追加 environment: #追加 MYSQL_ROOT_PASSWORD: 'xxxxx' #追加: Railsのpasswordと同じ値一旦、Dockerコンテナを起動します。
$ docker-compose upただし、dbコンテナはありますがRuby on Railsで利用するデータベースがないので作成します。
$ docker-compose exec web rake db:create Created database 'task_app_development' Created database 'task_app_test' $ docker-compose exec db mysql -uroot -pxxxxx mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 5.7.29 MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +----------------------+ | Database | +----------------------+ | information_schema | | mysql | | performance_schema | | sys | | task_app_development | ← 作成 | task_app_test | +----------------------+ 6 rows in set (0.00 sec) mysql>データベースも作成できましたので、db(mysql)コンテナの準備も完了です。
ブラウザでアクセス
http://localhost:3000/ でアクセスして確認します。
見慣れた画面が出ましたね!
まとめ
Docker環境で簡単にrailsの開発環境が用意できました!
ちなみにDockerのキャラクターは、Moby(モビー)って言うらしいです。
- 投稿日:2020-01-25T15:27:41+09:00
ROSでRealSenseをまじめに動かしてみようとしたら環境設定が大変だった
経緯
某書籍に影響されて「Jetson Nano 超入門」を読んでSLAMやってみたにあるようにSLAMをやってみたら、一年前には困難だったあれやこれやが解決されて、スムーズにSLAMが動かせました。
調子に乗ってROSを勉強してラジコンも動かそう。
DonkeyCarからステップアップ!
と思ったら、継続的に開発しようとすると環境設定のほうが大変だったのでまとめておきます。Windows10Pro
NVIDIAのGTX1660Tiが入ったWindows10を使用します。
Docker DeskTopを動かすために、Proにアップグレードしています。
メインの開発マシンはこれになります。Jetson-nano
Jetson-nanoで動かします。
Dockerを使わずに環境を整えています。
JetPack4.2.2を使います。OpenCV4.1ではROSの中に動かせないものがあったので、少々古いバージョンを使用しています。
ROSやRealSenseのドライバなどもインストール済み。
「Jetson Nano 超入門」を読んでSLAMやってみたを参照。エディタ(VSCode)
最近は仕事でも使っているので、エディタはこれ。
その時々で必要なプラグインを突っ込みながら作業をしています。
Jetson-nanoにもPCにも入れてあります。
Jetson-nanoに入れるときは、配布されているビルド済みバイナリを使わせていただきました。GitHub
バックアップやJetson-nanoとPC間のソースコードの交換を考えると、GitHubに入れておくのが一番楽です。
VSCodeのプラグインで色々入れて使いやすくしておきます。設定はROSでRealSenseを真面目に動かしてみる3を参照。
Git関連のプラグインはGitHistoryとGitLensを入れておきました。
Docker+ROS環境
Jetson-nanoにつないだ小さなディスプレイで開発するのが大変になってきたので、Windows10をProにアップグレードしてDocker DeskTopを使うことにしました。
記録を残していたら色々長くなりすぎたので、記事を分離しました。
- 投稿日:2020-01-25T14:37:50+09:00
【Docker】TypeError: bytes-like object is required, not 'str'
概要
docker-compose up -d
を実行すると以下のエラーが発生する。TypeError: bytes-like object is required, not 'str'
バージョン
Docker: 19.03.5
docker-compose: 1.25.1原因
コンテナ起動時にスローされるエラーの形式が変わったため出るエラーのようです。
docker-composeのバージョン1.25.0と1.25.1で確認されていました。解決方法
docker-composeのアップグレードを行なったら解決しました。
$ curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 投稿日:2020-01-25T14:22:27+09:00
devise 導入直後のエラー(docker)
概要
[Rails] deviseの使い方(rails4版)
このサイト↑に沿ってdevise導入し、そこでこのエラーが発生しました。
その対処法を記載をしています。エラーの内容
ルーティングエラー
Rails routes で調べても特に問題なさそう・・
Rails: deviseをインストールした後のエラー
これ↑を実装したが、エラー治らず・・・対処法
問題は恐らくdockerなのでは?となり、とりあえず
docker再起動→ローカルを再起動docker再起動方法
右上にあるクジラを押す→restart 完了!!
それでもう一度localhostをリロードすると治りました。
お疲れさまでした!!
- 投稿日:2020-01-25T14:12:22+09:00
docker-composeの大切な変数には環境変数を設定しよう!
はじめに
こんにちは。早速ですが、docker-composeにDBのimageを書いてる人...。
環境変数は使用していますか??個人が作成しているポートフォリオや個人のWebアプリケーションなどでGitでバージョン管理されている方が多いと思いますが、docker-composeに『直で大切な情報を載せるはあまり良くはない...』ですよね。
そんな時に環境変数を用いて、大切な情報はgitignoreしつつ、一括で管理してしましましょう!!
ではdocker-composeにて楽々できる環境変数の設定の仕方をご紹介します。
ディレクトリの構成図を見ていく
ファイルは2つのみの単純な構成図ですが、載せておきます。笑
ディレクトリ構成図sample-project ├ .env # 環境変数を設定するファイル └ docker-compose.ymldocker-composeと環境変数の設定ファイル.envは同ディレクトリに置かなければいけません。
まず.envの中身を書く
今回は僕がPostgreSQLを使っているので、PostgreSQLで書きますが、設定したい変数を書けばいいだけなので、簡単にカスタムできます。
注意点
必ずファイル名は
.env
という名前にしてください。違う名前でも実装できますが少し設定方法が変わってきてしまいます...
それについては後半で紹介しますね(/・ω・)/ コチラで後半まで飛べます.envPOSTGRES_USER=postgres POSTGRES_PASSWORD=passworddayodocker-composeの中身を書く
こんなDBのコンテナのみで使うことなど無いかもしれませんが、余計な情報はなしで書きます。
docker-compose.ymlversion: "3" services: db: image: postgres environment: - POSTGRES_USER - POSTGRES_PASSWORD ports: - "5432:5432"たったこれだけで実装可能です。
ですがここにたどり着くまで様々な落とし穴があったりします。笑
僕的落とされたポイント
その1→ファイル名は.envにする件について
どうやらdocker-composeの標準装備で同ディレクトリのenvファイルで定義したものを参照してくれるみたいです。公式ドキュメント*1に書かれていことが少なすぎて、『情報量!!!』と叫びましたね。*1 docker docsへはコチラ
.envを指定しない方法
これは簡単に言うと、任意のファイル名を指定して、そのファイル内の定義したもの全てをenvironmentに入れるパターンです。
この方法については、他の方がまとめてくれている記事を紹介します*2↓
*2 docker-composeでenv_fileとenvironmentを同時に設定する際の注意点(Qiita)その2→environmentに書くのそれだけ?問題
docker-compose.yml
を見ていただくと、evironmentにPOSTGRES_USERとPOSTGRES_PASSWORDを書いているだけですよね。笑
元々PostgreSQLの方でevironmentに設定しなければいけない変数が決まっているのですが、.env
で設定した名前をdocker-compose.yml
で代入するのではなく、直でdocker-compose.yml
に書いてるのです。笑ですがその方が『環境変数が個別に直感的に設定できる』という意味で、ファイル名を指定してファイル全体を代入するのではなく、変数を指定するやり方が僕的には良いと思ったので、
.env
の設定方法を紹介いたしました。さいごに
最後まで読んでいただきありがとうございました。
間違っている点やシンプルな感想などでもございましたら、お気軽にコメントください!!実はDjangoにて環境変数を設定する方法をメインに書きたかったのですが、Dockerありきの方法になってしまうんです。なのでそれはまた今度ということで。
DjangoやAWS,Dockerなどのバックエンドを勉強していたり、機械学習にも少し手を出しているわたくしの姿を発信しているTwitterがあるので、もし良ければ...@heacet43
参考文献
*1 Declare default environment variables in file | Docker Documentation [https://docs.docker.com/compose/env-file/]
*2 docker-composeでenv_fileとenvironmentを同時に設定する際の注意点 [https://qiita.com/zawawahoge/items/eeaf2833583949524023]
- 投稿日:2020-01-25T13:31:13+09:00
docker-compose イメージ サイズ確認方法
概要
筆者は個人開発や学習等でGCP(GCE)を利用しています。
無料枠で使用していますが、GCEにGrowiを立てようとしたところ、つまづきました。
具体的にはドキュメントを参考にdocker-compose up
したところシェルが戻ってこなくなりました。ROMが足りていないと考え、
正常にGrowi構築できた環境を用意し、Growi構築にあたりROM要件の確認をしました。
この方法を記事にしました。Growiドキュメント
https://docs.growi.org/ja/guide/
実行環境
OS
> sw_vers ProductName: Mac OS X ProductVersion: 10.14.6
使用しているシェル
> echo "$SHELL" /bin/bashdockerバージョン
> docker --version Docker version 19.03.2, build 6a30dfcdocker-composeバージョン
> docker-compose --version docker-compose version 1.24.1, build 4667896b確認方法
> docker-compose images Container Repository Tag Image Id Size ---------------------------------------------------------------------------- growi_app_1 growi_app latest bb6255fd4f73 244 MB growi_elasticsearch_1 growi_elasticsearch latest c6d9fe3d94b0 820 MB growi_mongo_1 mongo 3.6 e7f4a190b0a9 417 MB結果
1.481GB必要とわかりました。
- 投稿日:2020-01-25T13:09:19+09:00
【rails】SystemSpec(capybara) on dockerでつまずいた時のメモ
Capyabaraの設定方法
https://qiita.com/ngron/items/f61b8635b4d67f666d75
上の記事をもとに設定解決したかったこと
Selenium::WebDriver::Error::UnknownErrorを解決して、systemtestを行う
失敗例
Gemfile.group :test do gem 'capybara', '>= 2.15' gem 'selenium-webdriver' end成功例
Gemfile.group :test do gem 'capybara' gem 'selenium-webdriver' end行ったこと
1、gem(capybara、selenium-webdriver)のバージョン固定を外す。
gemのバージョンを固定しているといつまでたってもエラー(Selenium::WebDriver::Error::UnknownError)が解決できない。
2、docker-compose build参考記事
Rails + Selenium + DockerでSystemSpecの環境構築
https://qiita.com/ngron/items/f61b8635b4d67f666d75ありがとうございます!!
- 投稿日:2020-01-25T12:13:27+09:00
goでGRPCのSimpleRPCやってみた(Unary RPC)
goでgrpcのSimpleRPCを実行してみました!
この記事内容を上から行えば、動く環境が作れます。grpc
・SimpleRPCとは
一つのデータを受け取って、一つのデータを返すdocker環境
・フォルダ構成
以下のフォルダを想定しています。./infrastructure/docker/go-grpc/Dockerfile ./infrastructure/docker/docker-compose.yml・フォルダを作成します。
mkdir -p ./infrastructure/docker/go-grpc cd ./infrastructure/docker touch docker-compose.yml ./go-grpc/Dockerfile・Dockerfile
FROM golang:1.13-stretch SHELL ["/bin/bash", "-c"] RUN apt update && apt-get install -y vim unzip # install protc WORKDIR /protoc RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.2/protoc-3.11.2-linux-x86_64.zip RUN unzip protoc-3.11.2-linux-x86_64.zip RUN ln -s /protoc/bin/protoc /bin/protoc # golang WORKDIR /go-grpc ENV GO111MODULE on RUN go get -u github.com/golang/protobuf/protoc-gen-go・docker-compose.yml
version: "3.7" services: go-grpc: build: context: ./go-grpc/ dockerfile: Dockerfile container_name: "go-grpc" volumes: - ../../:/go-grpc tty: true privileged: true・環境に入る
以下のコマンドでdockerコンテナの中に入れます。cd ./infrastructure/docker docker-compose up -d docker-compose exec go-grpc bashprotoの作成
以下dockerコンテナに入って状態で作業します。
コンパイラである「protoc」は、dockerコンテナにインストールしてあります。足算を想定したprotoです。
mkdir ./proto touch ./proto/calc.proto・calc.proto
syntax = "proto3"; option java_multiple_files = true; option java_package = "io.grpc.examples.simple"; option java_outer_classname = "SimpleProto"; // package名 package calc; // 上の4つのパターンをここで指定する。 service Calc { rpc Sum (SumRequest) returns (SumReply) {} } // リクエストで送る値。「1、2」はそのデータの番号。 message SumRequest { int32 a = 1; int32 b = 2; } // レスポンスで送る値 message SumReply { string message = 1; }・上の「.protoファイル」を、goファイルにコンパイルします。
以下のコマンドで、./pb/calcフォルダに「calc.pb.go」が自動生成されます。protoc --proto_path ./proto --go_out=plugins=grpc:./pb/calc calc.proto「calc.pb.go」が生成されました。
goで実行
・以下のコマンドで、gomoduleを初期設定をします。
go mod init grpc-sample「受け取る側のサーバー」と「送る側のクライアント」の2つの実行ファイルを作成します。
mkdir server client touch ./server/main.go ./client/main.go・./server/main.go
package main import ( "context" "fmt" "log" "net" pb "grpc-sample/pb/calc" "google.golang.org/grpc" ) const ( port = ":50051" ) type server struct { pb.UnimplementedCalcServer } func (s *server) Sum(ctx context.Context, in *pb.SumRequest) (*pb.SumReply, error) { a := in.GetA() b := in.GetB() log.Printf("%v, %v", a, b) reply := fmt.Sprintf("%d + %d = %d", a, b, a+b) return &pb.SumReply{Message: reply}, nil } func main() { lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterCalcServer(s, &server{}) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }・./client/main.go
package main import ( "context" "fmt" "log" "time" "github.com/pkg/errors" pb "grpc-sample/pb/calc" "google.golang.org/grpc" ) func getAdress() string { const ( host = "localhost" port = "50051" ) return fmt.Sprintf("%s:%s", host, port) } func exec(a, b int32) error { address := getAdress() conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { return errors.Wrap(err, "did not connect") } defer conn.Close() client := pb.NewCalcClient(conn) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() reply, err := client.Sum(ctx, &pb.SumRequest{ A: a, B: b, }) if err != nil { return errors.Wrap(err, "could not greet") } log.Printf("サーバからの受け取り\n %s", reply.GetMessage()) return nil } func main() { exec(300, 500) }・サーバを実行します。
go run server/main.goこれでサーバが立ったので、クライアントからデータを送ります。
go run client/main.goクライアント側の表示
300, 500という数字を送ったので、800という数字がサーバから返ってきました。
サーバ側の表示
クライアントから、300と500という値を受け取りました。
この下に、コードの説明も書きます。
- 投稿日:2020-01-25T12:13:27+09:00
goでGRPCのUnary RPCsやってみた(SimpleRPC)
goでgrpcを実装してみました。
今回はまず、Unary RPCs(SimpleRPC)をやります!
他記事で残り3つの方式もやります。
この記事内容を上から行えば、dockerで動く環境が作れます。
dockerで実装してる記事は少ないはず。grpcの4つの通信方式
StreamingとUnaryの組み合わせのため4つある。
詳しくは公式を参考・Unary RPC
一つのデータを受け取って、一つのデータを返す。
動きはよくあるrestAPIと同じ。
用途:サーバ間通信、API。
(Unary : Unary)・Server streaming RPC
サーバがクライアントに複数のリクエストを送る。
用途:サーバから任意のタイミングでクライアントに通知させたい時など。
(Streaming : Unary)・Client streaming RPC
クライアントがサーバに複数のリクエストを送る。
用途:データアップロードや、クライアントから多くのデータを送る場合。
(Unary : Streaming)・Bidirectional streaming RPC
双方向でデータのやりとりをする。
用途:チャットやオンライン対戦など。
(Streaming : Streaming)環境構築
docker環境
・フォルダ構成
以下のフォルダを想定しています。./infrastructure/docker/go-grpc/Dockerfile ./infrastructure/docker/docker-compose.yml・フォルダを作成します。
mkdir -p ./infrastructure/docker/go-grpc cd ./infrastructure/docker touch docker-compose.yml ./go-grpc/Dockerfile・Dockerfile
FROM golang:1.13-stretch SHELL ["/bin/bash", "-c"] RUN apt update && apt-get install -y vim unzip # install protc WORKDIR /protoc RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.2/protoc-3.11.2-linux-x86_64.zip RUN unzip protoc-3.11.2-linux-x86_64.zip RUN ln -s /protoc/bin/protoc /bin/protoc # golang WORKDIR /go-grpc ENV GO111MODULE on RUN go get -u github.com/golang/protobuf/protoc-gen-go・docker-compose.yml
version: "3.7" services: go-grpc: build: context: ./go-grpc/ dockerfile: Dockerfile container_name: "go-grpc" volumes: - ../../:/go-grpc tty: true privileged: true・環境に入る
以下のコマンドでdockerコンテナの中に入ります!cd ./infrastructure/docker docker-compose up -d docker-compose exec go-grpc bash実装
2つの数字を送ったら足算して返すサーバとクライアントを作成します。
protoの作成
以下dockerコンテナに入った状態で作業します。
コンパイラである「protoc」は、dockerコンテナにインストールしてあります。足算を想定したprotoです。
mkdir ./proto touch ./proto/calc.proto・calc.proto
syntax = "proto3"; option java_multiple_files = true; option java_package = "io.grpc.examples.simple"; option java_outer_classname = "SimpleProto"; // package名 package calc; // 上の4つのパターンをここで指定する。 service Calc { rpc Sum (SumRequest) returns (SumReply) {} } // リクエストで送る値。「1、2」はそのデータの番号。 message SumRequest { int32 a = 1; int32 b = 2; } // レスポンスで送る値 message SumReply { string message = 1; }・上の「.protoファイル」を、goファイルにコンパイルします。
以下のコマンドで、./pb/calcフォルダに「calc.pb.go」が自動生成されます。protoc --proto_path ./proto --go_out=plugins=grpc:./pb/calc calc.proto「calc.pb.go」が生成されました。
goで実行
・以下のコマンドで、gomoduleを初期設定をします。
go mod init grpc-sample「受け取る側のサーバー」と「送る側のクライアント」の2つの実行ファイルを作成します。
mkdir server client touch ./server/main.go ./client/main.go・./server/main.go
package main import ( "context" "fmt" "log" "net" pb "grpc-sample/pb/calc" "google.golang.org/grpc" ) const ( port = ":50051" ) type server struct { pb.UnimplementedCalcServer } func (s *server) Sum(ctx context.Context, in *pb.SumRequest) (*pb.SumReply, error) { a := in.GetA() b := in.GetB() log.Printf("%v, %v", a, b) reply := fmt.Sprintf("%d + %d = %d", a, b, a+b) return &pb.SumReply{Message: reply}, nil } func main() { lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterCalcServer(s, &server{}) if err := s.Serve(lis); err != nil { log.Fatalf("サーバ起動失敗: %v", err) } }・./client/main.go
package main import ( "context" "fmt" "log" "time" "github.com/pkg/errors" pb "grpc-sample/pb/calc" "google.golang.org/grpc" ) func getAdress() string { const ( host = "localhost" port = "50051" ) return fmt.Sprintf("%s:%s", host, port) } func exec(a, b int32) error { address := getAdress() conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { return errors.Wrap(err, "コネクションエラー") } defer conn.Close() client := pb.NewCalcClient(conn) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() reply, err := client.Sum(ctx, &pb.SumRequest{ A: a, B: b, }) if err != nil { return errors.Wrap(err, "受取り失敗") } log.Printf("サーバからの受け取り\n %s", reply.GetMessage()) return nil } func main() { exec(300, 500) }・サーバを実行します。
go run server/main.goこれでサーバが立ったので、クライアントからデータを送ります。
go run client/main.goサーバ側の表示
上のコマンドを実行したので、
クライアントから、300と500という値を受け取りました。
クライアント側の表示
300, 500という数字を送ったので、800という数字がサーバから返ってきました。
1リクエスト1レスポンスのサーバとクライアンを動かすことができました。
これで、「めっちゃ負荷が高い処理をする機能」があった場合とかにサーバを分割できたりもする。感想
残りの3つの通信方式もやります。
サーバ間通信やunityなどで使ってみたい。
- 投稿日:2020-01-25T11:59:49+09:00
dockerでmysqlコンテナを立てる時の設定 my.cnf
dockerでmysqlコンテナを立てる時の設定 my.cnf
mysqlのconf について学ぶ。
ざっと出すとこんな感じ
[mysqld] skip-host-cache skip-name-resolve character-set-server=utf8mb4 [client] default-character-set=utf8mb4mysql server, clientの設定がそれぞれ書いてある。
server 設定 mysqld
skip-host-cache
[https://www.na3.jp/entry/20140205/p1:embed:cite]
[https://dev.mysql.com/doc/refman/5.6/ja/host-cache.html:title]
これはDNSのキャッシュ戦略機能をオフにする宣言。
ipアドレスから引かれたホスト名がすでにキャッシュされている時にそれを使い回す機能があるそう。
docker-composeでコンテナを立てる場合、docker networkがよしなにprivate ipを当ててくれるからわざわざdnsで名前解決しなくていい。
skip-name-resolve
[http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0028:embed:cite]
[https://dev.mysql.com/doc/refman/5.6/ja/host-cache.html:title]
これも同様にDNSの名前引きを飛ばす設定。
character-set-server=utf8mb4
mb4
がポイント。mysqlのutf8は1-3byte文字しか扱えない。
iOS, Androidの絵文字, 最近追加された難しい日本語や中国語は4byteあるためこれらの文字列を格納しようとするとエラーが起きる。
そこで utf8mb4を使う。
[https://flhouse.co.jp/article/2/utf8mb4:embed:cite]
clientも同じ
- 投稿日:2020-01-25T10:05:00+09:00
nuxt dockerで使う個人的な設定
Docker
npm install -g create-nuxt-app npx create-nuxt-app プロジェクト名ポート変更
package.json
{ "name": "vue", "version": "0.1.0", "private": true, "scripts": { + "dev": "PORT=8080 nuxt", .... },nuxt-config.js
module.exports = { server: { + port: 8080, // デフォルト: 3000 + host: '0.0.0.0' // デフォルト: localhost },ホットリロード
nuxt-config.js
module.exports = { ... + watchers: { + webpack: { + poll: true + } }SPAモード
nuxt-config.js
module.exports = { + mode: 'spa',レイアウトの変更
xxx.vue内
使用するレイアウトは layouts/testlo.vueexport default { + layout: 'testlo', components: { AppLogo } }
- 投稿日:2020-01-25T02:40:36+09:00
EmacsとDockerで簡単LaTeX環境構築
TL;DR
(use-package yatex :mode ("\\.tex\\'" . yatex-mode) :config (let ( (prefix "docker run --rm -v $PWD:/workdir paperist/alpine-texlive-ja ") (cmds '( bibtex-command dvi2-command makeindex-command tex-command YaTeX-dvipdf-command ))) (cl-loop for cmd in cmds collect (set cmd (concat prefix (eval cmd))))))はじめに
LaTeXの環境構築のためにローカル環境を汚すことに抵抗ある人は多いだろう.
そんな人のために親切な方がDockerイメージを公開してくれている.
各コマンドをエイリアスに登録しても良いのだが,YaTeXを使っている人はLaTeXのコマンドを直接実行することは基本的にないので,init.elに書いてしまおう,というおはなし.(気が向き次第追加執筆予定)
- 投稿日:2020-01-25T01:38:57+09:00
Rails4系で統合テストをDocker環境内で行う
はじめに
今回Railsのバージョンアップに向けて不足していた箇所のテストを書いていました。
その一環で統合テストを書こうとして軽く詰まったので似たような境遇方のためになればと思い(こんなレアケースに遭遇する人は少ないと思いますが)記事にしました。なぜ統合テストなのか
プロダクトで使用している外部サービスのAPIがjsにしか対応しておらず、プロダクト内で重要な機能の一部に組み込まれていたため。
環境
Rails 4系
Ruby 2.5.7
Rspec 3.9.1
capybara 3.30.0対象
- すでにRspecのテスト環境が整っている。
- dockerを用いて開発を行なっている。
- dockerを用いていない場合はローカルにインストールされているブラウザを使用すれば簡単に実装できると思います。
Railsアプリケーションが入っているコンテナにchromeなどを導入する
ブラウザ用にコンテナを分けるか迷いましたが、circleciにブラウザが導入されているRubyのイメージがあったため開発環境下でもRailsアプリケーションが入っているコンテナに導入することにしました。
Dockerfileに以下のchromeやseleniumなどをインストールするためのコマンドを書き足します。
DockerfileFROM ruby:2.5.7 # 下記の内容については現在の設定内容に合わせて変更してください。 # googleが用意している公開鍵をaptに追加 RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - # aptに安定版chromeがインストールできるレポジトリgoogle-chrome.listを追加します。 RUN echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list # aptで必要なパッケージをインストールします。 # seleniumをpipでインストールするため一緒にインストールします。 RUN apt-get update -qq && apt-get install -y [nodejsやRDBMSのクライアントなど] google-chrome-stable python3-pip # seleniumでchromeを動かすためのchromedriverをダウンロードします。 # installしているchromeのバージョンに対応したchromedriverをインストールする必要があるため # http://chromedriver.storage.googleapis.com/LATEST_RELEASE # でchromeの安定バージョンを取得することができるため、その値を用いてchromedriverのバージョンを指定しています RUN LATEST_RELEASE=$(curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE) &&\ wget http://chromedriver.storage.googleapis.com/$LATEST_RELEASE/chromedriver_linux64.zip # ダウンロードしたchromedriverを解凍します。 このときPATHが通っている階層に配置しましょう。 RUN unzip chromedriver_linux64.zip -d /bin/ # pipでseleniumをインストールします。 RUN pip3 install selenium # これより下はRailsのインストールなど既存のコードになるかと思います。Rails側で統合テストを動かす設定
Gemfileに以下を追加
Gemfilegem 'selenium-webdriver'rails_helper.rbに以下を追加
rails_helper.rbrequire 'selenium-webdriver'以下の内容を設定ファイルを作成して記述する。(rails_helper.rbなどに書いても可)
spec/support/capybara.rbCapybara.register_driver :selenium do |app| option = Selenium::WebDriver::Chrome::Options.new( args: %w[--headless --disable-gpu --no-sandbox] ) Capybara::Selenium::Driver.new( app, browser: :chrome, options: option, timeout: 600, # この設定がないとテスト内容によってはcircleciで Net::ReadTimeout となってしまう desired_capabilities: { accept_insecure_certs: true } ) end Capybara.javascript_driver = :selenium以上の設定で統合テストが実行できる環境が出来上がったと思います。
さいごに
Rails4系で統合テストのやり方を調べるとcapybara-webkitを使用した記事しか出てこなかったり、良さげなやり方を見つけてもsystem testに対応していなかったりとなにから導入していいのか調べるところからで少し詰まってしまいました。。。
また、せっかくdockerを使用しているので初めはブラウザ用のコンテナを用意しましたがコンテナ間の接続に証明書が必要でした。
証明書の発行まで書こうかと思いましたがcircleciでブラウザーが含まれたimage(今回だとcircleci/ruby:2.5.7-node-browsers)があったため分けずに構築してみました。
初めての内容ばかりだったのでおそらく改善できる点がたくさんあると思います。
改善点や気になったことがあればコメントで教えていただけると嬉しいです!参考記事
https://qiita.com/zo30005/items/a5dcede868a3d1cca4a8
https://www.google.com/linuxrepositories/
https://www.linuxbabe.com/ubuntu/install-google-chrome-ubuntu-18-04-lts
https://circleci.com/docs/2.0/circleci-images/#language-image-variants