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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Docker

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

Q&A

解決済

3回答

3127閲覧

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

SdMzauVsdtgq81B

総合スコア1

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Docker

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

0グッド

0クリップ

投稿2020/07/14 10:14

編集2020/07/15 05:57

###環境
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が表示されます。

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

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

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

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

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

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

guest

回答3

0

ベストアンサー

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

sh

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

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

追記

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

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

powershell

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

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

投稿2020/07/14 12:12

編集2020/07/14 15:38
hope_mucci

総合スコア4447

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

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

SdMzauVsdtgq81B

2020/07/14 12:39

$ docker-compose exec app ashでコンテナに入って、ご指示のとおりやってみましたが、 /work # ln -s /work/storage/app/public /work/public/storage ln: /work/public/storage: Protocol error と、やはりProtocol errorが出てきます。色々調べたところ別の掲示板では「管理者権限ではないことが原因でProtocol errorが出る」と書かれていました。ただ、Dockerを使った同じような状況ではないので確かではないです。 参考にしたURL:https://stackoverflow.com/questions/39496598/laravel-5-3-storagelink-symlink-protocol-error
hope_mucci

2020/07/14 15:28

OSがwindows10とのことですが、homeですか?proですか? homeでVM環境をvirtualboxで動かしている構成だとシンボリックリンクが作成できないかも。。。 (私がlnをテストした環境はwindows10proでhyper-vで動かしています)
hope_mucci

2020/07/14 15:38

run時のボリューム指定でなんとかする方法を追記しました。何とかなれば幸いです。
SdMzauVsdtgq81B

2020/07/15 06:53

回答ありがとうございます。Docker使用歴が浅いので間違ったことを言っていたらご指摘お願いします。 runのやり方をやってみました。runでコンテナを作ると、docker-compose.ymlに書いたことが反映されていない、つまりdbコンテナやwebコンテナから独立したコンテナができてるような気がします。実際、lsコマンドでファイル構造が表示されませんでした。何かやり方を間違っているのでしょうか?
SdMzauVsdtgq81B

2020/07/15 06:57

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

2020/07/15 07:59

あ、そうか。docker-compose使ってるんですね。ではdocker-compose.ymlのvolume要素に、コマンド引数と同じようにマウントさせたいパスを書けばよいです。 余談ですがwindows10proを使っているならhyper-vが使えます。docker-toolboxは過去の遺産的なツールなので本当ならdocker desktopに乗り換えたほうがいいかと思います(が、安易にツールを変えると今動いているものが動かなくなったりするので強くお勧めもできない。。。)
SdMzauVsdtgq81B

2020/07/15 14:04

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

0

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

投稿2020/07/14 14:04

yuki84web

総合スコア1857

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

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

SdMzauVsdtgq81B

2020/07/15 05:41

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

0

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

投稿2020/07/16 05:09

SdMzauVsdtgq81B

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問