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

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

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

5308閲覧

.dockerignoreの反映がされない。 docker-compose Dockerfile

kurukururin

総合スコア21

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

2クリップ

投稿2019/10/01 00:17

編集2019/10/01 00:39

現在、既存のrailsアプリケーションの開発をdocker上で動かそうと思っています。

これまではローカル環境で行なっていたのでbundle installのインストール先をvendor/bundleに指定していました。

しかし、Docker上でvendor/bundleにインストールする必要はなく、rubyイメージで指定されているように、コンテナ内の/usr/local/bundleにインストールされることを想定に開発を進めたいと思っています。

そのため、ローカル環境で開発していたが故に存在していたvendor/bundle内に存在するgemたちをコンテナ内にコピーされることを回避したいと思っています。

また、vendor/bundleにインストールされるように指定している.bundle/configファイルもコンテナ内にコピーされることを回避したいです。

現在、ディレクトリ構造は以下の通りです。

myapp ├── backend │ ├── .bundle │ │ ├── config │ ├── vendor │ │ ├──bundle │ │ │ ├──Dockerfile │ │ │ ├──.dockerignore └── docker-compose.yml

myappディレクトリ内にdocker-compose.ymlファイルとbackendディレクトリがあり、
backendディレクトリにrailsに必要なディレクトリ、ファイルが存在すると行った形になっています。

.dockerignoreファイルを以下のように記載しました。

/vendor/bundle/ /.bundle/

しかし、この状態でdocker-compose buildを実行し、コンテナを立ち上げてみたところ.dockerignoreで指定したはずのvendor/bundleディレクトリがまだ存在している状態になっていました。

これはどういったことが原因で.dockerignoreの設定が反映されていないのでしょうか?

docker-compose.yml

version: "3" services: backend: build: context: ./backend command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - ./backend:/myapp - bundle:/usr/local/bundle ports: - "3000:3000" links: - db db: image: postgres:12 ports: - "5432:5433" volumes: - postgresql-data:/var/lib/postgresql/data frontend: build: context: ./frontend volumes: - ./frontend:/myapp - /myapp/node_modules ports: - "8080:8080" volumes: postgresql-data: driver: local bundle: driver: local

Dockerfile

FROM ruby:2.5.0 RUN apt-get update -qq && apt-get install -y nodejs postgresql-client RUN mkdir /myapp WORKDIR /myapp COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"]

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2019/10/01 01:47

たぶんbundle installでインストールしているので、試しにコメントアウトして試してみてはどうでしょうか?
kurukururin

2019/10/01 02:09

DockerfileのRUN bundle installをコメントアウトしてbuildした後、docker-compose run backend bashでvendor/bundleの中身を確認したところまだ存在していました。 また、dockerfileのbundle installは--path vendor/bundleをつけていないので、インストール先が/usr/local/bundleになるはずだと思うのですがどうなんでしょう。
guest

回答1

0

ベストアンサー

もし、./myapp ディレクトリ上でdocker-compose builddocker-compose upを実行している場合、./myqpp/backend配下にある.dockerignoreの内容は反映されないのではないかと思います。
言い換えるならば、./myapp/backendディレクトリ上に移動してからdocker build .したイメージを立ち上げたときには、.dockerignoreの内容が反映された状態になっているのではないかなと思います。

可能であれば、.dockerignore./myappディレクトリに移動して、.dockerignoreの内容も以下のような定義に書き換えた上でdocker-compose buildを実行すると、personaさんの期待どおりの動作になるかもしれません。

backend/vendor/bundle/ backend/.bundle/

投稿2019/10/01 04:18

uzyexe

総合スコア239

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kurukururin

2019/10/01 07:45

ご回答ありがとうございます。 myappディレクトリにdockerignoreを配置して backend/vendor/bundle/を記載してdocker-compose upしてみたのですが、まだコンテナ内にvendor/bundleの中身が存在していました。。 cacheの問題かと思いimageを一旦決してからbuildし直すなどもしてみたのですがダメでした。。
kurukururin

2019/10/01 08:06

この動作が起こっている原因としてdocker-compose.ymlにて volume: ./backend:myapp  としているため、ビルド時にvendor/bundleが無視されたとしてもコンテナ起動時にvolumeのせいでvendor/bundleがコンテナ内に同期されているからという仮説を立てているのですが、どうでしょう。。
uzyexe

2019/10/01 08:38 編集

なるほど。とすると、さらにvolumesの定義を応用して、docker-compose.yml内に定義されているbackendコンテナのvolumesを以下のように書き換えるとうまくいくかもしれません。 volumes: - ./backend:/myapp - bundle:/usr/local/bundle - /myapp/vendor/bundle - /myapp/.bundle この定義でコンテナ内にある/myapp/vendor/bundleと/myapp/.bundleに空のボリュームを追加することによって、空のディレクトリ化できるのではないかなと思います。
kurukururin

2019/10/01 08:54

ご指摘の通りにしてみたところ、コンテナ内のvendor/bundle内は望んでいた通り空の状態になりました! 先ほどの僕の仮説が合っているのかは分かりませんが、試しに上手くいかなかった時のファイルの設定でコンテナを起動してみたのですが、.bundle/configのファイルをホスト側で更新してみてもコンテナ内に同期されていませんでした。 他のcontrollerなどのファイルを更新するとしっかり同期されていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問