Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Docker ruby can only concatenate str (not "dict") to str

解決したいこと

Dockerを使用して簡単なrailsでの処理を行おうとして以下のコマンドを入力した際にエラーが出ました。

$docker-compose run web rails new . --force --database=mysql

発生している問題・エラー

TypeError: can only concatenate str (not "dict") to str
[21115] Failed to execute script docker-compose

該当するソースコード

docker-compose.yml

version: '3'
services:
    db:
        image: mysql:8.0
        command: --default-authentication-plugin=mysql_native_password
        volumes:
            - ./src/db/mysql_data:/var/lib/mysql
        environment: 
            MYSQL_ROOT_PASSWORD: password
    web:
        build: .
        command: bundle exec rails s -p 3000 -b '0.0.0.0'
        volumes:
            - ./src:/app
        ports:
            - "3000:3000"
        depends_on:
            - db
Dockerfile

FROM ruby:2.7
RUN 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 -qq \
 && apt-get install -y nodejs yarn
WORKDIR /app
COPY ./src /app
RUN bundle config --lacal set path 'vender/bundle' \
 && bundle install
source 'https://rubygems.org'

gem 'rails', '~> 6.1.0'

その他

Dockerを学習しようと思い誰でもエンジニアさんの動画をみて学習をしていましたが、思わぬエラーに遭遇しました。
調べても解決しなかったためご教授をお願いしたいです。

0

2Answer

RUN bundle config --lacal set path 'vender/bundle' \
 && bundle install

これは--localだと思う。し、言われたままこういう風にDockerfileを作るより

  1. FROM ruby:2.7のみ書いたDockerfileにする
  2. docker-compose build webで一回imageを作り直す
  3. docker-compose --rm run web bashでコンテナ内に入る
  4. 説明にあったようなDockerfileで書いていたコマンドを1つ1つコンテナ内で打ってみる
  5. Dockerfileとは何かが分かりだす
  6. 何をDockerfileに書けばいいか分かってくる

Dockerfileとはただ単にベースとなるlinuxイメージ(ruby:2.7 - v2.7のruby入りヘッドレスlinux)に「こうこうこうしたい」という手順を上から順に書いているだけであって、その順番は自分でコンテナ内でやっていることと変わりません。

  • imageはDockerfileにかかれていた事を保存している(自分専用linuxインストールDVD作った感じ)
  • コンテナはimageから生成して、一時的に存在する(volumeでホスト側にファイル保存していなければ、コンテナを捨てた時点でデータは消える)

これだけの違いです。

1Like

Comments

  1. 細く説明していただきありがとうございます!
$docker-compose run web rails new . --force --database=mysql

よくこういう風にホスト側から兎に角なんでもやろうとする説明が多いんですが、こういう風にやるととてもdockerというものを理解しづらくなります。

自分は兎に角コンテナ内にまず入って、必要なpackageのインストールだったり設定だったりをコンテナ内で行って、imageとして必要となるコマンドはDockerfileに書き足していきます。

最終的にimageをbuildする時に綺麗であればいいのであって、途中のコンテナは書き捨て出来るものなので、よくある説明ページの教科書通りにやろうとしていると、dockerというよく分からないブラックボックスにコマンドを打っているだけになります。

とても平たく言うと、dockerと言ってもただ単にヘッドレスのlinuxなりを動かしているだけなので、コンテナの中に入りさえすればlinuxを普通に動かしているだけです(volumeをホスト側のディレクトリと繋げていれば、今回のようなrails newもすぐにホスト側で見れる - 上のdocker-compose.ymlでもその記述があるので、大丈夫)。

$ docker-compose --rm run web bash # こうすればbash起動でコンテナ内に入れる

$ ls -al # コンテナ内の確認
$ cd /app # 作業場所に行ったり
$ rails new . --force --database=mysql # コマンド打ったり
$ ... 何でもかんでも出来る、ただのlinux

# 最終的にimageとして必要になるようなコマンドは忘れない内にDockerfileに書く

こうすればとてもスムーズに行くはずです。

0Like

Your answer might help someone💌