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

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

ただいまの
回答率

88.60%

【Docker】Rails+MySQL+nginxで仮想環境構築【続】

解決済

回答 3

投稿 編集

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

ta539tg70

score 17

Railsも環境構築も初心者ですが、Docker for Macを使用してRails+MySQL+nginxの構成で仮想環境を構築しようとしています。
先日こちらのスレで質問させていただいた者です。←この問題はお陰様で解決したのですが、また新たなエラーに直面してしまいました。

https://qiita.com/zwirky/items/88a6c5dd16d0f9e9fea5
上記ページの手順に従い、コードをほぼコピペでターミナルに打ち込んでいったところ、ステップ8の「起動を確認」で詰まってしまいました。

具体的には、文中にあるコマンドdocker-compose run web rails new . --force --database=mysql --skip-bundleを実行すると、途中で「ERROR: Service 'db' failed to build: ADD failed: stat /var/lib/docker/tmp/docker-builder475566792/mysql/my.cnf: no such file or directory」というエラーが出てストップしてしまいます。
よく読んでみると「mysql/my.cnfなんてファイルはないよ!」と怒られているように思うのですが、ステップ5の「MySQLコンテナの設定」で作成したmy.cnfがちゃんと存在しています。どうしたらちゃんと見つけてもらえるのでしょうか...。

参考ページ内のコードを変更した箇所は下記の通りです。

  1. 作業用ディレクトリは「work_dir」ではなく「my_app」に
  2. ダウンロードしたイメージのバージョン
    ruby: 2.5.1
    nginx: 1.15.3
    mysql: 5.7.23
  3. #2に伴いそれぞれのDockerfile内に記述するバージョン
  4. ステップ4の「Ruby(Railsを利用するための)コンテナの設定」で作成するGemfile内に記述するRailsのバージョン(5.1.0ではなく5.2.1に)

書いてあるコマンドの意味はほとんど分かっておらず、そのためほぼコピペで使用している次第ですが、どなたか解決策をご教示いただけますと幸いです。よろしくお願い致します。

追記@2018.09.11

試行錯誤を繰り返しながらdocker-compose.ymlのdb欄を下記のように書き換えてdocker-compose runを試したところ、ちょっとした進捗=新しいエラーが出ましたので追記させていただきます。

★書き換え後
db:
build:
context: ./containers/mysql
(dockerfile項目は削除)

★表示される新しいエラー
Starting my_app_datastore_1 ... error

ERROR: for my_app_datastore_1  Cannot start service datastore: b'Mounts denied: \r\nThe path /etc/localtime\r\nis not shared from OS X and is not known to Docker.\r\nYou can configure shared paths from Docker -> Preferences... -> File Sharing.\r\nSee https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.\r\n.'

ERROR: for datastore  Cannot start service datastore: b'Mounts denied: \r\nThe path /etc/localtime\r\nis not shared from OS X and is not known to Docker.\r\nYou can configure shared paths from Docker -> Preferences... -> File Sharing.\r\nSee https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.\r\n.'
ERROR: Encountered errors while bringing up the project.

当初の「my.cnfが見つからない」エラーはひとまず抜けて、docker imagesをするとmy_app_dbというのが一覧に表示されるようにはなっています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

check解決した方法

0

docker-compose.yml中の「- /etc/localtime:/etc/localtime:ro」を削除した上でdocker-composeを実行することで先に進みました。

ご協力くださった回答者の方々、ありがとうございました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

記事見ましたが、

ADD mysql/my.cnf /etc/my.cnf

ではなく

ADD my.cnf /etc/my.cnf

ではないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/10 22:37

    まずdocker-compose.ymlを下記の通り書き換えました。(大前提として、この書き換え方で合っておりますでしょうか?)

    version: '2'
    services:
    datastore:
    image: busybox
    volumes:
    - /share
    - ./containers/mysql/volumes:/var/lib/mysql
    - /etc/localtime:/etc/localtime:ro
    server:
    build:
    context: ./containers/nginx
    ports:
    - '80:80'
    volumes_from:
    - datastore
    depends_on:
    - datastore
    web:
    build:
    context: .
    dockerfile: ./containers/ruby/Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
    - '3000:3000'
    volumes:
    - .:/app
    - /etc/localtime:/etc/localtime:ro
    volumes_from:
    - datastore
    depends_on:
    - db
    links:
    - db
    - db:database
    - db:mysql
    extends:
    file: ./containers/mysql/password.yml
    service: password
    db:
    build:
    context: ./containers/mysql/Dockerfile
    ports:
    - '3306:3306'
    volumes_from:
    - datastore
    depends_on:
    - datastore
    extends:
    file: ./containers/mysql/password.yml
    service: password

    この上でdocker-compose run web rails new . --force --database=mysql --skip-bundleを実行すると下記のエラーが出ました。コピペしますのでご参照ください。

    $ docker-compose run web rails new . --force --database=mysql --skip-bundle
    Building db
    Traceback (most recent call last):
    File "docker-compose", line 6, in <module>
    File "compose/cli/main.py", line 71, in main
    File "compose/cli/main.py", line 127, in perform_command
    File "compose/cli/main.py", line 282, in build
    File "compose/project.py", line 378, in build
    File "compose/service.py", line 1067, in build
    File "site-packages/docker/api/build.py", line 142, in build
    TypeError: You must specify a directory to build in path
    [1641] Failed to execute script docker-compose

    私も色々調べてみたところコンテキストというのが悪さをしているような気がしてきてはいるのですが...どう直したらいいのかまでは答えが出ず...。解決しなさすぎて段々心が痛くなってまいりました。全然1時間でできません。懲りずにもう少々お付き合いいただけましたら幸いです...。申し訳ありません。

    キャンセル

  • 2018/09/10 23:17

    環境構築にハマって時間を溶かすことはよくあることなので気にしないで良いですよ。何か分かったらまた書きます。

    キャンセル

  • 2018/09/11 12:17

    ありがとうございます。
    ちょっとした進捗がありましたので質問文に追記をさせていただきました。

    キャンセル

0

Dockerfileとmy.cnfはもしかすると同じmysqlディレクトリの中にありますか?
その場合は、Dockerfile内のADD mysql/my.cnf /etc/my.cnfを、ADD my.cnf /etc/my.cnfに変えてみてください。

また、こういった質問のときは、作業環境のディレクトリ構成や、Dockerfile, Docker-compose.ymlの内容などを載せるとよいと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/10 16:30 編集

    記事と同じことをやっていて、フォルダ階層やファイル内容もほぼ同じなので省いてしまいました。失礼致しました。

    ★ディレクトリ構成
    my_app
    ├── Gemfile
    ├── Gemfile.lock
    ├── containers
    │ ├── mysql
    │ │ ├── Dockerfile
    │ │ ├── my.cnf
    │ │ └── password.yml
    │ ├── nginx
    │ │ ├── Dockerfile
    │ │ ├── default.conf
    │ │ └── nginx.conf
    │ └── ruby
    │ └── Dockerfile
    └── docker-compose.yml

    ★docker-compose.yml
    version: '2'
    services:
    datastore:
    image: busybox
    volumes:
    - /share
    - ./containers/mysql/volumes:/var/lib/mysql
    - /etc/localtime:/etc/localtime:ro
    server:
    build:
    context: .
    dockerfile: ./containers/nginx/Dockerfile
    ports:
    - '80:80'
    volumes_from:
    - datastore
    depends_on:
    - datastore
    web:
    build:
    context: .
    dockerfile: ./containers/ruby/Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
    - '3000:3000'
    volumes:
    - .:/app
    - /etc/localtime:/etc/localtime:ro
    volumes_from:
    - datastore
    depends_on:
    - db
    links:
    - db
    - db:database
    - db:mysql
    extends:
    file: ./containers/mysql/password.yml
    service: password
    db:
    build:
    context: .
    dockerfile: ./containers/mysql/Dockerfile
    ports:
    - '3306:3306'
    volumes_from:
    - datastore
    depends_on:
    - datastore
    extends:
    file: ./containers/mysql/password.yml
    service: password

    おっしゃる通りmy.cnfとMySQL用のDockerfileは同じmysqlディレクトリ内にあります。
    ご教示いただいたようにADD文中の「mysql/」を消してみても、「Service 'db' failed to build: ADD failed: stat /var/lib/docker/tmp/docker-builder052980080/my.cnf: no such file or directory」とのエラーが返ってきてしまいます。mysqlフォルダを一度削除して、mysqlフォルダ内のファイルを全て作り直して試してもみましたがエラーに変わりはありませんでした...。

    キャンセル

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

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

関連した質問

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