docker에서 rails를 새로 만들려고 빠졌습니다.

11021 단어 도커Rails프록시

개요



오랜만에 rails로 놀아 보려고 생각하면 빠졌기 때문에 메모.
※단, 2015/10/14 시점의 이야기이므로 주의해 주세요.

골은 proxy 환경인 windows에서 rails가 움직일 때까지.

환경 구축



전제



vagrant로 coreos에 로그인했습니다.

ruby:2.2를 proxy 대응



이번에는 rails:latest와 rails:onbuild를 사용한다.

또 proxy 환경이므로 이하의 사이트의 스크립트를 사용해 부모의 이미지인 「ruby:2.2」를 proxy 환경화.
ぃ tp // 이 m/s ㎺ g03/이고 ms/4b8573686에7 bf218b61

우선 신규 어플을 작성하고 싶기 때문에 「rails:latest」를 build하기 위해 이하를 체크아웃 하는지 그대로 Dockerfile을 작성해 「docker build -t rails:latest .」라든지 실행.
htps : // 기주 b. 코 m / 도 c 케 r ぃ b 등 ry / 라이 ls / b ぉ b / 7926577517 fb 974 f9에서 9 또는 1511162 d6d5 000435 / 도 c 케

이미지가 완성되면 새로운 앱을 만들기 위해 run을 실행.
docker run --rm -it -v "$(pwd)":/usr/src/app -w /usr/src/app rails rails new HOGE -d mysql
  • 실행한 디렉터리가 앱을 만드는 디렉터리입니다.
  • HOGE, 앱 이름
  • DB는 mysql을 지정한다. postgresql을 사용하고 싶으면 -d의 지정으로 변경 가능.

  • 여기까지 잘 가면 Gemfile.lock 의 생성까지 되어 있을 것.

    우선 여기에서 MYSQL 컨테이너를 작성해 컨테이너를 기동해 둔다.
    docker pull mysql
    docker run -p 3306:3306 --name testdb -e MYSQL_ROOT_PASSWORD=password -d mysql
    

    위의 명령을 실행하면 사용자가 root이고 암호가 password 인 mysql 컨테이너가 시작됩니다.

    다음에 개발하기 위해 rails:onbuild를 사용한다.
    htps : // 기주 b. 코 m / 도 c 케 r ぃ b 등 ry / 라이 ls / b ぉ b / 9fb5d2b7 0 f2 에 7029855028 에 07 에 86 아
    위를 체크 아웃하거나 직접 Dockerfile을 만들고 빌드합니다.

    이번에는 환경 변수의 설정도 하고 싶기 때문에 직접 작성한다.
    FROM ruby:2.2
    
    # throw errors if Gemfile has been modified since Gemfile.lock
    RUN bundle config --global frozen 1
    
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    
    ONBUILD COPY Gemfile /usr/src/app/
    ONBUILD COPY Gemfile.lock /usr/src/app/
    ONBUILD RUN bundle install
    
    ONBUILD COPY . /usr/src/app
    
    RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
    RUN apt-get update && apt-get install -y mysql-client postgresql-client sqlite3 --no-install-recommends && rm -rf /var/lib/apt/lists/*
    
    ENV DB_USER root
    ENV DB_PASSWORD password
    ENV DB_NAME testdb
    ENV DB_ADAPTER mysql2
    ENV DATABASE_URL ${DB_ADAPTER}://${DB_USER}:${DB_PASSWORD}@db/${DB_NAME}
    
    EXPOSE 3000
    

    환경 변수에 방금 작성한 mysql의 정보를 설정.

    즉시 컨테이너를 빌드하고 시작합니다.
    # Dockerfileの場所で実行
    docker build -t rails:test .
    
    # 先程作成したアプリのディレクトリに移動して実行
    docker run -it -p 3000:3000 -v $(pwd):/usr/src/app --link testdb:db rails:test bash
    
    bundle install 실행

    rails console을 시작해보십시오.
    root@5949d24c0cac:/usr/src/app# bin/rails c
    /usr/local/bundle/gems/activerecord-4.2.4/lib/active_record/connection_adapters/connection_specification.rb:177:in `rescue in spec': Specified 'mysql2' for database adapter, but the gem is not loaded. Add `g
    em 'mysql2'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError)
    

    오류. . .

    Gemfile에 mysql2도 들어 있기 때문에 어째서인지 조사하면 그 망마의 기사가 있었다.
    ぃ tp // m / Shizuma / ms / 0f9660d5d46 A0012

    mysql2의 버전을 지정하면 된다는 것이므로 위의 기사대로 Gemfile을 수정하고 bundle install
    root@1e8ccf02841a:/usr/src/app# bundle install
    Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine.
    You are trying to install in deployment mode after changing
    your Gemfile. Run `bundle install` elsewhere and add the
    updated Gemfile.lock to version control.
    
    If this is a development machine, remove the Gemfile freeze
    by running `bundle install --no-deployment`.
    
    You have added to the Gemfile:
    * mysql2 (~> 0.3.20)
    
    You have deleted from the Gemfile:
    * mysql2
    

    또한 오류. . . .

    왠지 bundle install --no-deployment 라고 써 있기 때문에 실행.
    root@1e8ccf02841a:/usr/src/app# bundle install --no-deployment
    Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine.
    You are trying to install in deployment mode after changing
    your Gemfile. Run `bundle install` elsewhere and add the
    updated Gemfile.lock to version control.
    
    If this is a development machine, remove the Gemfile freeze
    by running `bundle install --no-deployment`.
    
    You have added to the Gemfile:
    * mysql2 (~> 0.3.20)
    
    You have deleted from the Gemfile:
    * mysql2
    

    오류. . .

    Gemfile.lock이 갱신할 수 없는 것 같기 때문에 관계할 것 같은 곳 봐 보면 Dockerfile에 이런 기술이.
    # throw errors if Gemfile has been modified since Gemfile.lock
    RUN bundle config --global frozen 1
    

    굿쿵 보자.

    HIT.

    전에 rails 했을 때는 아직 없었는지 사용하지 않았을 뿐인지 모르겠다 일단 해제하고 다시 "bundle install"
    bundle config --delete frozen
    bundle install
    

    움직였다.

    rails c
    root@1e8ccf02841a:/usr/src/app# bin/rails c
    Loading development environment (Rails 4.2.4)
    irb(main):001:0> [*1..10].each{|n|p n}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    rails console 움직였다.

    db를 만듭니다.


    bin/rake db:create
    

    HOST에서 확인.
    mysql -h IP_ADDRESS -p
    mysql> show databses;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'databses' at line 1
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | testdb             |
    | mysql              |
    | performance_schema |
    +--------------------+
    4 rows in set (0.00 sec)
    

    DB도 생겼다.

    덧붙여서 IP 주소는 vagrantfile 보거나, host로 ifconfig 실행하면 알 수 있다.

    이어 브라우저에서 확인해 본다.

    rails 컨테이너 안에 들어가
    bin/rails s -b 0.0.0.0



    보였다.

    덧붙여서 처음에는 rails s만으로 실행하면 움직이지 않았으므로 이하를 참고로 해 바인드 옵션을 붙였다.
    참고 htp // 호시. 는 bぉ. jp/엔트리/2015/01/19/203316

    모처럼이니까 뭔가 만들어 보자.
    core@core-01 ~ $ docker exec -it 1e8ccf02841a bash
    root@1e8ccf02841a:/usr/src/app# bin/rake db:migrate
    root@1e8ccf02841a:/usr/src/app# bin/rails g scaffold blog title:string body:string
          invoke  active_record
          create    db/migrate/20151014070727_create_blogs.rb
          create    app/models/blog.rb
          invoke    test_unit
          create      test/models/blog_test.rb
          create      test/fixtures/blogs.yml
          invoke  resource_route
           route    resources :blogs
          invoke  scaffold_controller
          create    app/controllers/blogs_controller.rb
          invoke    erb
          create      app/views/blogs
          create      app/views/blogs/index.html.erb
          create      app/views/blogs/edit.html.erb
          create      app/views/blogs/show.html.erb
          create      app/views/blogs/new.html.erb
          create      app/views/blogs/_form.html.erb
          invoke    test_unit
          create      test/controllers/blogs_controller_test.rb
          invoke    helper
          create      app/helpers/blogs_helper.rb
          invoke      test_unit
          invoke    jbuilder
          create      app/views/blogs/index.json.jbuilder
          create      app/views/blogs/show.json.jbuilder
          invoke  assets
          invoke    coffee
          create      app/assets/javascripts/blogs.coffee
          invoke    scss
          create      app/assets/stylesheets/blogs.scss
          invoke  scss
          create    app/assets/stylesheets/scaffolds.scss
    root@1e8ccf02841a:/usr/src/app# bin/rake db:migrate
    == 20151014070727 CreateBlogs: migrating ======================================
    -- create_table(:blogs)
       -> 0.0703s
    == 20151014070727 CreateBlogs: migrated (0.0709s) =============================
    

    첫 번째 migrate 필요합니까? 이미 잊고 있어. . .

    우선 시작.
    bin/rails s -b 0.0.0.0
    
    http://IP_ADDRESS:3000/blogs 방문.



    할 수 있었다.

    rails console을 만지고 싶었을 뿐인데 결국 시간이 걸렸다.
    이상하네, docker를 사용하면 바로 사용할 수 있다고 전개하고 싶었을 뿐인데 바로 사용할 수 없었다. . .

    나중에 신규 앱을 만들면 지금까지 할 수 있으면 docker-compose 사용하도록 하는 편이 편할까.

    우선 움직이는 곳까지 완료.


  • 컨테이너에 다시 연결하려면 docker exec -it コンテナID bash
  • 컨테이너를 시작하고 연결하려면 docker start -a コンテナID
  • 좋은 웹페이지 즐겨찾기