DockerでRailsを動かす その3
実現したいこと
AWS ECS上で,Railsプロジェクトを動かしてみようと思います.
前回の戦いはこちら
やったこと
ECSをさっそく立ち上げて,前回動いたDockerのイメージを載せてみたいと思います.
AWSのアカウントはあるので,ECSでFargateを使用します.
ポチポチしていくだけで完了.サービス名やVPNなどは,適当で.
とりあえず動かすのを目的にします.
first_taskをとりあえず定義すれば,あっという間にサンプルタスクがうごきました.これはすごい...
Fargateはタスクに対して秒単位で課金されるので,直ちにfirst_taskを停止.
次に,ローカルで作ったイメージをこのsample appの変わりに起動させたいと思います.
そのためには,ECRというコンテナレポジトリにイメージを登録する必要があるとのこと.
ECSのメニューバーからECRに飛べて,ポチポチするだけなので秒で作成完了.CLIからのpushなどの操作方法まで示してくれる親切設計.
さーて指示通りにCLIからpushするかーと思ったら,
$ aws help bash: aws: command not found
あれ?CLIインストールしてなかったっけ? というわけでインストールします.
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" $ sudo python get-pip.py $ sudo pip install awscli
はい,簡単ですね!と思いきや...
matplotlib 1.3.1 requires nose, which is not installed. matplotlib 1.3.1 requires tornado, which is not installed. Installing collected packages: urllib3, jmespath, six, python-dateutil, docutils, botocore, pyasn1, rsa, colorama, PyYAML, futures, s3transfer, awscli Found existing installation: six 1.4.1 Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
....??????
noseとtornadoが必要でsixがアンインストールできないとのこと.
一個ずつやってみるか.
$ sudo pip install tornado $ sudo pip install nose ... Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/man'
環境のparmissionエラーかなにかが出たが,再度実行すると出ないし問題ないみたい.
sixの更新をしてみる
$ sudo pip install six -U ... Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
更新できない?uninstallを頑なに拒んでくるんだが.
こいつは無視できないのか?
$ sudo -H pip install awscli --upgrade --ignore-installed six $ aws help
インストールできた...!!!
さて,忘れないうちにAWS CLIのプロファイルも作っておきましょう.
アクセスキーは,AWSコンソールの,認証情報>ユーザーから作れます.
$ aws configure --profile <profile名> AWS Access Key ID [None]: AWS Secret Access Key [None]: Default region name [None]: ap-northeast-1 Default output format [None]: json $(aws ecr get-login --no-include-email --profile <profile名>) #自動ログイン
ようやくこれでコンテナイメージをpushできる!
と思いきや
$ docker tag <コンテナイメージ名>:<ローカルのタグ> <AWS-ECRリポジトリに登録するイメージタグ> #ECRリポジトリ作成時の指示通りに進める $ docker push <タグ名> ... no basic auth credentials
あーーーー,認証エラー.
これは調べてみると,リージョンがずれていた模様.
$ vi ~/.aws/config
で書き換えて,再ログインし,実行!!!
無事push成功しました.
立ち上げようと思い,Fargateのタスク定義から,コンテナイメージURIを選択.
実行しようと思ったら,
Security group ... does not appear to belong to the same VPC as the input subnets.
というエラーが.
サブネットを変えて,タスク定義を編集し,実行してみると,うまくいった.
IPv6はdisableでもいいらしい.v4が使えるからか.ネットワーク周りは,ざっくりとした理解しかしていないからもっと精緻に知っておく必要があるなぁ.
起動は一瞬するんだけど,すぐにPENDINGになり,タスクが消えてしまう.
これはなんだろう.コンテナの起動はローカルでは成功しているのに.設定がなにか間違っているのか?
...続く
参考
以下の記事を参考にさせていただきました.
早速AWS Fargateで、ECSで動かしているタスクを動かしてみた! - コネヒト開発者ブログ
AWS CLI のインストールと設定 - Amazon Kinesis Data Streams
https://saku.io/failed-to-install-awscli-on-mac/
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/common-errors-docker.html#error-403
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
DockerでRailsを動かす その2
実現したいこと
Docker上でRailsを動かしたい.その2です.
前回の戦いはこちら
やったこと
以下のファイルを変更,追加してローカルDBに接続できるかを調整
docker-compose.yml
version: '3' services: web: container_name: rails-sample-app build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/usr/src/app ports: - "3000:3000"
database.yml
default: &default adapter: postgresql encoding: utf8 pool: 5 # 以下の3つを追加 username: <%= ENV.fetch('DB_USERNAME', 'root') %> password: <%= ENV.fetch('DB_PASSWORD', 'dummy') %> # RailsサーバとPostgreSQLサーバが同じ場合 host: <%= ENV.fetch('DB_HOST', 'db') %> development: <<: *default database: sample-db test: <<: *default database: sample-db production: <<: *default database: hello_rails_production username: hello_rails password: <%= ENV['HELLO_RAILS_DATABASE_PASSWORD'] %>
env.dev
DB_USERNAME= <usernamehoge> DB_PASSWORD= <passwordhoge> DB_HOST=docker.for.mac.localhost ~
なんかうまくいかないよう.すぐコンテナがダウンしてしまう.
Could not locate Gemfile or .bundle/ directory
とのこと.パスがおかしいのか?
Dockerfileを編集してみる
Dockerfile
FROM ruby:2.3.7 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs ENV APP_ROOT /usr/src/app RUN mkdir $APP_ROOT WORKDIR $APP_ROOT ADD app/Gemfile $APP_ROOT ADD app/Gemfile.lock $APP_ROOT RUN gem install bundler #追加.これが必要? RUN bundle install ADD app $APP_ROOT
$ docker compose build $ docker compose up
また失敗.同じエラーがでる.全然クリティカルな解決ができない...
修正
Dockerfile
FROM ruby:2.3.7 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs ENV APP_ROOT /usr/src/app RUN mkdir $APP_ROOT WORKDIR $APP_ROOT ADD app/Gemfile $APP_ROOT/Gemfile # ここじゃないか...? ADD app/Gemfile.lock $APP_ROOT/Gemfile.lock RUN gem install bundler #追加.これが必要? RUN bundle install ADD app $APP_ROOT
また失敗
Dockerfile
FROM ruby:2.3.7 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs ENV APP_ROOT /app #ここのパスがappであればうまくいく RUN mkdir $APP_ROOT WORKDIR $APP_ROOT ADD app/Gemfile $APP_ROOT/Gemfile ADD app/Gemfile.lock $APP_ROOT/Gemfile.lock RUN gem install bundler RUN bundle install ADD app $APP_ROOT
成功した...
理由がよくわかっていないのが残念だが,コピー先がうまくいっていなかったのだろうか.ディレクトリがうまく作成できていなかったのだろうか
localhost:3000
でつなぐと,Railsの初期画面が...!!!
やっとのことでRailsをDocker上で動かせました.
続く...
参考
以下の記事を参考にさせていただきました.
既存のRailsアプリをDocker化し、ローカルのDBに接続する方法 | Enjoy IT Life
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
Macのローカルにpgをインストールするときにはまったこと
実現したいこと
postgresqlをgemでインストールしたかった
やったこと
Gemfile
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.3.7' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.2.0' # Use postgresql as the database for Active Record gem 'pg', '>= 0.18', '< 2.0' # Use Puma as the app server gem 'puma', '~> 3.11' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'mini_racer', platforms: :ruby # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.5' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use ActiveStorage variant # gem 'mini_magick', '~> 4.8'
$ bundle install
これでとりあえずアプリは動くよなー
と,思いきや...
Installing pg 1.1.3 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /private/var/folders/sw/fst19tjs2bnf_05_g6gg8wcc0000gn/T/bundler20181111-33236-o5h7onpg-1.1.3/gems/pg-1.1.3/ext /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20181111-33236-70rx9k.rb extconf.rb checking for pg_config... yes Using config values from /usr/local/bin/pg_config checking for libpq-fe.h... yes checking for libpq/libpq-fs.h... yes checking for pg_config_manual.h... yes checking for PQconnectdb() in -lpq... no checking for PQconnectdb() in -llibpq... no checking for PQconnectdb() in -lms/libpq... no Can't find the PostgreSQL client library (libpq)
こんな感じのエラーが出て...
$ brew install libpq
これで解決!?
かと思いきや,また同じエラーが...
これに従い,
f you need to have libpq first in your PATH run: echo 'export PATH="/usr/local/opt/libpq/bin:$PATH"' >> ~/.bash_profile For compilers to find libpq you may need to set: export LDFLAGS="-L/usr/local/opt/libpq/lib" export CPPFLAGS="-I/usr/local/opt/libpq/include"
パスを3つ追加してもだめ,
$ source ~/.bash_profile
もしているけど,同じエラーが出る.
これで解決
$ sudo env ARCHFLAGS="-arch x86_64" gem install pg
参考
以下の記事を参考にさせていただきました.
ruby on rails - Can't find the PostgreSQL client library (libpq) - Stack Overflow
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
localにPostgresqlをインストールし,DBを立ち上げる
実現したいこと
MacにBDを立ち上げていろいろしたい.
でもMysqlじゃなくてPosgreがいいなーと思い,調べてみた
やったこと
$ brew install postgresql $ initdb /usr/local/var/postgres -E utf8 $ postgres --version $ postgres -D /usr/local/var/postgres $ psql -l
.bash_profile
# PostgreSQL設定(DBの置き場所) export PGDATA=/usr/local/var/postgres
起動時
$ pg_ctl -l /var/log/postgres start
終了時
$ pg_ctl stop
ユーザー追加
$ createuser -P <pg-user>
DBの作成
$ createdb example-db -O <pg-user>
ユーザーとDBの確認
$ psql -q -c'select * from pg_user' example-db
DB接続
$ psql -U <pg-user> example-db
DB接続解除(\はoption+¥)
\q
注意点
- pgのインストールは結構時間かかります.10分くらいはみておいていいかも.
- pathを通すときは,以下のコマンドを打たないと反映されない
$ source ~/.bash_profile
参考
以下の記事を参考にさせていただきました.
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
DockerでRailsを動かす その1
実現したいこと
Dockerの導入に伴い,RailsプロジェクトをDocker上で動かします. すでに,Dockerのインストールは行っており,環境はMacで行います.
やったこと
以下の構成でやってみます
Gemfile
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.3.3' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.2.0' # Use postgresql as the database for Active Record gem 'pg', '>= 0.18', '< 2.0' # Use Puma as the app server gem 'puma', '~> 3.11' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # See https://github.com/rails/execjs#readme for more supported r untimes # gem 'mini_racer', platforms: :ruby # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.5' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7'
docker-compose.yml
version: '3' services: web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - ./app:/app ports: - 3000:3000 # environment: # DATABASE_HOST: host.docker.internal
Dockerfile
FROM ruby:2.3.3 ENV LANG C.UTF-8 # apt-utils is not installed対策 ENV DEBIAN_FRONTEND noninteractive ENV DEBCONF_NOWARNINGS yes RUN apt-get update && apt-get install -y build-essential libpq-dev postgresql-client qt5-default qt5-qmake libqt5webkit5-dev RUN gem install capybara-webkit --no-ri --no-rdoc RUN gem install rails RUN mkdir /app WORKDIR /app COPY ./app /app # Gitの認証情報 COPY ./git-credential-git-token /usr/local/bin RUN git config --global credential.helper git-token ADD /app/Gemfile /app/Gemfile ADD /app/Gemfile.lock /app/Gemfile.lock RUN gem install bundler RUN bundle install EXPOSE 3000 CMD bundle exec rails s
$docker-compose up -d
してみる.
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build. Creating rails-gem-env-test_web_1 ... done
あれ?コンテナが立ち上がらない... なんでだろう.Rails sしているのに
もっと簡単な構成でやってみる
Dockerfile
FROM ruby:2.3.7 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs ENV APP_ROOT /usr/src/app WORKDIR $APP_ROOT ADD app/Gemfile $APP_ROOT ADD app/Gemfile.lock $APP_ROOT RUN bundle install ADD app $APP_ROOT
docker-compose.yml
version: '3' services: web: container_name: rails-sample-app build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - pg-db:/usr/src/app ports: - "3000:3000" #depends on では,pg-dbを起動させてからwebを起動する.という順番を設定できる depends_on: - sample-db env_file: .env.dev volumes: sample-db: driver: local ~
$ bundle install
してから,$ docker-compose up -d
する
$ rails newしておく
database.yml
default: adapter: postgresql encoding: unicode pool: 5 # 以下の3つを追加 username: <user-name> password: <password> # RailsサーバとPostgreSQLサーバが同じ場合 host: localhost development: <<: *default database: sample-db test: <<: *default database: sample-db
bundle installがうまくいかないので,さらにGemfileを書き換え
Gemfile
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.3.7' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.2.0' # Use postgresql as the database for Active Record gem 'pg', '>= 0.18', '< 2.0' # Use Puma as the app server gem 'puma', '~> 3.11' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'mini_racer', platforms: :ruby # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.5' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use ActiveStorage variant # gem 'mini_magick', '~> 4.8' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development # Reduces boot times through caching; required in config/boot.rb gem 'bootsnap', '>= 1.1.0', require: false group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] end group :development do # Access an interactive console on exception pages or by calling 'console' anywhere in the code. gem 'web-console', '>= 3.3.0' gem 'listen', '>= 3.0.5', '< 3.2' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end group :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '>= 2.15', '< 4.0' gem 'selenium-webdriver' # Easy installation and use of chromedriver to run system tests with Chrome gem 'chromedriver-helper' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
$ rake db:migrate
したら怒られた.
rake aborted! Psych::BadAlias: Cannot load `Rails.application.database_configuration`: Unknown alias: default
&defaultがなかったみたい.修正
database.yml
default: &default adapter: postgresql encoding: unicode pool: 5 # 以下の3つを追加 username: pg-taka password: pg-taka # RailsサーバとPostgreSQLサーバが同じ場合 host: localhost development: <<: *default database: sample-db test: <<: *default database: sample-db
$ rake db migrate
成功した.
$ rake db:setup
実行
いけるかなとおもいきや...
Caused by: PG::InsufficientPrivilege: ERROR: permission denied to create database
これはなんだ.権限ないのか.
権限を確認する
$ psql -U <権限のあるユーザー名> -d <database> # \du Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- <今回のUSER> | Superuser | {} <superuser> | Superuser, Create role, Create DB, Replication, Bypass RLS | {} # ALTER ROLE "今回のUSER" WITH SUPERUSER;
権限がついた. 一通りの権限を渡して,再チャレンジ
$ rake db:setup Database 'sample-db' already exists Database 'sample-db' already exists -- enable_extension("plpgsql") -> 0.0356s -- enable_extension("plpgsql") -> 0.0224s
通った...!!!
最後に,$docker-compose up -d
しようと思ったが失敗したので,再度'docker-compose.yml'を書き換え
docker-compose.yml
version: '3' services: web: container_name: rails-sample-app build: . command: bundle exec railss -p 3000 -b '0.0.0.0' volumes: - ./app:/app ports: - "3000:3000" environment: DATABASE_HOST: host.docker.internal
コンテナは一応立ち上がったが,localhost:3000につなぐと
return PG::Connection.new( *args )
エラーが...
Docker導入までの道のりは遠い.
続く...
参考
以下の記事を参考にさせていただきました.
インストールからRails-PostgreSQL環境を整える - Qiita
MacOSX YosemiteでRails4.xを動かして、Postgresと繋げるときのメモ - Qiita
本記事について
本記事は,学習を目的に書かれています. 間違い,改良案などございましたら,コメントしていただけると幸いです. 基本的に編集途中ですので,何を書いてほしいかもコメントいただけると, その情報を中心に追記します.