質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

Docker Rspecのテスト失敗時tmpファイルにスクリーンショットが保存されない

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,020

score 12

Docker+Nginx環境で開発しているのですが、Rspecのシステムスペックでテスト失敗時にtmp/screenshots/に画像が自動保存されるはずなのですが、保存されずtmpフォルダが空のままという状況です。(ちなみにいうとlogも出力されないです。からのフォルダのままです。)

screeenshotsフォルダを手動で作ったりしましたが変わりませんでした。おそらくDockerのtmpのマウントがうまくいっていないのかなと推測しているのですが、調べても同じ事例がでてこず完全に行き詰ってしまったのでご教授いただけますと大変助かります。

何卒宜しくお願い致します。
containar/Dockerfile(Nginx用

FROM nginx:1.15.8

# インクルード用のディレクトリ内を削除
RUN rm -f /etc/nginx/conf.d/*

# Nginxの設定ファイルをコンテナにコピー
COPY nginx.conf /etc/nginx/conf.d/webapp.conf

# ビルド完了後にNginxを起動
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
nginx.conf
# プロキシ先の指定
# Nginxが受け取ったリクエストをバックエンドのpumaに送信
upstream webapp {
  # ソケット通信したいのでpuma.sockを指定
  server unix:///webapp/tmp/sockets/puma.sock;
}

server {
  listen 80;
  # ドメインもしくはIPを指定
  server_name 192.168.hoge.hoge (念のため伏せています);

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  # ドキュメントルートの指定
  root /webapp/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  $uri/index.html $uri @webapp;
  keepalive_timeout 5;

  # リバースプロキシ関連の設定
  location @webapp {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://webapp;
  }
}

docker-compose.yml

version: '3'
services:
  app:
    build:
      context: .

    env_file:
      - ./environments/db.env
    command: bundle exec puma -C config/puma.rb
    volumes:
      - .:/webapp
      - bundle:/bundle
      - public-data:/webapp/public
      - tmp-data:/webapp/tmp
      - log-data:/webapp/log
    depends_on:
      - db
    tty: true
    stdin_open: true

  db:
    image: mysql:5.7
    env_file:
      - ./environments/db.env
    volumes:
      - db-data:/var/lib/mysql

  web:
    build:
      context: containers/nginx
    volumes:
      - public-data:/webapp/public
      - tmp-data:/webapp/tmp
    ports:
      - 80:80
    depends_on:
      - app

volumes:
  public-data:
  tmp-data:
  log-data:
  db-data:
  bundle:
    driver: local


Dockerfile(MySQL,Railsアプリ用)

FROM ruby:2.7.1

# リポジトリを更新し依存モジュールをインストール
RUN apt-get update -qq && \
  apt-get install -y build-essential \
  nodejs

# yarnパッケージ管理ツールインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
  curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
  echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
  apt-get update && apt-get install -y yarn

RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add \
  && echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list \
  && apt-get update -qq \
  && apt-get install -y google-chrome-stable libnss3 libgconf-2-4

# chromedriverの最新をインストール
RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` \
  && curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip \
  && unzip /tmp/chromedriver_linux64.zip \
  && mv chromedriver /usr/local/bin/

# Imagemagicをインストール
RUN apt-get update && apt-get install -y imagemagick libmagick++-dev

# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && \
  apt-get install -y nodejs

# ルート直下にwebappという名前で作業ディレクトリを作成(コンテナ内のアプリケーションディレクトリ)
RUN mkdir /webapp
WORKDIR /webapp

# ホストのGemfileとGemfile.lockをコンテナにコピー
COPY Gemfile /webapp/Gemfile
COPY Gemfile.lock /webapp/Gemfile.lock

# bundle installの実行
RUN bundle install

# ホストのアプリケーションディレクトリ内をすべてコンテナにコピー
COPY . /webapp

# puma.sockを配置するディレクトリを作成
RUN mkdir -p tmp/sockets


puma.rb

threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port        ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart

app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"

stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true


$ docker volume inspect webapp_tmp-dataの出力

[
    {
        "CreatedAt": "2020-09-05T10:12:43Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "webapp",
            "com.docker.compose.version": "1.25.5",
            "com.docker.compose.volume": "tmp-data"
        },
        "Mountpoint": "/var/lib/docker/volumes/webapp_tmp-data/_data",
        "Name": "webapp_tmp-data",
        "Options": null,
        "Scope": "local"
    }
]
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • unhappychoice

    2020/09/05 21:03

    テストのプロセスはどのように実行しているのでしょうか ( `docker run bin/rspec` ?

    キャンセル

  • Kiyobun510

    2020/09/05 21:14

    度々ご回答いただきありがとうございます!

    docker-compose exec rspec spec/system/~ のような感じで実行しております。

    キャンセル

回答 1

0

volumes:
      - .:/webapp
      - bundle:/bundle
      - public-data:/webapp/public
      - tmp-data:/webapp/tmp
      - log-data:/webapp/log

この様に書くと webapp/tmpはtmp-dataと同期されるのでローカルのtmpフォルダとdockerのwebapp/tmpは同期されないはずです。

多分nginx使う関係でtmpフォルダとpublicフォルダをnginxと同期したいので書いている感じですかね

tmpでもpublicでもlogでもない場所にスクリーンショットを吐き出して見てはどうでしょうか?

うまくいくかは分かりませんが

volumes:
      - .:/webapp
      - bundle:/bundle
      - public-data:/webapp/public
      - tmp-data:/webapp/tmp/sockets
      - log-data:/webapp/log

みたいな感じで指定するのもアリかもしれません

いずれにせと今のdocker-compose.ymlの書き方だとローカルのtmpフォルダとdockerのtmpフォルダは同期されないと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る