dockerでrailsの開発環境を構築しており、  
dockefileのwebコンテナでyarnが動作するようにしたいです。そして、  
`docker compose run --rm web bin/setup`でyarn installが実行されるようにしたいです。  
現在はこのようにエラーとなっています。

```

    The Gemfile's dependencies are satisfied
    Yarn executable was not detected in the system.
    Download Yarn at https://yarnpkg.com/en/docs/install
    
    == Command ["bin/yarn"] failed ==
    
```

  * コンテナ内でyanrが見つからないです

```

    root@d5ddf41fc3c6:/rails-docker-mysql# yarn --version
    bash: yarn: command not found
    
```

  * docker-compose upでサーバーは起動できます

Dockerfile

```

    # Node.js&yarn
    FROM node:16-buster-slim
    COPY --from=node /opt/yarn-* /opt/yarn
    COPY --from=node /usr/local/bin/node /usr/local/bin/
    COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
    RUN ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
      && ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx \
      && ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \
      && ln -fs /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg
    
    # Rails
    FROM ruby:2.7.7
    RUN apt-get update
    RUN apt-get install -y \
        build-essential \
        default-mysql-client
    
    
    
    WORKDIR /rails-docker-mysql
    COPY Gemfile Gemfile.lock /rails-docker-mysql/
    RUN bundle install
    
```

docker-compose.yml

```

    version: "3"
    
    volumes:
      data:
    
    services:
      web:
        build: .
        command: bundle exec rails s -p 3000 -b '0.0.0.0'
    
        ports:
          - "3000:3000"
        volumes:
          - ".:/rails-docker-mysql"
        environment:
          - "DATABASE_PASSWORD=password"
        tty: true
        stdin_open: true
        depends_on:
          - db
    
      db:
        image: mysql
        volumes:
          - "data:/var/lib/mysql"
        environment:
          MYSQL_ROOT_PASSWORD: password
        ports:
          - "3306:3306"
    
```

dockerfileやdocker-compose.ymlの記述が間違っている場合修正お願いします
CC BY-SA 4.0
2023-01-24T13:36:01.513
93547
2023-01-25T07:18:45.120
2023-01-25T07:18:45.120
55232
55232
question
ruby-on-rails docker docker-compose
docker compose run --rm web bin/setupでyarn installが実行されるようにしたい
直接試す環境が無いので憶測を含みます。

ベースの Docker イメージの中身を見ると、以下の通り `/opt/yarn-v${YARN_VERSION}/bin/yarn` に対して
`/usr/local/bin/yarn` で参照できるようシンボリックリンクを作成しており、ユーザーが何もしなくても yarn
コマンドが標準で使える状態だと思われます。

[docker-node/16/buster-slim/Dockerfile](https://github.com/nodejs/docker-
node/blob/754ca131a9c4f7e4ac8c255cbb3e35a446f5b70c/16/buster-
slim/Dockerfile#L73)

>
```

>     && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \
>       && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \
>  
```

しかし、質問中の Dockerfile では `/opt/yarn/bin/yarn` という (恐らく存在しない)
ファイルに対してシンボリックリンクを作成し直しているので、無効なファイルとなり、結果的に yarn コマンドの実行に失敗している気がします。

>
```

>     RUN ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js
> /usr/local/bin/npm \
>       && ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js
> /usr/local/bin/npx \
>       && ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \
>       && ln -fs /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg
>  
```

`/opt/yarn/bin/` 以下へのシンボリックリンクを除外した状態でコンテナの起動と yarn コマンドが実行できるかを試してみてください。
CC BY-SA 4.0
2023-01-25T07:06:42.280
93559
2023-01-25T07:06:42.280
3060
93547
answer