課題
rubyも知らないのに、仕事でrails使うことになりました。やばい。
解決策
rubyもrailsもど素人な自分を助けてもらおうと、今回もudemyにお世話になってます。
フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座
個人的にはフルスタックというワードが既に死語ではないかと感じていたりするんですが、内容はとても良いです。ruby自体素人の自分にとっては、rubyのシンタックス解説が最小限含まれてるのは有難い‥。知っている人にとっては冗長だと思いますが、そんときは飛ばせば良いだけですし。
後でもう少し整理するのだけど、以下メモ書き。rubyだけでなくdockerも素人ということがこのメモ書きからバレてしまうけど。
docker exec
railsアプリを動かすためのdockerコンテナを起動した後、
$ docker-compose up -d
起動したコンテナに後からbashログインしたいことが度々ある。そもそも仮想マシンコンテナ内部がどんな構成になってんのか覗いてみたいと思いますよね(大体普通にFHSに則ったdirectory treeを眺めるだけですが)。
とりあえず以下コマンドで、起動済みコンテナの一覧を得る。webとdbのコンテナが起動していることが分かる。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 64dfb07beafe 5d247124df8b "bundle exec rails s…" 17 minutes ago Up 17 minutes 0.0.0.0:3000->3000/tcp rails_web_1 be255fff550f mysql:5.7 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 3306/tcp, 33060/tcp rails_db_1
ちょっとdbコンテナのmysqlにログインしてテーブルの中身を覗いて見たい‥と思ったときには以下コマンドで、コンテナにbashログインした後、普通にmysqlを叩く。
$ docker exec -it rails_db_1 /bin/bash root@be255fff550f:/# root@be255fff550f:/# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.7.24 MySQL Community Server (GPL) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | app_development | | app_test | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.01 sec) mysql> use app_development Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +---------------------------+ | Tables_in_app_development | +---------------------------+ | ar_internal_metadata | | boards | | schema_migrations | +---------------------------+ 3 rows in set (0.00 sec)
describeとかしてみると、ちゃんとrailsのORマッパーが働いてくれそうな気配を感じることができる。
mysql> describe boards; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | title | varchar(255) | YES | | NULL | | | body | text | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------+--------------+------+-----+---------+----------------+ 6 rows in set (0.01 sec)
コンテナ起動後にrailsコンソールを叩くこともできる。
$ docker exec -it rails_web_1 rails c Running via Spring preloader in process 50 Loading development environment (Rails 5.0.0.1) irb(main):001:0>
docker attach
起動済みコンテナに後からattachすることもできる。
以下コマンドで起動済みコンテナの一覧を得た後、
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 64dfb07beafe 5d247124df8b "bundle exec rails s…" 17 minutes ago Up 17 minutes 0.0.0.0:3000->3000/tcp rails_web_1 be255fff550f mysql:5.7 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 3306/tcp, 33060/tcp rails_db_1
attachしてみる。
$ docker attach rails_web_1
作成中のrailsアプリで何か叩くと反応する。
Started POST "/boards" for 172.23.0.1 at 2019-02-02 17:43:54 +0000 Cannot render console from 172.23.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 ActiveRecord::SchemaMigration Load (15.5ms) SELECT `schema_migrations`.* FROM `schema_migrations` Processing by BoardsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"YdVLdgI6BHsOB3YPJhYR9bz8OnSJacTP57J5eWvZYorXBPy6LyHulObUkO41ox8rSMOEaCX31h8Yrfk2U0x25A==", "board"=>{"name"=>"takashi", "title"=>"hei", "body"=>"hoi\r\n"}} (0.5ms) BEGIN SQL (29.1ms) INSERT INTO `boards` (`name`, `title`, `body`, `created_at`, `updated_at`) VALUES ('takashi', 'hei', 'hoi\r\n', '2019-02-02 17:43:56', '2019-02-02 17:43:56') (4.8ms) COMMIT From: /app/app/controllers/boards_controller.rb @ line 12 BoardsController#create:
docker attachしたコンテナから安全に抜ける
困ったのがこれ。attachした後、そのコンテナから抜けたいだけなのに、CTRL-cとかするとコンテナ自体が死んでしまう。
read escape sequence $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d5ff643e471 mysql:5.7 "docker-entrypoint.s…" 19 minutes ago Up 19 minutes 3306/tcp, 33060/tcp rails_db_1
上は、attachしたrails_web_1コンテナから抜けたかっただけなのに殺してしまった図。
dockerのヘルプを見ると、仕様通りの動作みたい。コンテナに対してSIGKILL送っちゃうんだからそりゃ死ぬよね。
To stop a container, use
CTRL-c
. This key sequence sendsSIGKILL
to the container. If--sig-proxy
is true (the default),CTRL-c
sends aSIGINT
to the container.
もちろん、コンテナを殺さずに抜ける方法も用意されてる。
You can detach from a container and leave it running using the
CTRL-p CTRL-q
key sequence.
試してみよう。rails_web_1コンテナにattachした後、CTRL-p CTRL-qを入力する。
read escape sequence $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0b2a521d54d4 rails_web "bundle exec rails s…" 19 minutes ago Up 19 minutes 0.0.0.0:3000->3000/tcp rails_web_1 4d5ff643e471 mysql:5.7 "docker-entrypoint.s…" 19 minutes ago Up 19 minutes 3306/tcp, 33060/tcp rails_db_1
ちゃんとrails_web_1コンテナが生きてる。やった。
まとめ
シンタックスが嫌いだからと避けていたruby。
いつ何時必要になるか分からないので、喰わず嫌いせずに少しずつでも勉強してれば良かったな。
という反省から、同時進行でGoもやってたりします。きつい。