-
Notifications
You must be signed in to change notification settings - Fork 6
Install Docker
Windows10・11で開発環境をDockerで構築する手順です。
- 初めて構築
- セットアップ から順に作業する
- 既に構築済み
- 参考:1度作った環境で開発を再開する を参照する
- その他
コマンドプロンプト、もしくはPowerShellを管理者権限で起動し、インストールしてください。
wsl --install -d {distribution}
任意のユーザー、パスワードを入力すれば完了です。
参考:以下のコマンドでインストール可能なディストリビューションを確認できます。
wsl -l -o
Docker公式サイトからダウンロード、インストールをしてください。
Docker Desktop for Mac and Windows | Docker
WSLのターミナルにて、Connect-CMSをgit cloneして、ソースコードをダウンロードします。
以下の手順でターミナルを開きます。
- 「Remote - WSL」 をインストールする
- VSCの左下「><」をクリック、「New WSL Window」を選択しWSLに入る
- ターミナル(T) -> 新しいターミナル でWSLのターミナルを開く
Connec-CMSのソースコードをダウンロードします。
mkdir src # お好きなディレクトリにgit clone してください。
cd src
git clone https://github.com/opensource-workshop/connect-cms.git
cd connect-cms
※ 「注意」connect-cmsをwindows側のフォルダに配置して、シンボリックリンクで共有はしない方がよいです。DockerはLinuxのため、windowsとのファイルのやり取りは都度変換が走って遅いです。また db のファイル永続化がうまくいかず、db コンテナが再起動を繰り返す挙動になりました。
Docker Composeを利用して、WEB、DB、メールサーバーを立ち上げます。
docker pull php:7-apache
docker-compose up -d
※ docker-composeが無い場合(The command 'docker-compose' could not be found
エラー)、Docker Desktopを起動すれば使えるようになります。
セットアップのシェルを用意しています。コンテナに入り、シェルを実行します。
# appコンテナにログイン
docker exec -it app bash
# appコンテナ内
bash /var/www/html/connect-cms/docker/app/setup.sh
#########################
### ※ windows以外は上記setup.sh内の下記部分でエラーが出ます。都度変更してください。
### # WSLから編集可能にする
### chown 1000:1000 .env
#########################
### ※ 開発環境の場合、下記コマンドも追加実行
cd /var/www/html/connect-cms/
COMPOSER=composer-dev.json composer install
ブラウザからlocalhostを確認してください。 Connect-CMSの画面が確認出来れば完了です。
ソースコードを修正したい場合は、このままVSCのリモートウィンドウで進めると便利です。
もちろん、githubへpushできます。
- Docker Desktopを起動
- VS CodeでWSLのターミナルを開く
- VS Code起動
- 「Remote Explore」>(Remote Explore上部)のセレクトボックス「WSL Tergets」選択
- Connect環境を選んで開くとVS Code「WSLのConnect環境」が開く
- その環境で
Ctrl+@
でWSLのターミナル起動
- その環境で
- WSLのターミナルで操作
- DockerでConnect-CMSを立ち上げる
docker-compose up -d
- コンテナに入る
docker exec -it app bash
- DockerでConnect-CMSを立ち上げる
- localhostでConnect-CMSが見れる
# github の ユーザー名、メールアドレスを設定
# これをやらないと、githubでcommit log がgithubのアカウントと紐づかないです
git config --global user.name {username}
git config --global user.email "{mail address}"
# 改行コードの自動変換 OFF
git config --global core.autocrlf false
メモリが16GBあれば問題なさそうですが、8GBだと激重になることがあります。
そういうときは、WSLが使えるメモリを制限することで解消します。
Windowsにある.wslconfigを修正します。
メモリ8GBのPCでは、2GBでちょうどよかったです。
%USERPROFILE%.wslconfig
[wsl2]
memory=2GB
swap=0
Connect-CMS/docker/app/Dockerfile
#FROM php:7-apache
FROM php:8.1-apache
- Dockerfile の
FROM
で記載する文字は、Docker Hubのphp公式イメージ 参照-
php:<version>-apache
の場合の有効な<version>
は、Tagsページをapacheで絞り込みで確認できます。
-
# appコンテナからログアウト後
docker pull php:8.1-apache
docker-compose build
docker-compose up -d
# appコンテナにログイン
docker exec -it app bash
# appコンテナ内
php -v
PHP 8.1.10 (cli) (built: Sep 1 2022 21:16:25) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.10, Copyright (c) Zend Technologies
# 初期セットアップ
bash /var/www/html/connect-cms/docker/app/setup.sh
これでphpが切り替わりました。
下記作業が必要です。
- Duskの準備
- docker-compose.yml の修正、ビルド
- .env と .env.dusk.local の修正
- tests/DuskTestCase.php の修正
- Dusk実行
Duskの準備 を参照して準備を行う。
マイグレーション等の実行は、コンテナ内から行う。
※ 参考:(コンテナ外から) appコンテナに入る
docker exec -it app bash
※ 参考:(コンテナ内) マイグレーション等を実行する例
### (connect-cmsディレクトリに移動すると)
cd /var/www/html/connect-cms
### (php artisanコマンドを実行できる)
php artisan migrate --env=dusk.local
docker-compose.yml 修正内容
services:
app:
container_name: app
build: ./docker/app
volumes:
- .:/var/www/html/connect-cms
ports:
- 80:80
environment:
# DB_USERNAME: JohnDoe # ←コメントアウト。Dusk実行>.env自動切り替わり時の値を反映させるため
# DB_PASSWORD: foobar # ←コメントアウト。同上
# DB_DATABASE: connect # ←コメントアウト。同上
TZ: 'Asia/Tokyo'
#
# (省略)
#
# (↓最下部に追記)
selenium:
container_name: selenium
image: selenium/standalone-chrome-debug
ports:
- 4444:4444
depends_on:
- app
privileged: true
コンテナ外で操作
### ビルド
docker-compose build
### 起動
docker-compose up -d
.env 修正内容
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
# DB_DATABASE=$DB_DATABASE # ←コメントアウト
# DB_USERNAME=$DB_USERNAME # ←コメントアウト
# DB_PASSWORD=$DB_PASSWORD # ←コメントアウト
DB_DATABASE=connect # ←追記
DB_USERNAME=JohnDoe # ←追記
DB_PASSWORD=foobar # ←追記
.env.dusk.local 修正内容
# APP_URL=http://localhost # ←コメントアウト
APP_URL=http://app # ←追記 (appはコンテナ内から見えるコンテナ名)
#
# (省略)
#
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
# DB_DATABASE=$DB_DATABASE # ←コメントアウト
# DB_USERNAME=$DB_USERNAME # ←コメントアウト
# DB_PASSWORD=$DB_PASSWORD # ←コメントアウト
DB_DATABASE=test # ←追記(任意のテストDB名)
DB_USERNAME=root # ←追記
DB_PASSWORD=hogehoge # ←追記
tests/DuskTestCase.php 修正内容
protected function driver()
{
$options = (new ChromeOptions)->addArguments([
'--disable-gpu',
'--headless',
'--window-size=1920,1080',
]);
return RemoteWebDriver::create(
// $_ENV['DUSK_DRIVER_URL'] ?? 'http://localhost:9515', // ← コメントアウト
'http://selenium:4444/wd/hub', // ← 追記
DesiredCapabilities::chrome()->setCapability(
ChromeOptions::CAPABILITY, $options
)
);
}
(コンテナ外から) appコンテナに入る
docker exec -it app bash
(コンテナ内) Dusk実行
cd /var/www/html/connect-cms
### Linux+Dockerの場合
APP_ENV=local php artisan dusk tests/Browser/Manage/IndexManageTest.php
- WSL のインストール | Microsoft Docs
- docker compose コマンド| Docker ドキュメント
- Docker入門(第六回)〜Docker Compose〜 | さくらのナレッジ
// 起動
docker-compose up -d
// 起動状態 確認
docker-compose ps
// コンテナID 確認
docker ps
// 停止
docker-compose stop
// コンテナ削除
docker-compose rm
// イメージも合わせて削除
docker-compose down --rmi all
docker-compose logs -f app
- (左側) Containers>app (行)縦・・・押下>View details押下
git pull等でファイルの書きこみpermission が無くなった場合、書きこみができずにエラーになります。
その場合はコンテナ内で下記コマンド例を参考に、パーミッション変更やファイルオーナーを修正するとエラーが解消します。
chmod o+w -R /var/www/html/connect-cms/
docker composeする前に、先に各イメージをpullしておく
docker pull php:7-apache
akagane99@vaiof14:~/connect-cms-docker$ docker-compose up -d
[+] Building 10.7s (2/2) FINISHED docker:default
=> [app internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.48kB 0.0s
=> ERROR [app internal] load metadata for docker.io/library/php:7-apache 10.7s
------
> [app internal] load metadata for docker.io/library/php:7-apache:
------
failed to solve: php:7-apache: failed to authorize: failed to fetch anonymous token: Get "https://auth.docker.io/token?scope=repository%3Alibrary%2Fphp%3Apull&service=registry.docker.io": dial tcp: lookup auth.docker.io on 172.19.64.1:53: read udp 172.19.73.60:52132->172.19.64.1:53: i/o timeout
- 初期セットアップで、DBテーブルを作成後、他環境のDB dumpファイルをインポート時に発生
- 初期セットアップの空テーブルの外部キー制約にひっかかり、DBインポート時に外部キー制約が発生していた
- (方法1) 一旦DBテーブルを全削除後、再度インポートで解消
- (方法2) インポート時にforeign key制約を外すオプションがあれば、それを指定する。
エラー対応:Dockerのdb起動時に Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306
- エラー内容
- Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
- 3306 ポートが既に別サービスで使われている。
- ポートを使っている別サービスを止めて、Dockerのdbを再度起動する。
- エラー内容
- #6 2.696 E: Release file for http://deb.debian.org/debian-security/dists/bullseye-security/InRelease is not valid yet (invalid for another 4h 46min 16s). Updates for this repository will not be applied.
- #6 2.696 E: Release file for http://deb.debian.org/debian/dists/bullseye-updates/InRelease is not valid yet (invalid for another 2h 22min 27s). Updates for this repository will not be applied.
PC と WSL で時刻がずれている
WSL でコマンドを実行して時刻を合わせる
sudo hwclock --hctosys`
- コンテナ内でphp.iniの以下を変更
vi /usr/local/etc/php/php.ini
memory_limit = 512M
- コンテナ再起動
Connect-CMS/docker/app/Dockerfile
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \ # ←末尾\追加
nodejs \ # ←追記
npm # ←追記
# (以下追記)
# npm アップデート
RUN npm install -g n && n stable
RUN npm install -g npm@latest
# npm run prod Permission denied対策
RUN npm config set cache /tmp --global
# appコンテナからログアウト後
docker-compose down
docker-compose build
docker-compose up -d
# appコンテナにログイン
docker exec -it app bash
# (※ 既にあれば一度 node_modules をフォルダごと削除)
cd /var/www/html/connect-cms/
rm -rd ./node_modules
# 依存パッケージを再インストール
npm install
npm run prod
root@2fa0658c3496:/var/www/html/connect-cms# npm run prod
> prod
> npm run production
glob error [Error: EACCES: permission denied, scandir '/root/.npm/_logs'] {
errno: -13,
code: 'EACCES',
syscall: 'scandir',
path: '/root/.npm/_logs'
}
> production
> mix --production
sh: 1: mix: Permission denied
npm ERR! code 126
npm ERR! path /var/www/html/connect-cms
npm ERR! command failed
npm ERR! command sh -c mix --production
npm ERR! code 126
npm ERR! path /var/www/html/connect-cms
npm ERR! command failed
npm ERR! command sh -c npm run production
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2025-02-19T06_37_11_680Z-debug.log
root@2fa0658c3496:/var/www/html/connect-cms# npm run prod
> prod
> npm run production
> production
> mix --production
sh: 1: mix: Permission denied
npm ERR! code 126
npm ERR! path /var/www/html/connect-cms
npm ERR! command failed
npm ERR! command sh -c mix --production
npm ERR! A complete log of this run can be found in:
npm ERR! /tmp/_logs/2025-02-19T06_43_25_281Z-debug.log
npm ERR! code 126
npm ERR! path /var/www/html/connect-cms
npm ERR! command failed
npm ERR! command sh -c npm run production
npm ERR! A complete log of this run can be found in:
npm ERR! /tmp/_logs/2025-02-19T06_43_25_299Z-debug.log
-
【解決】Typescript(Node.js)でビルドエラー "Permission denied ubuntu"
-
原因としては、npm install したときのユーザー と ビルドしたユーザーが異なる場合に起きます。
-
Connect-CMS/docker/app/Dockerfile
RUN apt-get update \
(略)
&& docker-php-ext-install -j$(nproc) gd pcntl exif # ←末尾exif追加
# appコンテナからログアウト後
docker-compose down
docker-compose build
docker-compose up -d
# appコンテナにログイン
docker exec -it app bash
[2025-05-02 09:23:38] production.ERROR: Reading Exif data is not supported by this PHP installation. {"userId":1,"exception":"[object] (Intervention\\Image\\Exception\\NotSupportedException(code: 0): Reading Exif data is not supported by this PHP installation. at /var/www/html/connect-cms/vendor/intervention/image/src/Intervention/Image/Commands/ExifCommand.php:22)
[stacktrace]
#0 /var/www/html/connect-cms/vendor/intervention/image/src/Intervention/Image/AbstractDriver.php(94): Intervention\\Image\\Commands\\ExifCommand->execute(Object(Intervention\\Image\\Image))
#1 /var/www/html/connect-cms/vendor/intervention/image/src/Intervention/Image/Image.php(108): Intervention\\Image\\AbstractDriver->executeCommand(Object(Intervention\\Image\\Image), 'exif', Array)
#2 /var/www/html/connect-cms/vendor/intervention/image/src/Intervention/Image/Commands/OrientateCommand.php(15): Intervention\\Image\\Image->__call('exif', Array)
#3 /var/www/html/connect-cms/vendor/intervention/image/src/Intervention/Image/AbstractDriver.php(94): Intervention\\Image\\Commands\\OrientateCommand->execute(Object(Intervention\\Image\\Image))
#4 /var/www/html/connect-cms/vendor/intervention/image/src/Intervention/Image/Image.php(108): Intervention\\Image\\AbstractDriver->executeCommand(Object(Intervention\\Image\\Image), 'orientate', Array)
#5 /var/www/html/connect-cms/app/Http/Controllers/Core/UploadController.php(795): Intervention\\Image\\Image->__call('orientate', Array)
#6 /var/www/html/connect-cms/app/Http/Controllers/Core/UploadController.php(613): App\\Http\\Controllers\\Core\\UploadController->postFile(Object(Illuminate\\Http\\Request))
(略)
- home
- Overview
- Install
- Install (インストール)(Linux等へのインストール:root権限ある場合)
-
Install-sakura(さくらのレンタルサーバ)
- Install-sakura-root(ドキュメントルート版)
- Install-Xserver(XServer)
- Install-lolipop(ロリポップ-ハイスピードプラン)
- Install-ColorfulBox(カラフルボックス)
- install-CentOS7+PHP7
- Install-XAMPP(Windows+XAMPP)
- install-Docker
- Update
- Plans
- Data
- File Upload
- Design
- Theme(テーマ)
- Font-Icon(アイコン)
- Button(ボタン)
- Display of input error(入力エラーの表示)
- Multi Language
- Policies
- Plugin
- Basic function(基本の関数)
- Opac(蔵書管理)
- OpeningCalendar(開館カレンダー)
- Template(テンプレート)
- Cabinet(キャビネット)
- Whatsnew(新着)
- Search(サイト内検索)
- Approval(承認機能)
- Holidays(祝日管理)
- Menu(メニュー)
-
OriginalPlugin(オリジナル・プラグイン開発)
- OriginalPluginFiles(ファイル一覧)
- Sample.php
- SamplePost.php
- plugin.ini
- SamplesPlugin.php
- create_samples_table.php
- create_sample_posts_table.php
- samples_frame_edit_tab.blade.php
- card/index.blade.php
- card/template.ini
- default/bucket.blade.php
- default/edit.blade.php
- default/index.blade.php
- default/list_buckets.blade.php
- default/show.blade.php
- default/template.ini
- WYSIWYG
- Session
- Programing tips
- Rule(ルール)
- Laravel method tips
- Laravel reference pages
- PHP
- phpcs
- Datetimepicker(日付入力)
- Hook(処理のフック)
- SQL
- Pull-Request(Web画面上)
- Post
- Optimize
- Composer
- npm
- コントローラー側の$this--can()-の調査
- API (外部サービスAPI)
- Test Case(テストケース)
- memo(永原のメモ)
- TCPDF(実装サンプル)
- Phpunit(ユニットテスト)
-
Dusk(ブラウザテスト)
- Github-Actions-Dusk(Github Actionsでブラウザテスト)
- Dusk-Manual(マニュアル自動生成)
- Develop-Windows(Windows開発環境)
- users_columns(ユーザ任意項目)
- container-page-beta(コンテナ方式(ページ)対応(ベータ版))
- Migration
- Other
- Link
- MultiLanguage(多言語化の際の注意点)