□解決したいこと
dockerの初心者です。
現在、dockerをrailsアプリケーションに導入しようと考えております。
docker-composeでdockerを起動し、localhostで投稿しようとしたところ、pdf投稿のみできません。
doker導入前の正しい挙動
https://gyazo.com/b055fb77c75f9952b3256743d0677fc0
docker-compose時の挙動
https://gyazo.com/11fdbcefd336a4ae84bca8eb818442ab
状況の確認
- 当該、pdfの投稿はcarrier waveとrmagicを用いて、pdfの投稿をしております。
- 投稿した際、pdfをpngに変換してトップページに表示するしようとしております。
- jpegやpngの投稿は問題なくできます。
- 指定したディレクトリの中にpdfは保存されていました。https://gyazo.com/fc0a517116caff7f1b8c1f9b6237725d
- pdfをpngに変換したファイルは生成されていなかった。
- データベースにも投稿がありませんでした。
→以上より、まずはpdfをpngに変換できないことを解決したいのですが、アドバイスいただけましたら幸いです。
docker-compose時のターミナルの内容
html
1web_1 | Started POST "/tips" for 192.168.80.1 at 2021-06-14 21:54:59 +0000 2web_1 | Cannot render console from 192.168.80.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 3web_1 | Processing by TipsController#create as HTML 4web_1 | Parameters: {"authenticity_token"=>"Ek4Dphv2GvGYfUQ+7FHi1WYHk6v+kMUOkV/q00JKm/lYH6TKGTjYetpqn4Bnho68VRm997RGIMSAQtcph0NRIg==", "tip"=>{"title"=>"テスト", "name"=>"test", "category_id"=>"3", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007ff5bc2067f0 @tempfile=#<Tempfile:/tmp/RackMultipart20210614-1-82mpl8.pdf>, @original_filename="名称未設定のコピー.pdf", @content_type="application/pdf", @headers="Content-Disposition: form-data; name=\"tip[image]\"; filename=\"\xE5\x90\x8D\xE7\xA7\xB0\xE6\x9C\xAA\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\xAE\xE3\x82\xB3\xE3\x83\x92\xE3\x82\x9A\xE3\x83\xBC.pdf\"\r\nContent-Type: application/pdf\r\n">, "description"=>"tst"}, "commit"=>"投稿する"} 5web_1 | User Load (1.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 6web_1 | (0.6ms) BEGIN 7web_1 | ↳ app/models/tip_tag.rb:20:in `block in save' 8web_1 | User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 9web_1 | ↳ app/models/tip_tag.rb:20:in `block in save' 10web_1 | Tag Load (1.7ms) SELECT `tags`.* FROM `tags` WHERE `tags`.`name` = 'test' ORDER BY `tags`.`id` ASC LIMIT 1 11web_1 | ↳ app/models/tip_tag.rb:26:in `block (2 levels) in save' 12web_1 | DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1. To continue case sensitive comparison on the :name attribute in Tag model, pass `case_sensitive: true` option explicitly to the uniqueness validator. (called from block (2 levels) in save at /archtips/app/models/tip_tag.rb:27) 13web_1 | Tag Exists? (2.2ms) SELECT 1 AS one FROM `tags` WHERE `tags`.`name` = BINARY 'test' AND `tags`.`id` != 1 LIMIT 1 14web_1 | ↳ app/models/tip_tag.rb:27:in `block (2 levels) in save' 15web_1 | TipTagRelation Load (4.0ms) SELECT `tip_tag_relations`.* FROM `tip_tag_relations` WHERE `tip_tag_relations`.`tip_id` IS NULL AND `tip_tag_relations`.`tag_id` = 1 ORDER BY `tip_tag_relations`.`id` ASC LIMIT 1 16web_1 | ↳ app/models/tip_tag.rb:28:in `block (2 levels) in save' 17web_1 | Tag Load (1.5ms) SELECT `tags`.* FROM `tags` WHERE `tags`.`id` = 1 LIMIT 1 18web_1 | ↳ app/models/tip_tag.rb:29:in `block (2 levels) in save' 19web_1 | TipTagRelation Exists? (1.9ms) SELECT 1 AS one FROM `tip_tag_relations` WHERE `tip_tag_relations`.`tag_id` = 1 AND `tip_tag_relations`.`tip_id` IS NULL LIMIT 1 20web_1 | ↳ app/models/tip_tag.rb:29:in `block (2 levels) in save' 21web_1 | (0.9ms) COMMIT 22web_1 | ↳ app/models/tip_tag.rb:19:in `save' 23web_1 | Redirected to http://localhost:3000/ 24web_1 | Completed 302 Found in 443ms (ActiveRecord: 14.7ms | Allocations: 13766) 25web_1 | 26web_1 |
以下、コード
ruby
1database.yml 2 3default: &default 4 adapter: mysql2 5 encoding: utf8 6 pool: <%= ENV.fetch('RAILS_MAX_THREADS') { 5 } %> 7 username: <%= ENV.fetch('DB_USERNAME', 'root') %> 8 password: <%= ENV['MYSQL_ROOT_PASSWORD'] %> 9 socket: /tmp/mysql.sock 10 host: db 11 12development: 13 <<: *default 14 database: archtips_development 15 16test: 17 <<: *default 18 database: test2archtips_test 19 20production: 21 <<: *default 22 database: archtips_production 23 username: root 24 password: <%= ENV['DATABASE_PASSWORD'] %> 25 socket: /var/lib/mysql/mysql.sock
ruby
1docker-compose.yml 2 3version: '3' 4 5services: 6 db: 7 image: mysql:5.6 8 environment: 9 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} 10 ports: 11 - "4306:3306" 12 volumes: 13 - ./db/mysql/volumes:/var/lib/mysql 14 15 web: 16 build: . 17 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" 18 volumes: 19 - .:/archtips 20 ports: 21 - 3000:3000 22 depends_on: 23 - db 24 env_file: .env 25 tty: true 26 stdin_open: true
ruby
1Dockerfile 2FROM ruby:2.6.5 3RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs 4 5RUN mkdir /archtips 6WORKDIR /archtips 7 8COPY Gemfile /archtips/Gemfile 9COPY Gemfile.lock /archtips/Gemfile.lock 10 11RUN gem install bundler 12RUN bundle install 13COPY . /archtips
ruby
1image_uploader.rb 2class ImageUploader < CarrierWave::Uploader::Base 3 # Include RMagick or MiniMagick support: 4 include CarrierWave::RMagick 5 include CarrierWave::MiniMagick 6 # process resize_to_fit: [1000, 1000] 7 8 # Choose what kind of storage to use for this uploader: 9 if Rails.env.development? 10 storage :file 11 elsif Rails.env.test? 12 storage :file 13 else 14 storage :fog 15 end 16 17 if Rails.env.development? || Rails.env.test? 18 storage :file 19 else 20 storage :fog 21 end 22 23 # Override the directory where uploaded files will be stored. 24 # This is a sensible default for uploaders that are meant to be mounted: 25 def store_dir 26 # "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 27 if Rails.env.test? 28 "uploads_#{Rails.env}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 29 else 30 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 31 end 32 end 33 34 35 # Create different versions of your uploaded files: 36 version :thumb do 37 process convert: ['png', 0] 38 process resize_to_limit: [1000, 1000] 39 end 40 41 42end
ruby
1tips_controller.rb 2class TipsController < ApplicationController 3 before_action :authenticate_user!, except: [:index, :show, :search, :detail_search, :trend] 4 before_action :search_tip, only: [:index, :search, :detail_search] 5 6 def index 7 @tips = Tip.includes(:user).order(updated_at: :DESC) 8 end 9 10 def new 11 @tip = TipTag.new 12 end 13 14 def create 15 @tip = TipTag.new(tip_params) 16 tag_list = params[:tip][:name].split(',') 17 if @tip.valid? 18 @tip.save(tag_list) 19 redirect_to root_path 20 else 21 render :new 22 end 23 end 24 25 <省略> 26 27 private 28 29 def tip_params 30 params.require(:tip).permit(:title, :category_id, :description, :image, :name, :id, :_method, :authenticity_token, :commit, 31 :tip).merge(user_id: current_user.id) 32 end 33 34<省略> 35 36 def search_tip 37 @t = Tip.ransack(params[:q]) 38 @category = Category.where.not(id: 1) 39 end 40end
□仮説及び調べたこと
pdfは保存できているが、pngが生成していなかったことから、変換するpdf⇒pngに変換するrmagic,もしくはcarrierwaveの記述に問題があるのではないか?と思い調べてみました。
⇒https://qiita.com/minojiro/items/879616c3569277572859
上記の記事ではbundleinstall前に'apk add'を記述することでRmagic,Carriewwaveを使用可能とのことでした。こちらを参考にdockerfileを変更しました。
ruby
1dockerfile 2 3FROM ruby:2.6.5 4RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs 5 6RUN mkdir /archtips 7WORKDIR /archtips 8 9COPY Gemfile /archtips/Gemfile 10COPY Gemfile.lock /archtips/Gemfile.lock 11 12#以下を追加 13WORKDIR /tmp 14RUN apk add --update --no-cache curl && \ 15 curl -O "http://dl-4.alpinelinux.org/alpine/edge/community/x86_64/imagemagick6-{6.9.9.47-r0,c%2B%2B-6.9.9.47-r0,dev-6.9.9.47-r0,doc-6.9.9.47-r0,libs-6.9.9.47-r0}.apk" && \ 16 apk add --no-cache \ 17 imagemagick6-c%2B%2B-6.9.9.47-r0.apk \ 18 imagemagick6-dev-6.9.9.47-r0.apk \ 19 imagemagick6-libs-6.9.9.47-r0.apk \ 20 imagemagick6-6.9.9.47-r0.apk 21 22RUN gem install bundler 23RUN bundle install 24COPY . /archtips
□結果
挙動に変化はありませんでした。
リンクの表題にもありように、alpineを使ってrmagicを使用したいというのが趣旨のもので、本件はalpineを使っていません。そのため、本件とは関係がないようです。
ただ、そのほかに調べてみても有効な手掛かりは得られませんでした。
docker初心者ですので、根本的なところを見落としていることや、理解不足のところがあるかもしれません。
上記を含めて、アドバイスいただける方いらっしゃいましたら、よろしくお願い申し上げます。
□環境
ruby 2.6.5p114
rmagick (4.2.2)
rails (6.0.3.7)
carrierwave (2.2.2)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。