git was not found in your PATH, skipping source download / Failed to download laravel/laravel from dist: The zip extension and unzip/7z commands are both missing, skipping

標題にerror文を貼り付けました。ターミナル上でのerror表記は下記です。

■error発生の状況

DockerFileコンテナを起動した後に、Laravelをインストールした際に発生。
Laravel InstallはComposerを利用. 下記。

composer create-project laravel/laravel:^8.0 app

■error原因

・unzip ライブラリが存在せず、Laravelをdownloadして来れなかった。
・gitを経由してLaravelをダウンロードしようとしたが、git ご存在していなかった。

■解決策

1:unzip をinstall

Run apt-get install -y unzip

2:git をinstall

Run apt-get install -y git

どちらを片方で問題ありません。
1を選択すれば、直接ダウンロード。2を選択すれば、git経由でダウンロード。
gitをコンテナの中に入れる必要も無いと思うので、個人的には1がオススメです。

Docker環境構築 / Vue.jsをさくっと起動させるまで.

ディレクトリ構成

/Vue-Test
 L Dockerfile
 L docker-compose.yml

①:Dockerfile/docker-compose ファイルを準備

①-1:Dockerfile
FROM node:17-alpine3.14

WORKDIR /work

RUN apk update && \
    npm install -g npm && \
    npm install -g @vue/cli

EXPOSE 8080
ENV HOST 0.0.0.0
①-2:docker-compose.yml
version: '3'
services:
  vue:
    container_name: vue
    build: 
      context: .    
      dockerfile: ./Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - ./server:/work:delegated      
    tty: true

②:docker コンテナの起動

②-1:ディレクトリに移動

cd Vue-Test

②-2:コンテナ起動

docker-compose up -d

③:コンテナに入り、Vueプロジェクトを作成

③-1:コンテナへ移動

docker-compose vue exec vue sh

③-2:Vueプロジェクトを作成

first-app 名称でプロジェクトを作成

vue create first-app

③-3:Vueのバージョンを選択

Default ([Vue 3] babel, eslint) 
❯ Default ([Vue 2] babel, eslint) 

③-4:package manageを選択

Use Yarn 
❯ Use NPM

これでインストールが開始します。

④:プロジェクトの起動

④-1:プロジェクトへ移動

cd first-app

④-2:serve

npm run serve

⑤:ブラウザで確認

下記へアクセスして、確認して下さい。

http://localhost:8080/

dockerコンテナ内で生成したファイルを、ホスト(PC)へDL(連携)する方法

dockerコンテナ内でpythonのライブラリをinstallし、そのライブラリをzip化。 そして、そのzipファイルをホスト環境(ローカルPC)へ連携することを実現します。

①:phpのライブラリをinstallするdockerコンテナ環境を構築

ファイル構成

/ 
 L Dockerfile
 L entrypoint.sh
Dockerfile
FROM python:3.7

RUN apt-get update && apt-get install -y zip unzip

#pipでinstallしたいディレクトリ$$パッケージを指定&&インストール
RUN pip install --target ./python google-api-python-client google-auth requests-oauthlib

ADD entrypoint.sh /
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

・imageのベースはphp 3.7をpullしてきています。
・pip install で installしたいライブラリを。※今回zipファイルで連携したいライブラリ郡です。
・entrypoint.shをコンテナ上に追加・コンテナでの操作権限を付与して、コンテナで上で、コンテナ上でコマンド実行可能な状態を作る。(コマンドの具体は、entrypoint.shに記載)
・ENTRYPOINTに /entrypoint.shを指定して、コンテナ起動後の実行を指定

②:ライブラリをZip化 / entrypoint.shにてコードで実行

entrypoint.sh
!/bin/bash -eu
 SRC=/python
 DIST=/dist/layer.zip
 zip -q -r ${DIST} ${SRC}
 /bin/bash

・コンテナ上の/python ディレクトリをzip化して、 DISTで指定したディレクトリ位置へ
・コンテナ内を確認するために、 /bin/bash を起動させる。

・DIST=/dist/layer.zip というdistディレクトリが突然現れました。これは、後に、run する際にバインドマウントする際に連携するディレクトリです。※詳細は下記

③:バインドマウントをして、dockerコンテナとホストを連携

docker build でimageを作成

docker build . -t {imageのnameを指定}

docker run で コンテナ起動 &&

docker run --rm -v $(pwd):/dist -it {imageのname}

rm:終了後、コンテナ削除

今回の処理の一番重要な部分は、

-v $(pwd):/dist 

ここです。

ここのバインドマウントの処理によって、
$(pwd):ホストの現在のディレクトリ

/dist :コンテナ上の distディレクトリ
を連携しています。
※FROM python:3.7にはdistは存在しないので、このタイミングで自動生成される。

この後、
>>②:ライブラリをZip化 / entrypoint.shにてコードで実行

>> zip -q -r ${DIST} ${SRC} の処理によって
dist へLayer.zipが生成されています。

④:ホスト環境 / dockerコンテナ環境で確認

④-1:ホスト環境を確認

ファイル構成

/ 
 L Dockerfile
 L entrypoint.sh
 L Layer.zip

上記のようになってると思います。

④-2:dockerコンテナ環境を確認

/bin/bashでコンテナを起動していると思いますので、コンテナの中身を確認していきましょう。

distディレクトリに移動して、その中で空のディレクトリを生成してみて下さい。

cd dist && mkdir gogo

そうすると、コンテナ上の/dist/gogoディレクトリが生成されます。

それと同時に、ホスト環境でも下記のようになっていると思います。

/ 
 L Dockerfile
 L entrypoint.sh
 L Layer.zip
 L gogo

⑤:バインドマウント

https://matsuand.github.io/docs.docker.jp.onthefly/storage/

バインドマウントを利用する際の副作用として、これが良いことか悪いことかはわかりませんが、コンテナー 内に動作するプロセスを通じて ホスト のファイルシステムに変更がかけられるということです。 たとえばシステムにとって重要なファイル、ディレクトリを生成、編集、削除ができてしまいます。 セキュリティに影響を及ぼしかねない強力な能力がここにあって、ホストシステム上の Docker 以外のプロセスへも影響します。

DockerでLaravel構築した後に、bootstrapを導入。エラー祭りを解決

Dockerを使って、Laravelを起動しています。
昔、xamppでLaravelでbootstrapした際は、すんなりいったと思うのですが、
今回は色々なエラーに苦しんだので、記録して残しておきます。

Dockerの環境は、docker-composeを利用して、
php, nginx, mysqlを別々のコンテナで起動しています。

ざっくりとした流れはこちらです。

・php へbashでアタッチする
・node.jsをインストール
・laravel/ui導入
・bootstrap導入
・npm を install & run

php へbashでアタッチする

まずは、Dockerコンテナのphpの中に入ります。
php のコンテナ名はphp としております。

docker-compose exec php bash

cd コマンドを使って、Laravelアプリケーションのルートディレクトリへいきます。
artisan , composer などが存在するディレクトリです。

node.jsをインストール

その階層で、下記コマンドを別々に打ち込んでいきます。

apt-get install -y gnupg
curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install -y nodejs

laravel/ui導入

 composer require laravel/ui 

bootstrap導入

 php artisan ui bootstrap 

npm を install & run

 npm install && npm run dev 

そこで、下記のようなエラーがでてきました。

npm WARN deprecated popper.js@1.16.1: You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1
 npm ERR! code ENOENT
 npm ERR! syscall rename
 npm ERR! path /work/app/node_modules/.vue-loader.DELETE/node_modules/source-map
 npm ERR! dest /work/app/node_modules/vue-loader/node_modules/source-map
 npm ERR! errno -2
 npm ERR! enoent ENOENT: no such file or directory, rename '/work/app/node_modules/.vue-loader.DELETE/node_modules/source-map' -> '/work/app/node_modules/vue-loader/node_modules/source-map'
 npm ERR! enoent This is related to npm not being able to find a file.
 npm ERR! enoent
 npm ERR! A complete log of this run can be found in:
 npm ERR!     /root/.npm/_logs/2020-10-06T03_43_21_673Z-debug.log

 こちらを見てみると、似たようなエラーが….

https://stackoverflow.com/questions/49651221/npm-enoent-no-such-file-or-directory-rename

 rm package-lock.json 

一度、package-lock.json を削除した後に
再度、

npm install && npm run dev 

これで、いけました!

Dockerコンテナを全て、ローカルホスト環境へコピー

dockerを学んでいるときに、dockerコンテナのファイルをローカルホストにコピーして中身を確認したいとき、ありませんか。
どうしてもLinuxコマンドでディレクトリ移動しているだけだと確認しづらい状況があると思います。

【ポイント】Dockerコンテナを全て、ローカルホスト環境へコピー

・docker コンテナをホストへコピーする方法を知る
・ローカルの権限が必要とされる場合がある(powershell編)

docker コンテナをホストへコピーする方法

docker cp コマンドでコンテナからホストへコピーすることが出来ます。
使い方は、

docker cp <コンテナID>:/<コンテナのディレクトリ> /<コピー後のディレクトリ名>

例えば、

docker cp d8c238b5de69:/ /dockercopy

みたいな感じです。
全ディレクトリをコピーしたいので、「/」で、ディレクトリ宣言しています。

ローカルの権限が必要とされる場合がある(powershell編)

これで実行完了できるかな?と思ったのですが、思わぬエラーが出ました。

A required privilege is not held by the client.

クライアント側に権限がないということです。
これが、あらゆる環境に対して発生するエラーなのかは、わかりません。

OS:Windows
ターミナル:powershell

の環境にて、発生しました。

色々と調べていたところ、こちらの方の記事を見たところ、powershellを管理者権限で実行したらOKと出ていました。

ということで、powershellを管理者権限にして実行したら正しくコピーされていました。

ディレクトリーがコピーされる場所

windowsのC: 配下にコピーされています。
どこだろう?と少し探したので、こちらも記録しておきます。

docker-compose でnginxに/bin/bashでstarting container process caused “exec: \”/bin/bash\”

docker-composeでnginxのコンテナに入ろうとした場合、/bin/bashを使っても

 docker-compose exec nginx /bin/bash 

下記のようなエラーが表示されました。

exec failed: container_linux.go:349: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown 

これを

 docker-compose exec nginx sh

で起動させると、入ることができました。

AWS ECRでDocker Loginするまで。AWSCLIを使って。

AWSのECRというサービスをご存知でしょうか。
Dockerを利用して、AWSへデプロイしたい場合にはDocker レポジトリとして利用されるサービスです。

AWSもDockerも学習したての頃、最初のログインで躓いてしまいました。
その時の、躓きポイントを紹介して参ります。

ポイント:
・AWS CLIでコマンドからログインしよう
・ログインする場合には、config でprofileを設定し、活用しよう
・ログインするのは、AWSのアカウント情報(IAM情報)でECRへログイン

こちらの話でお届けします。

今回、一番参考になると思われる読者の方は

「詳しく分からないが、ECRにログインしなくては。でも、ログインって何情報を使って、どういうコマンドでログインすればいいのか。」といった疑問を持った方かと思います。

参考記事:

全体を通して、参考にさせて頂いた記事は、「AWS CLIを使ってECRにDockerイメージを登録する」です。

1:AWS CLIでコマンドからログインしよう

まずは、AWS CLIを使っていきましょう。AWSのGUI(コンソール画面)でも進めていけるのでしょうが、サンプル情報もCLIの情報を基にしているものが多いですし、ログとして残していけるCLIをお勧めします。

windowsでCLIを活用していくためには、こちらを参考にしました。
このまま進めていけば、CLIの活用はすんなり進めることができました。

2: ログインする場合には、config でprofileを設定し、活用しよう

CLIで、config情報を設定することが出来ます。下記コマンドを使います。

aws configure

これ、何のために実行するのか??と、疑問の方もいるかもしれません。
ECRに限らず、CLIからAWSサービスを利用していく際に、ユーザーのログイン情報などを使うシーンがあります。
その際に、いちいち情報を打ち込んだり、コピペしたりする手間を省く目的で使われます。

で、1点気に掛けるといいのは、config情報の登録をuser名を付けて同時に設定することが可能です。
( 複数のconfig情報を登録して、利用する場合に用いる必要があるわけですね。 ) 何も設定しないと、defaultという名称になっているはずです。

コマンドとしては下記です。

aws configure user1( 任意のusername )

3: ログインするのは、AWSのアカウント情報(IAM情報)でECRへログイン

さぁ、それでは、今回の記事の本題です。ここから、ECRへログインしていきます。CLIでのコマンドは下記です。

aws ecr get-login-password --profile 設定A | docker login --username AWS --password-stdin 設定B

私は、最初に勘違いしていたのが、docker loginに含めるべき情報が、docker hubの情報だと勘違いしていました。正直、冷静に考えればそんなハズもないのですが。
色々な情報が欠けていると、見当はずれ間違いを起こしてしまうものですね。

で、ここでログインするべき情報はAWSのアカウント情報(IAM情報)です。

上記のコマンドで、利用者個別で変更する部分は、設定A・設定Bです。

注意して頂きたいのは、CLIのversionによって、コマンドが異なってきます。
今回、使用しているコマンドは v2のコマンドです。
こちらの記事を参考にしてます。

設定A:configで設定した、profile名称。

設定A:configで設定した、profile名称。
>2: ログインする場合には、config でprofileを設定し、活用しよう
にて、解説した部分です。
ここで設定した、aws configure user1 であれば、設定Aにuser1と記します。

設定B: ECRのリポジトリで作成したURI

設定Bは、ECRでレポジトリを作成した際のURIを活用します。今回の記事では、URIの紹介をしておりませんが、冒頭にお伝えした記事にてその作り方が紹介されております。非常に簡単に作れると思います。そこで作成したURIを貼り付けます。

AWSのコンソール画面でもURIは確認することができます。

以上で、コマンドを実行して、

Login Succeeded

と表示されればログイン完了です。

DockerでMysqlへログイン ERROR 1045 (28000): Access denied for user

Dockerの環境構築に手こずっておりました。
今回の記事は、先日の記事の続きです。

mysqlの中に入ったあとに、

docker exec -it db-host bash

mysqlにrootユーザーとしてログインしようとしたら、次のようなエラーメッセージが表示されました。

root@5c001e56e8bc:/# mysql -uroot -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Laravelの.envの確認をして、password設定したいましたが、うまくいきません。

結論:docker-compose.yml の MYSQL_ROOT_PASSWORDを確認

mysqlへのroot権限での情報は、docker-compose.yml > environment: > MYSQL_ROOT_PASSWORD: で設定していたのです….

理解せずに、進めると躓きますね。

ということで、ここで設定したpasswordを反映すると、下記のように入れます。

Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 3
 Server version: 5.7.31 MySQL Community Server (GPL)
 Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
 Oracle is a registered trademark of Oracle Corporation and/or its
 affiliates. Other names may be trademarks of their respective
 owners.
 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

DockerでLaravelを構築時に、Route設定したのに[404 not found]

Dockerを使ってLaravelの環境構築をしています。
DockerもLaravelもまだまだ理解が浅いなかで、進めています。

今回、解説したいことは、
・Dockerを使ってLaravelを構築
・トップページは表示 (welcom.blade.php)
・ルーティング、コントローラー、ビューを設定(ミスなく)
・新しく設定したルートをリクエストしても[404 not found]になる ★ココ

という状況です。

DockerのLaravel環境構築は、Qiitaで記載されていた下記を参考にさせて頂きました。

https://qiita.com/A-Kira/items/1c55ef689c0f91420e81

( ほぼ)同じようにセットアップしていきました。
上記問題が発生した際に、確認したことは。

ルーティングの設定です。
最初は、
Laravelのルート設定に問題がないのか確認したのですが、問題ありませんでした。

次に、
Webサーバーの確認です。
Webサーバー は、nginxを使っています。
で、Dockerにて、nginxを設定する際に、default.confで設定していた部分を確認しました。

nginx設定は、基本的にはdefault.confで設定していくそうです。
ここで、ルーティングと関係している部分は、 location  です。

元々の設定:

location / {     root /var/www/public;     index  index.html index.php;     } 

この場合だと、ルートディレクトリのみ表示できる状態です。

下記のように変更すると、設定した他のルートにもアクセスできました。
loacationの設定は 他にも、色々とありそうです。

  location / {
    root /var/www/public;     
  index  index.html index.php; 
    try_files $uri $uri/ /index.php?$query_string;    
  } 

これを変更したあとは、
再度、
・ビルドを実施。(キャッシュは使わずに)
・コンテナ起動
をして、確認してみましょう。

docker-compose build --no-cache
docker-compose up -d