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

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

ただいまの
回答率

88.92%

Laravelでシンボリックリンクを作れない。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 522

環境

Windows10 pro
Docker toolbox
PHP 7.3.19
Laravel 6.18.20

実現したいこと

Laravelで、画像をアップロードして、その画像をブラウザ上で表示させようとしています。

現在の問題点

ローカル上の storage/app/public/ には問題なく画像がアップロードされましたが、
ブラウザ上では画像が表示されません。

Laravelでは、シンボリックリンクを張る必要があるということだったので、、docker-compose exec app ashでコンテナに入り、以下のコマンドを打つとエラーメッセージが表示されてしまいました。
エラーの解決策を教えていただけますと幸いです。

php artisan storage:link

エラーメッセージ

symlink(): Protocol error
at /work/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:263
259| */
260| public function link($target, $link)
261| {
262| if (! windows_os()) {
> 263| return symlink($target, $link);
264| }
265|
266| $mode = $this->isDirectory($target) ? 'J' : 'H';
267|
Exception trace:
1 symlink("/work/storage/app/public", "/work/public/storage")
/work/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:263
2 Illuminate\Filesystem\Filesystem::link("/work/storage/app/public", "/work/public/storage")
/work/vendor/laravel/framework/src/Illuminate/Foundation/Console/StorageLinkCommand.php:35

デバッグで画像データは取得できているので、そのほかのソースコードに間違いはなく、シンボリックリンクがうまく作れていないことが原因であると思っています。

試したこと

コマンドプロンプトに管理者権限で入り、以下のコマンドを入力してシンボリックリンクを作成しましたが、やはり画像が表示されませんでした。

mklink /D "C:\Users\user.DESKTOP-1KA2FU7\PHP\docker-laravel\src\public\storage" "C:\Users\user.DESKTOP-1KA2FU7\PHP\docker-laravel\src\storage\app\public"


以下の記事を見て、mklinkで指定したパスが間違っているのではないかと考えましたが、どのように修正すればよいのか、パスの調べ方がわかりません。あるいは、「php artisan storage:link」でエラーが出ないようにするにはどうすればよいのかがわかりません。

参考にしたURL

・https://qiita.com/Baisel/items/49b16ce3231c749f6c6f
https://teratail.com/questions/245571

試したことの追記

①Dockerコンテナ内で

/work/public # ln -s /work/public storage
ln: storage/public: Protocol error
/work/public # ln -s /work/storage/app/public /work/public/storage
ln: /work/public/storage/public: Protocol error


とエラーが表示されます。

②Power Shellを管理者権限で開き、そこからDockerコンテナ内に入って

ln -s /work/storage/app/public /work/public/storage
php artisan storage:link

を入力しても、やはりProtocol errorが表示されます。

エラーの解決策を教えていただけますと幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

コンテナのシェルでlnしても作成できないでしょうか。

ln -s /work/storage/app/public /work/public/storage


両方ともホスト側からマウントしているディレクトリだと思いますが、(/src/ => /work/ ?)問題なくできるはずです。
ホスト側から見るとただのファイルになりますがコンテナ側から見ればシンボリックリンクです。

追記

virtualboxで動作させている環境だとシンボリックリンクが作れないかもしれません。

シンボリックリンクが作れないなら、docker run時に画像があるホスト側のディレクトリを別々のマウントポイントにマウントしてしまうのも手かと思います。

docker run -v c:\(略)\src\public\storage:/work/public/storage -v c:\(略)\src\public\storage:/work/storage/app/public (後の引数は略)


windows10proでhyper-v の環境では成功しました。これもvirtualboxの環境で動作できなかったら申し訳ないです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/15 15:57

    書き忘れましたが10 proを使用です。

    キャンセル

  • 2020/07/15 16:59

    あ、そうか。docker-compose使ってるんですね。ではdocker-compose.ymlのvolume要素に、コマンド引数と同じようにマウントさせたいパスを書けばよいです。

    余談ですがwindows10proを使っているならhyper-vが使えます。docker-toolboxは過去の遺産的なツールなので本当ならdocker desktopに乗り換えたほうがいいかと思います(が、安易にツールを変えると今動いているものが動かなくなったりするので強くお勧めもできない。。。)

    キャンセル

  • 2020/07/15 23:04

    画像表示されました!
    以下、やったことですがdocker-compose.ymlにマウントの設定を追記して、エラーなくビルドされるもマウントしてくれず...。結局Docker toolboxを削除してDocker desktopに切り替えて「php artisan storage:link」を打ったら、エラーが出なくなり、画像が表示されました。たぶん原因はvirtualboxでしょう。
    Docker desktopに乗り換えたほうがよいというアドバイスがなかったら、ずっとできないままでした。
    ありがとうございました!

    キャンセル

+1

DockerでなくVagrant(windows 10)の環境で申し訳ないですが、コマンドを実行するターミナルでは無く、仮想環境を実行するターミナル自体を管理者権限で実行すべきでしたが、それは出来ていますでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/15 14:41

    試したことを追記しました。Docker quickstart Terminalは「管理者として実行」で開こうとすると、エラーが出て開けませんでした。
    Power Shellを「管理者として実行」で開き、そこからDockerコンテナ内に入ってコマンドを入力しても、Protocol errorが出てきてだめでした。

    キャンセル

0

Docker toolboxを削除してDocker desktopに切り替えて「php artisan storage:link」を打ったら、エラーが出なくなり、画像が表示されました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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