- 投稿日:2021-10-26T20:59:42+09:00
Lambda (SAM CLI) + MySQL(docker-compose)を利用した REST API作成方法メモ
ローカル環境でLambda(SAM) + MySQL(docker-compose)を利用したAPIを作成する方法についてメモする。 AWS SAM(Serverless Application Model) サーバーレスアプリのデプロイに特化したCloudFormationの拡張機能。 YAMLもしくはJSONでリソース定義する。 SAM CLI SAMを利用した開発サポートツール サーバーレスアプリのひな形作成、ビルド、AWSへのデプロイができる。 開発者のローカル環境でLambdaをDockerコンテナ起動できる。 構成 準備 SAM CLIインストール brew tap aws/tap brew install aws-sam-cli 実装 MySQL docker-compose.yml MySQL起動用 version: "3.3" networks: container-link: name: docker.internal services: db: image: mysql:5.7 container_name: db environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: sample_db MYSQL_USER: mysqluser MYSQL_PASSWORD: mysqlpass networks: - container-link volumes: - ./db/data:/var/lib/mysql - ./db/my.cnf:/etc/mysql/conf.d/my.cnf - ./db/initdb.d:/docker-entrypoint-initdb.d ports: - 3308:3308 command: --port 3308 tty: true 起動 docker-compose up -d ※起動後テスト用のテーブル作成とデータ登録を行う。 ※seq,name,ageカラムを持つsampleテーブルを作成している。 Lambda ひな形作成 sam init ※ランタイムはPython3.8を選択。 template.yml Hello World Exampleを利用する。 今回はハローワールド用テンプレートをそのまま利用する。 requrements.txt requests mysql-connector-python ※MySQLコネクター追加。 Lambda処理(app.py)修正 import json import mysql.connector def lambda_handler(event, context): # MySQLからデータ取得 # それぞれの環境に合わせて記述 sql = "select * from sample;" conn = mysql.connector.connect( host = "db", port ="3308", user = "mysqluser", password = "mysqlpass", database = "sample_db" ) cur = conn.cursor(dictionary=True) cur.execute(sql) results = cur.fetchall() cur.close() conn.close() # レスポンスボディ生成 response = [] for result in results: response +=[ { "name":result["name"], "age":result["age"] } ] return { "statusCode":200, "body":json.dumps({"results":response}) } 動作確認 ビルド sam build --use-container 実行 sam local start-api --docker-network docker.internal リクエスト GET /hello HTTP/1.1 Host: localhost:3000 Content-Type: application/json レスポンス { "results": [ { "name": "test", "age": 25 }, { "name": "test2", "age": 26 } ] } 参考情報 Architecting and Building - レガシーシステムにサーバーレスを利用して素早くサービスを追加するには【後半】
- 投稿日:2021-10-26T20:16:30+09:00
The "XXXXXXX" file could not be downloaded: failed to open stream: Cannot assign reques ted address 対処方法
1.S3のライブラリをappコンテナ内でインストールしようと下記コマンドを実行した所エラーが発生! /work# composer require league/flysystem-aws-s3-v3 //エラー The "http://repo.packagist.org/p/phpunit/php-invoker%24d51629773da6aa4144adc03bb9c518ddab3a46018cb3467f76ed7d0b00a3e417.json" file could not be downloaded: failed to open stream: Cannot assign reques ted address 2.下記コマンドでエラーの原因調査! すると、2箇所エラーらしき箇所を発見! 何かコマンドを実行するよう指示が出ました。 /work# composer diag Checking composer.json: OK Checking platform settings: OK Checking git settings: OK Checking http connectivity to packagist: OK Checking https connectivity to packagist: OK Checking github.com rate limit: OK Checking disk free space: OK Checking pubkeys: FAIL //ここがおかしい! Missing pubkey for tags verification //ここがおかしい! Missing pubkey for dev verification //ここがおかしい! Run composer self-update --update-keys to set them up //コマンド実行の指示! Checking composer version: You are not running the latest stable version, run `composer self-update` to update (1.10.20 => 2.1.9) Composer version: 1.10.20 PHP version: 7.4.15 PHP binary path: /usr/local/bin/php OpenSSL version: OpenSSL 1.1.1d 10 Sep 2019 3.指示通りコマンド実行 どうやらコマンドを実行しろと指示が出てるようなので、一旦メッセージについて検索。 するとこちらの記事を発見したので、参考にコマンドを実行! https://teratail.com/questions/135212 # composer self-update --update-keys Open https://composer.github.io/pubkeys.html to find the latest keys Enter Dev / Snapshot Public Key (including lines with -----): コマンドを実行するとここまで表示される。どうやらKeyを入力しろと書かれているっぽい? 次に、参考サイトに記載されている通り、こちらのサイト(https://composer.github.io/pubkeys.html) の「Dev / Snapshot Public Key」の下の白線欄の長い文をコピペしてenterを押す! /work# composer self-update --update-keys Open https://composer.github.io/pubkeys.html to find the latest keys Enter Dev / Snapshot Public Key (including lines with -----): -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnBDHjZS6e0ZMoK3xTD7f FNCzlXjX/Aie2dit8QXA03pSrOTbaMnxON3hUL47Lz3g1SC6YJEMVHr0zYq4elWi i3ecFEgzLcj+pZM5X6qWu2Ozz4vWx3JYo1/a/HYdOuW9e3lwS8VtS0AVJA+U8X0A hZnBmGpltHhO8hPKHgkJtkTUxCheTcbqn4wGHl8Z2SediDcPTLwqezWKUfrYzu1f o/j3WFwFs6GtK4wdYtiXr+yspBZHO3y1udf8eFFGcb2V3EaLOrtfur6XQVizjOuk 8lw5zzse1Qp/klHqbDRsjSzJ6iL6F4aynBc6Euqt/8ccNAIz0rLjLhOraeyj4eNn 8iokwMKiXpcrQLTKH+RH1JCuOVxQ436bJwbSsp1VwiqftPQieN+tzqy+EiHJJmGf TBAbWcncicCk9q2md+AmhNbvHO4PWbbz9TzC7HJb460jyWeuMEvw3gNIpEo2jYa9 pMV6cVqnSa+wOc0D7pC9a6bne0bvLcm3S+w6I5iDB3lZsb3A9UtRiSP7aGSo7D72 8tC8+cIgZcI7k9vjvOqH+d7sdOU2yPCnRY6wFh62/g8bDnUpr56nZN1G89GwM4d4 r/TU7BQQIzsZgAiqOGXvVklIgAMiV0iucgf3rNBLjjeNEwNSTTG9F0CtQ+7JLwaE wSEuAuRm+pRqi8BRnQ/GKUcCAwEAAQ== -----END PUBLIC KEY----- Stored key with fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B 0C708369 153E328C AD90147D AFE50952 Enter Tags Public Key (including lines with -----): すると、次は「Tags Public Key」を入力するみたい。 次は先ほどコピペしたサイトに記載されてる「Tags Public Key」の白線欄の長い文をコピペしてenterを押す! Enter Tags Public Key (including lines with -----): -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0Vi/2K6apCVj76nCnCl2 MQUPdK+A9eqkYBacXo2wQBYmyVlXm2/n/ZsX6pCLYPQTHyr5jXbkQzBw8SKqPdlh vA7NpbMeNCz7wP/AobvUXM8xQuXKbMDTY2uZ4O7sM+PfGbptKPBGLe8Z8d2sUnTO bXtX6Lrj13wkRto7st/w/Yp33RHe9SlqkiiS4MsH1jBkcIkEHsRaveZzedUaxY0M mba0uPhGUInpPzEHwrYqBBEtWvP97t2vtfx8I5qv28kh0Y6t+jnjL1Urid2iuQZf noCMFIOu4vksK5HxJxxrN0GOmGmwVQjOOtxkwikNiotZGPR4KsVj8NnBrLX7oGuM nQvGciiu+KoC2r3HDBrpDeBVdOWxDzT5R4iI0KoLzFh2pKqwbY+obNPS2bj+2dgJ rV3V5Jjry42QOCBN3c88wU1PKftOLj2ECpewY6vnE478IipiEu7EAdK8Zwj2LmTr RKQUSa9k7ggBkYZWAeO/2Ag0ey3g2bg7eqk+sHEq5ynIXd5lhv6tC5PBdHlWipDK tl2IxiEnejnOmAzGVivE1YGduYBjN+mjxDVy8KGBrjnz1JPgAvgdwJ2dYw4Rsc/e TzCFWGk/HM6a4f0IzBWbJ5ot0PIi4amk07IotBXDWwqDiQTwyuGCym5EqWQ2BD95 RGv89BPD+2DLnJysngsvVaUCAwEAAQ== -----END PUBLIC KEY----- Stored key with fingerprint: 57815BA2 7E54DC31 7ECC7CC5 573090D0 87719BA6 8F3BB723 4E5D42D0 84A14642 Public keys stored in /composer どうやらこれでkeyの設定ができたみたいです! では、再度S3ライブラリのインストールを試してみます。 4.再度ライブラリをインストール /work# composer require league/flysystem-aws-s3-v3 [26-Oct-2021 00:24:40 Asia/Tokyo] PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 83886080 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/RuleSet.php on line 90 Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 83886080 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/RuleSet.php on line 90 Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.root@a2b065cfb628:/work# すると、次はまた違うエラーが発生!! エラーについて調べると、こちらのサイト(https://qiita.com/miriwo/items/a5fa25c1d36d00f40ec9) を発見。 どうやら、メモリの容量が足りないと指摘されているみたいです。 参考サイトの通りに対処していきます。 5.メモリ確認 エラーメッセージにこのサイトを見て!とリンクが貼られていたので見てみましょう。 https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors リンク先に記載されているコマンドを実行して、現在の割り当てられている設定のメモリを確認します。 /work# php -r "echo ini_get('memory_limit').PHP_EOL;" 256M 6.php.iniの編集 php.iniファイルで割当メモリ設定を設定できるらしいので編集します! 先ずは、php.iniの場所を確認 /work# php --ini | grep "php.ini" Configuration File (php.ini) Path: /usr/local/etc/php Loaded Configuration File: /usr/local/etc/php/php.ini 次にviモードでphp.iniを開きます。 /work# sudo vi /usr/local/etc/php/php.ini bash: sudo: command not found あれ、sudoコマンドが実行できない? ここでまたエラーについて調べます。 すると、こちらのサイトを発見。 https://qiita.com/TK_bone/items/46542a2b94f86a7bc740 7.ディストリビューションを調べる ディストリビューション?って何?となりましたが、とりあえずサイトに記載されている通りにコマンドを実行していきます。 /work# cat /etc/debian_version 10.8 8.sudoコマンドインストール 次にsudoコマンドを使えるようにするためインストールします。 /work# apt update Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB] Get:2 http://security.debian.org/debian-security buster/updates/main amd64 Packages [309 kB] Get:3 http://deb.debian.org/debian buster InRelease [122 kB] Get:4 http://deb.debian.org/debian buster-updates InRelease [51.9 kB] Get:5 http://deb.debian.org/debian buster/main amd64 Packages [7906 kB] Get:6 http://deb.debian.org/debian buster-updates/main amd64 Packages [15.2 kB] Fetched 8469 kB in 3s (2597 kB/s) Reading package lists... Done Building dependency tree Reading state information... Done 30 packages can be upgraded. Run 'apt list --upgradable' to see them. /work# apt install sudo Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: sudo 0 upgraded, 1 newly installed, 0 to remove and 30 not upgraded. Need to get 1244 kB of archives. After this operation, 3882 kB of additional disk space will be used. Get:1 http://deb.debian.org/debian buster/main amd64 sudo amd64 1.8.27-1+deb10u3 [1244 kB] Fetched 1244 kB in 0s (4715 kB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package sudo. (Reading database ... 14634 files and directories currently installed.) Preparing to unpack .../sudo_1.8.27-1+deb10u3_amd64.deb ... Unpacking sudo (1.8.27-1+deb10u3) ... Setting up sudo (1.8.27-1+deb10u3) ... invoke-rc.d: could not determine current runlevel invoke-rc.d: policy-rc.d denied execution of start. 9.viインストール よし、今度はsudoコマンドが使えるようになったので再チャレンジ! /work# sudo vi /usr/local/etc/php/php.ini sudo: vi: command not found あれ、次はviコマンドが使えないとエラーが出ました?! こちらもサイトに記載されている通りにvimをインストールしていきます。 https://qiita.com/m-m00/items/a042bf9d5c7c85a64895 /work# vi /usr/local/etc/php/php.ini bash: vi: command not found root@a2b065cfb628:/work# sudo vi /etc/php.ini sudo: vi: command not found root@a2b065cfb628:/work# apt-get update Hit:1 http://security.debian.org/debian-security buster/updates InRelease Hit:2 http://deb.debian.org/debian buster InRelease Hit:3 http://deb.debian.org/debian buster-updates InRelease Reading package lists... Done /work# apt-get install vim Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: libgpm2 vim-common vim-runtime xxd Suggested packages: gpm ctags vim-doc vim-scripts The following NEW packages will be installed: libgpm2 vim vim-common vim-runtime xxd 0 upgraded, 5 newly installed, 0 to remove and 30 not upgraded. Need to get 7425 kB of archives. After this operation, 33.8 MB of additional disk space will be used. Do you want to continue? [Y/n] Y すると、インストール時に何やら質問がきました。 33.8MB使うけどいいか?と聞かれてるみたいなので、Yを入力してenterを押します。 すると、インストールが完了しました。 10.再度php.iniを編集 これで恐らくphp.iniが開けると思うので再チャレンジします。 /work# sudo vi /usr/local/etc/php/php.ini すると、今度は無事に開けましたね! では、下記の手順で編集します。 ①viを押してinsertに切り替え。 ②下記の部分を-1に変更 memory_limit = -1 ③escボタンを押して入力できないように切り替え。 ④:wqを入力してenterで変更内容を反映して保存。 11.再度S3ライブラリをインストール 再度ライブラリをインストールしますが、最初に叩いたコマンドに誤りがあったため、下記のように叩いてインストールします。 /work# composer require league/flysystem-aws-s3-v3 ↓ /work# composer require league/flysystem-aws-s3-v3:"^1.0" /work# composer require league/flysystem-aws-s3-v3:"^1.0" Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/ ./composer.json has been updated Loading composer repositories with package information Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/ Updating dependencies (including require-dev) Killed すると、インストールが上手くいくと思いきや、killedになってしまいました。 どうやら今度はdocker側のメモリが足りないことでインストールできなかったみたいです。 なかなか上手くいきませんね。。。 下記サイトを見つけたので、記載されている通りに対処してみます。 サイトを元にメモリの容量を増やしてください。 https://qiita.com/ikeyansaza/items/c231dc0f411336803f4d 12.再度S3ライブラリをインストール すると今度はインストールが上手くいったかと思います! Package manifest generated successfully. 80 packages you are using are looking for funding. Use the `composer fund` command to find out more! やっとインストールできましたね! ここまで大分長かったですがとりあえずインストールできて良かったです!
- 投稿日:2021-10-26T19:54:31+09:00
docker複数コンテナの立ち上げが面倒な時の.sh(備忘録)
困った事 テストで、Dockerコンテナの起動停止を何度もしなければいけない。 docker-compose.ymlでいくらサービスを集約しても、graylogやconsulなど、サービス単位が増えると、ymlがあるフォルダまで移動~起動コマンドを叩いたり、docker psするのが非常に面倒。。さらにテスト・本番環境のコンテナが同一環境にあってさらに面倒。。 解決策検討 解決策 考察 採用 kubernetes 学習コスト高い X .sh 書き方わかんない O 短絡的に、.shを勉強してみたいのと、他に方法思いつかないので.sh作ってみた。 前提条件(補足) ymlに「container_name:名前」でコンテナ名を定義する。 事情によりymlが格納されたフォルダ名とコンテナ名に違いがある。 解決 docker-up.sh #!bin/bash # 目的:本番環境コンテナの作成 # 処理の流れ: # 1 起動中のコンテナ名を取得 # 2 未稼働のコンテナ名を特定 # 3 コンテナ数が一致すれば全量満たしている為処理終了 # 4 差分があれば処理継続 # 登場ファイル # /tmp/confirmed_container_counts.txt -> 必要コンテナ数 # /tmp/now_established_container_names.txt -> 起動中コンテナ名 # /tmp/now_established_container_counts.txt -> 起動中コンテナ数 # 全量のコンテナ名を配列の値へいざnow(新たにコンテナが増えた際は、コンテナ名をここに追記) confirmed_containers_name=("containerA" "containerB" "containerC" "containerD" "containerE") # 想定する必要なコンテナ数を/tmp/confirmed_container_counts.txtに書き出し。 echo ">>> 必要コンテナ(数) >>>" echo "${#confirmed_containers_name[*]}" echo "${#confirmed_containers_name[*]}" > /tmp/confirmed_container_counts.txt # 起動中のコンテナ名を取得(names列名が含まれるため最初の1行削除) docker ps --format "table {{.Names}}" > /tmp/now_established_container_names.txt sed -i '1d' /tmp/now_established_container_names.txt echo ">>> 起動中コンテナ(名) >>>" cat /tmp/now_established_container_names.txt sleep 2 # 起動中のコンテナ数を把握 echo ">>> 起動中のコンテナ(数) >>>>" cat /tmp/now_established_container_names.txt | wc -l cat /tmp/now_established_container_names.txt | wc -l > /tmp/now_established_container_counts.txt sleep 5 echo ">>> コンテナ数差分チェック開始 >>>" # コンテナ数を比較 diff -s /tmp/confirmed_container_counts.txt /tmp/now_established_container_counts.txt # 必要数を満たしていれば処理終了 if [ $? = 0 ]; then echo ">>> 本番コンテナは全量起動中です。処理を終了します >>>" else echo ">>> コンテナは全量ではないため後続処理開始 >>>" # コンテナが全量でない場合の処理 # 必要コンテナ名群から1コンテナ名ずつ取り出し、起動中コンテナ名と合致するか正誤判定 for v in ${confirmed_containers_name[@]} do grep -q $v /tmp/now_established_container_names.txt if [ $? = 1 ]; then case "$v" in # 実際は正規表現。 containerA*) cd 'containerAのymlがあるディレクトリ' docker-compose up --build -d ;; containerB*) cd 'containerAのymlがあるディレクトリ' docker-compose up --build -d ;; containerC*) cd 'containerAのymlがあるディレクトリ' docker-compose up --build -d ;; containerD*) cd 'containerAのymlがあるディレクトリ' docker-compose up --build -d ;; containerE*) cd 'containerAのymlがあるディレクトリ' docker-compose up --build -d esac fi done fi 振り返り 意図した動作になり、結果作業は楽になった。.shに対するレベルが1ミリ上がった。 Qiitaデビューを果たした。 反省 コンテナの増減に合わせて、ハードコーディングしなければいけないので、サービス名は外だしすればよかた。 順序性が保たれない想定外の動きをしたため、sleepを利用しているが、正しい使用方法なのか調査。 コンテナ起動時のエラーに関しては、ファイルへ出力してもいいかもしれない(共有目的)。 upかdownかstopかを変数に入れて、起動停止ができたらなおよし。 イメージ構築が不必要な時にbuildいらないな。。
- 投稿日:2021-10-26T18:15:32+09:00
AWS CLI ver.2のインストールおよび設定
はじめに Amazon ECS (Elastic Container Service) を用いて AWS 上にアプリをデプロイしたい。そのためにまず Amazon ECR (Elastic Container Repository) へコンテナイメージの登録が必要だが、登録するには Docker を認証するために aws コマンドを実行しなければならない。(詳細はDocker イメージをプッシュするを参照。)自身の環境にインストール済みの AWS CLI は ver.1 であったため、この機会に最新メジャーバージョンの2へとアップデートした。実行環境は以下。 Ubuntu-20.04 (Windows 10 Pro, WSL2) AWS CLI バージョンの確認 以下コマンドで AWS CLI のバージョンを確認する。aws-cli/1.18.69 であった。 $ aws --version aws-cli/1.18.69 Python/3.8.10 Linux/5.10.16.3-microsoft-standard-WSL2 botocore/1.16.19 AWS CLI ver.1 のアンインストール AWS CLI ver.1 と ver.2 では同じ aws コマンド名が使用されるため、片方のみを使用することが公式で推奨されている。そこで、まず AWS CLI ver.1 のアンインストールを行う。AWS CLI バージョン 1 のインストール、更新、アンインストールに沿って行えばよい。 私の場合、$ sudo apt install awscli でインストールしたのだが、そのパターンは書かれていなかったので、以下コマンドでアンインストールした。 $ sudo apt purge awscli $ sudo apt autoremove 上記リンクには以下の記述があり、そもそも apt を使ったインストールは非推奨のようだ。 awscli パッケージは、apt や yum などの他のパッケージマネージャーのリポジトリで利用できますが、これらのパッケージは AWS によって生成、管理、サポートされません。このガイドに記載されている公式の AWS CLI ディストリビューションポイントからのみ AWS をインストールすることを推奨します。 AWS CLI ver.2 のインストール AWS CLI バージョン 2 のインストール、更新、アンインストールに沿って、AWS CLI ver.2 をインストールする。 $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" $ sudo apt install unzip # unzip コマンドがない場合のみ $ unzip awscliv2.zip $ sudo ./aws/install 以下コマンドでバージョンが2となっていることが確認できる。 $ aws --version aws-cli/2.3.0 Python/3.8.8 Linux/5.10.16.3-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off AWS CLI の設定 以下コマンドで AWS CLI の設定を行う。アクセスキーに関しては、AWS アカウントとアクセスキーを参考に発行する(または管理者に発行してもらう)。 $ aws configure AWS Access Key ID [None]: [Access Key ID] AWS Secret Access Key [None]: [Secret Access Key] Default region name [None]: ap-northeast-1 # リージョンが東京の場合 Default output format [None]: ENTER おわりに AWS CLI ver.2 のインストールおよび設定を行った。Docker 認証を行い、ECR へのコンテナイメージの登録、ECS でのデプロイを試していきたい。
- 投稿日:2021-10-26T17:29:44+09:00
Express + Sequelize ORM + PostgreSQL(Docker) でバックエンド:APIサーバーを学ぶ
前提条件 これらがインストールされていて使用可能な状態になっていること。 Node.js Docker Git Express.js の構築 $ npm install express-generator -g $ express $ npm install Docker を使用した PostgreSQL の構築 PostgreSQL を構築するための docker-compose.yml を作業ディレクトリに追加します。 /docker-compose.yml version: "3" services: postgresql: image: postgres:12-alpine container_name: postgresql ports: - 5432:5432 volumes: - db_data:/var/lib/postgresql/data environment: POSTGRES_USER: root POSTGRES_PASSWORD: hogehoge POSTGRES_DB: root POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=ja_JP.UTF-8" hostname: postgres restart: always user: root volumes: db_data: {} docker-compose.yml を追加したら docker-compose up -d コマンドを実行することで PostgreSQL が起動します。 Sequelize でテーブル作成 アプリから PostgreSQL に接続するためのパッケージと、 Sequelize ORM を使用するためのパッケージをインストールします。 $ npm install --save pg pg-hstore sequelize sequelize-cli Sequelize CLI を使用して Sequelize ORM を初期化します。初期化が完了すると作業ディレクトリに config.json や models ディレクトリが作成されます。 $ npx sequelize-cli init データベースへの接続設定が書かれている config/config.json を開いて development 設定を書き換えます。 /config/config.json "development": { "username": "root", "password": "hogehoge", "database": "root", "host": "127.0.0.1", "dialect": "postgres", "operatorsAliases": false }, Sequelize CLI を使用して新しいテーブルモデルを作成します。作成が完了すると models ディレクトリに user.js ファイルが作成されます。この記事では user テーブルを作成しています。 $ npx sequelize-cli model:generate --name user --attributes firstName:string,lastName:string,email:string Sequelize CLI を使用してデータベースにテーブルを作成します。マイグレーションコマンドを実行することによって、作成したモデルがテーブルとして追加されます。コマンド実行後にデータベースへ接続してテーブルが作成されていることを確認してみてください。 $ npx sequelize-cli db:migrate Express.js からテーブルに接続して値を返す routes/users.js を開いてコードをこのように置き換えます。テーブルに登録されている全てのレコードを返却しています。 /routes/users.js var express = require("express"); var router = express.Router(); let db = require("../models"); /* GET users listing. */ router.get("/", function (req, res, next) { db.user.findAll({}).then((users) => { res.send(users); }); }); module.exports = router; Seederでテストデータを追加する SeedとはDBテーブルに初期値として用意する(テスト)データです。Seedを作っておくと、テーブルを初期化してもまた同じデータを用意することができるのでとても便利です。 $ npx sequelize-cli seed:generate --name test-users 実行後、「/seeders/********-test-users.js」というファイルが作成されるので中身を以下のようにしてください。 2021*********-test-users.js 'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { const now = new Date(); return queryInterface.bulkInsert('users', [ { id: 1, firstName: '太郎', lastName: '田中', email: 'taro@example.com', createdAt: now, updatedAt: now}, { id: 2, firstName: '次郎', lastName: '山田', email: 'jiro@example.com', createdAt: now, updatedAt: now}, { id: 3, firstName: '三郎', lastName: '佐藤', email: 'saburo@example.com', createdAt: now, updatedAt: now}, ], {}); }, down: async (queryInterface, Sequelize) => { return queryInterface.bulkDelete('users', null, {}); } }; 以下のコマンドを実行してSeedを実行してみましょう。 $ npx sequelize-cli db:seed:all 実行が終わるとテーブルはこのようになります。 npm startコマンドを実行して、ブラウザから http://localhost:3000/users にアクセスして下記のような感じになれば成功です。
- 投稿日:2021-10-26T16:32:36+09:00
VScodeでdockerの開発環境(python)を使う。
Ubuntu20.04.3LTS Docker version 20.10.7 docker-compose version 1.29.1 nvidia-docker2(sudo apt-get install -y nvidia-docker2でNvidia Container Toolkitが導入される) VScode 1.61.1 RTX 3060 Driver Version: 470.74 python機械学習の開発環境をどうするか。 Anaconda:事業展開するときに有償ライセンスが必要かも知れない。 Docker Desktop:事業展開するときに有償ライセンスが必要かも知れない。 という背景から、ライセンスが緩いdockerとdocker-compose を使った方がいい?という動機。 最新の開発環境は、dockerで提供されるケースが増えているという助言も。 CUDAやcuDNN、tensorflowのバージョン合わせに疲れたこともある。 できれば、VScodeを使ってGUIで操作したという動機。 ここでは、VScodeの実行ボタンを押して、コンテナ内のpython上で実行させることを記述。 VScodeの拡張機能 VScodeのプロジェクトはフォルダ単位で管理される。ローカル(ホスト)とリモート(コンテナ)を行き来するので、どちらにいるのか気をつけておく。(左下の緑のリモートマークに注目) 以下の拡張機能をホスト側(通常インストールして開いた画面)でインストールする。 dockerの拡張機能を入れるとタブからコンテナ一覧を見たり、起動・削除ができるようになる。また、ファイルメニューからdockerfileを右クリックするとビルドできるが、今回の流れでは操作しない。コンテナのターミナルを起動することもできるが、混乱するので慣れるまでは使わない。 プロジェクトフォルダを開く dockerfileやdocker-compose.ymlがあるフォルダを開く。するとホストのファイルが表示される。dockerfileとdocker-compose.ymlの記載例は下の方にあります。その他、pythonのライブラリを一括でインストールするのに便利なrequirementsファイル、pythonのテスト用のファイルや(今回の流れでは無くても良いですが)学習管理サイトWeights&Biases(wandb)の設定ファイルなどが有ります。 コンテナのなかに入る 左下の「リモートウィンドウを開きます」 を押す。 ここから、Reopen in Containerを選ぶ。 すると、VScodeがdocker用の設定ファイルを作るベースを聞いてくる。Dockerfileのみの場合は、Dockerfile。docker-compose.ymlがあるならFrom docker-compose.ymlを選ぶ。 すると、左下のマークが替わり、コンテナに接続される。コンテナ内(リモート)の状態だ。 ホスト側のプロジェクトフォルダが、コンテナ内の/workspaceフォルダにデフォルトでマウントされる。このフォルダ内のファイルに対する変更や新規作成はホスト側に反映される。 同時に隠しフォルダ.devcontainerが作成されその下にdevcontainer.jsonとdocker-compose.ymlが作成させる。docker-compose.ymlは既存のと重複するが、隠しファイル内に作成されたものは、VScodeに必要な記述だけ記載するのが良いと思う。 コンテナ内でpythonファイルの実行 エクスプローラーからpythonのファイルを選ぶと実行ボタンがない。 メニューの実行からデバッグの開始やデバッグなしで実行を選ぶと、拡張機能がないと表示されるので、pythonの拡張をインストールする。ホストに拡張をインストールしていてもリモートのコンテナにはインストールしていないので必要になる。 拡張がインストールされると、右上に実行ボタンが表示されるようになった。 ちなみに最近、実行ボタンの色が緑から白に変わったようだ。 実行ボタンがうまく機能しない場合はpythonインタプリターの指定を確認する。 左下のを押すと、pythonのパスが複数表示される。これらは、ホスト側ではなく、リモート(コンテナ)側のパスである。 端末からwhich pythonを実行して一致するものを選ぶ。(今回の場合pythonとpython3はどちらも一緒) ホスト側に戻る 左下のボタンを押し、「リモート接続を終了する」を選ぶ。 VScodeが作業開始待ちの初期状態に戻る。 docker拡張のタブを見てみると、先ほどのコンテナが休止しているのが分かる。pruneボタンを押すと休止中のコンテナの削除ができる。 コンテナ用の拡張がビルド時にインストールされるように設定する dockerfileなどを変更して再ビルドを繰り返すとき、拡張が自動で入る方が楽です。この場合、隠しフォルダ内のdevcontainer.jsonに拡張機能の識別子を記述します。 識別子は拡張をクリックした画面の詳細情報のなかに記載がある。 コンテナ内で一般ユーザーとして実行する コンテナ内でマウントしたファイルを操作すると、所有者がrootに変わってしまい面倒だが、自分のdockerの使い方が違うのか?下に示すdockerfileの記述で一般ユーザーとしてファイル作成・上書きができる。コンテナ内のユーザー名はホスト側のユーザー名と異なっても大丈夫。コンテナ内で作成したファイルは、ホスト側から見るとホストの所有になる。ls -laで確認する。 今回使用したdockerfile # tensorflowがGPU上で使えるイメージ FROM nvcr.io/nvidia/tensorflow:21.09-tf2-py3 # ユーザーを作成 ARG UID=1000 RUN useradd -m -u ${UID} user # 作成したユーザーに切り替える # このユーザーはRUN, CMD, ENTRYPOINT, docker run, exec の実行ユーザ。 USER ${UID} # プロジェクトフォルダを/codeに追加する。ユーザー権限で扱えるようchownオプションを使う。 # ADDの実行権者はrootなのでオプションが必要。 ADD --chown=user:user . /code # 作成したフォルダに移動し、パッケージリストをインストールする。 WORKDIR /code RUN pip install -r requirements.txt # 作成時にホームディレクトリに置きたいファイルがあれば RUN cp .netrc ~ ここで呼び出しているrequirements.txt。利用したいパッケージを記載。うまく行っている環境があればpip freezeで取得。 requirements.txt matplotlib jupyter wandb あらかじめ作成しておいた、docker-compose.ymlの記述。 dockerfileで大枠を記載して、docker-compose.ymlで細かな部分を記述する感じ。docker-compose.ymlだけでも書けるらしい。 docker-compose.yml version: '3'# 3.2とかも記載できる。2,3系では命令が少し異なるらしい services: gpu_test: build: . # ドットはdockerfileの記述を使う意味 deploy: resources: reservations: devices: # GPUを利用するための記述。ホスト側はドライバだけ入れればいい。cudaとか不要。 - driver: nvidia count: 1 capabilities: [gpu] ports: - "8888:8888" #ジュピターノートブック用のポート hostname to 0.0.0.0 volumes: - /media/DATA_drive/DATA:/data:cached # データフォルダをマウント - .:/code:cached # ソースコードがあるフォルダをマウント tty: true 隠しフォルダに作成されたdocker-compose.yml 抜粋 docker-compose.yml #volumes: # Update this to wherever you want VS Code to mount the folder of your project #- .:/workspace:cached 上述のdocker-compose.ymlで記述したためコメントアウト # Overrides default command so things don't shut down after the process ends. # コンテナが自動終了しないようにするらしい command: /bin/sh -c "while sleep 1000; do :; done" devcontainer.json抜粋 devcontainer.json // The optional 'workspaceFolder' property is the path VS Code should open by default when // connected. This is typically a file mount in .devcontainer/docker-compose.yml "workspaceFolder": "/code",# ソースファイルをマウントしたフォルダを指定 // Add the IDs of extensions you want installed when the container is created. "extensions": ["ms-python.python"] # ビルド時に入れたい拡張機能を記述 dockerfileやdocker-compose.ymlを編集した後 ホスト側でdockerの記述を変更して、Reopen in Containerを選ぶと、右下のポップアップでリビルドするか無視するか聞かれるので、Rebuildを選ぶ。 リモート側で編集して、左下のリモートボタンを押した後Rebuid Containerを選んでも良い。 jupyter notebookの起動 コンテナ内のターミナルから、jupyter notebook で起動。docker-compose.ymlでブラウザに接続するポートの設定ずみ。 表示されたURLをホストのブラウザで開く。hostnameの部分は0.0.0.0に変える必要があった。 上述とは異なり、dockerfileだけのプロジェクトフォルダを使うとき Reopen in Containerを実行すると、隠しフォルダのdevcontainer.jsonのみが作成されコンテナに入る。デフォルトでコンテナ内の/workspace/プロジェクトフォルダ名にフォルダが作成され、ホスト側のプロジェクトフォルダがマウントされる。 コンテナ内でこのフォルダの変更はホスト側に反映される。
- 投稿日:2021-10-26T14:55:45+09:00
【2021年度10月版】Django REST frameworkをDockerで動かす(Pipenv、MySQL、pre-commit導入)
皆さん一度は聞いたことがあるであろうPythonの代表的なフレームワークDjango。 先週ぐらい前に初めて触れたのですが、開発効率がとんでもなく上がりますね。 なんといってもREST APIの構築がかなり簡単に行なえますし、今までAPIの構築をAPI GatewayやLambdaで構築していたのが時間の無駄だったのではないかと思うようになりました。 MySQL、Oracle、PosgreSQLなどのデータベースも豊富用意されていますし、今後はサーバーサイドの開発はDjangoで開発することが増えてきそうですね。 そんなDjangoをDockerで動かしてみようという記事になります。 私自身、Djangoに触れてからわずか1週間しか経っておらず、普段はフロントエンドを中心に開発しておりますので、記事の内容に不備がある可能性がございますのでその点はご了承下さい。 注意事項 Python2系はどうやらサポートが終了してるそうなので。、Python3系を使用します。 データベースはMySQLを使用しますが、他のデータベースを使用する場合はデータベースの設定の部分だけ適時変えて下さい。(インストールするライブラリとデータベースの設定ファイルを変えるだけなので、そこを変えたからと言ってエラーが出るということはほぼ無いと思います。) Macでの環境を前提に話を進めていきます。 APIやDBの設定の説明などは、既に記事を出している方も多いので省きます。 また、筆者の環境は以下になります。 項目 バージョン OS Big Sur v11.6(M1チップ) python3 3.9.7 pip 21.3 dokcer 20.10.8 それでは、多少長めの記事となっておりますが頑張っていきましょう! 事前準備 DjangoをDockerで動かす前に、まずは、必要なものをインストールしておきましょう。 Python・Pipコマンド確認 バージョン確認などでPython3コマンドとPipコマンドが使えるかの確認。 $ python3 --version $ pip --version Docker Desktop Docker専用のデスクトップアプリをダウンロードして下さい。 ただし、プロセッサーがIntelの場合とM1の場合でダウンロードするファイルが違うので、下記のアドレスを参考に今一度ご自身のプロセッサーをご確認下さい。 https://helpx.adobe.com/jp/download-install/kb/apple-silicon-m1-chip.html 下記のリンクから自分の環境に合ったDokcerをインストール。 プロセッサー バージョン Intel Mac with Intel chip M1 Mac with Apple chip https://docs.docker.com/desktop/mac/install/ VSCode拡張機能 拡張機能もインストール。 ・https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker Dockerはコンテナにアクセスするときに、長いコマンドを打つ羽目になるので上記の拡張機能をインストールしておくことをオススメします。 MySQL DjangoでMySQLを使用する場合mysqlclientというライブラリを使用するのですが、MySQLライブラリをインストールしていないとエラーが出るためインストール。 $ brew install mysql Pipenv プロジェクトごとにライブラリを管理するためにPipenvをインストール。 Nodeでいうnpmやyarnのことです。 $ brew install pipenv $ pipenv --version Django環境構築 それでは本題のDjangoをDockerで動かしていきましょう。 Docker Desktopを立ち上げた上で行って下さい。(dockerコマンドが打てないため) 必要なライブラリのインストール $ pipenv install django $ pipenv install djangorestframework $ pipenv install django-filter Docker設定ファイル $ touch Dockerfile docker-compose.yml Dockerfile FROM python:3.9 ENV PYTHONUNBUFFERED 1 WORKDIR /code ADD Pipfile* /code/ RUN cd /code && \ pip install -U pip && \ pip install pipenv && \ pipenv install --system --ignore-pipfile --deploy COPY . /code/ docker-compose.yml docker-compose.yml version: '3' services: db: platform: linux/x86_64 image: mysql:8.0 container_name: example_db environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: example-db MYSQL_USER: example MYSQL_PASSWORD: example-password TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci web: build: . container_name: example_web_app command: python3 manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db Djangoプロジェクト作成 $ docker-compose run web django-admin.py startproject example . この場合、exampleディレクトリが作成され、このディレクトリを起点に設定などを行っていきます。 MySQL設定 DjangoはデフォルトではSQLiteが使われているので、これをMySQLに変更。 example/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'example-db', 'USER': 'example', 'PASSWORD': 'example-password', 'HOST': 'db', 'PORT': '3306' } } docker-compose.ymlと値を一致させて下さい。 docker-compose.yml settings.py MYSQL_ROOT_PASSWORD なし MYSQL_DATABASE NAME MYSQL_USER USER MYSQL_PASSWORD PASSWORD ローカルサーバー立ち上げ ビルドして立ち上げます。(Pipenvで動かしているため少し時間がかかります) $ docker-compose up -d --build そして、http://localhost:8000へアクセス。 もしローカルサーバーが立ち上がらない場合は、VSCodeの左側にDockerのマークがあると思うのでそこをクリック。(拡張機能をインストールしないと表示されない) そこで、mysqlじゃない方を右クリックし「Restart」を選択。 するとローカルサーバーが起動します。 MySQLにアクセス VSCodeの左側のDockerのマークをクリック。 そのマークをクリックし、「mysql:8.0」で右クリック → 「Attch Shell」を選択。 $ mysql -u root -p > Enter password: docker-compose.ymlのMYSQL_ROOT_PASSWORDの値を入力 MySQLにアクセスできればOK。 試しにデータベースの一覧を表示してみましょう。 mysql > show databases; > docker-compose.ymlのMYSQL_ROOT_PASSWORDの値を入力 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | example-db | | sys | +--------------------+ 5 rows in set (0.02 sec) これでDjangoをDockerで動かすことが出来ましたね。 独自スクリプト・pre-commit導入 最後に快適な環境を手に入れるために独自スクリプトの追加とpre-commitを導入していきます。 独自スクリプト VueやReactで開発するときってローカルサーバーを立ち上げる場合、npm run startなどのコマンドを打ちますよね。 それらはpackage.jsonで定義されているのですが、それと同様にPipenvを使えば同じようにローカルサーバーを立ち上げたり、ビルドなども行えます。 現にビルドコマンドを追加してみます。 ディレクトリ直下のPipfileに[scripts]を追加。 [scripts] build = "docker-compose up -d --build" そしたら、pipenv runでこのコマンドを打ってみます。 $ pipenv run build すると、先程と同じようにビルドが開始されます。 あとは自分の好きなようにカスタマイズしてみて下さい! pre-commit pre-commitを導入する前に、まずはflake8とautopep8を導入します。 flake8 falke8とはPython版のESLintです。 とりあえずインストール。 $ pipenv install --dev flake8 flake8をスクリプトで走らせてみましょう。 Pipfileのscriptsに追加。 [scripts] build = "docker-compose up -d --build" lint = "flake8 ." $ pipenv run lint autopep8 お次はautopep8(Python版のPrettier)を導入しましょう。 $ pipenv install --dev autopep8 同じようにスクリプトを追加し、走らせてみる。 [scripts] build = "docker-compose up -d --build" lint = "flake8 ." format = "autopep8 -ivr ." $ pipenv run format また、PrettierやESLintと同様に自分好みの設定を施したい方は以下の記事が参考になります。 Pipenv で flake8 / autopep8 を上手く使う pre-commit導入 さて、最後にflake8とautopep8をGitでCommitする前に適用させるようにしていきましょう。 ちなみにpre-commitはPython版のHuskyみたいなものです。 $ brew install pre-commit $ pre-commit --version そしたら、設定ファイルの作成。 $ pre-commit sample-config > .pre-commit-config.yaml プロジェクト直下に.pre-commit-config.yamlが作成され、中身を以下に変更。 pre-commit-config.yaml # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://gitlab.com/pycqa/flake8 rev: 3.8.1 hooks: - id: flake8 args: [--ignore=E402, --max-complexity, "10", --max-expression-complexity=7, --max-cognitive-complexity=7] additional_dependencies: [flake8-bugbear, flake8-builtins, flake8-eradicate, pep8-naming, flake8-expression-complexity, flake8-cognitive-complexity] - repo: https://github.com/pre-commit/mirrors-autopep8 rev: v1.5.7 hooks: - id: autopep8 args: [--in-place, -r, --aggressive, --exclude, "manage.py,./*/migrations,./*/snapshots,./*,./**/__init__.py,hirameki/asgi.py", --max-line-length, "120"] 以下のコマンドでgitにhooksを追加。 $ pre-commit install これでコミットする前にflake8とautopep8が走ります。 実際にコミットし、プッシュしてみましょう。 $ git add . $ git commit -m 'pre-commit動作確認' $ git push いかがだったでしょうか? PipenvでPythonの環境構築を行ったのは今回が初めてなので、多少至らない部分もありますがその点はご了承下さい。 また、何か気になる点や間違っているところがあればコメント欄にて教えてくださると助かります。 エラーが出た場合もご気軽にご相談下さい! 以上、「【2021年度10月版】Django REST frameworkをDockerで動かす(Pipenv、MySQL、pre-commit導入)」でした! Thank you for reading 参考記事 以下、この記事を書くにあたって参考にさせていただいた記事となります。 ・2018年のPythonプロジェクトのはじめかた ・Django REST Frameworkを使って爆速でAPIを実装する ・Django+MySQLの開発環境をdocker-composeで構築する ・【Python】Pipfile.lockを活用したDockerとpipenvでの安全な環境構築 ・pre-commitでコミット時にコードの整形やチェックを行う
- 投稿日:2021-10-26T14:15:21+09:00
DockerでMySQLに接続する時に対応したエラー
問題1 エラー1 Mysql2::Error: Host '172.22.0.1' is not allowed to connect to this MySQL server 対処方法 ユーザーに、外部からのアクセス権を付与する 手順 1、ユーザーのhostを確認 SELECT host, user, plugin FROM mysql.user; +------------------+-----------+ | user | host | +------------------+-----------+ | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | user | localhost | +------------------+-----------+ 2、hostをlocalhost→%(ワイルドカード)に変更 CREATE USER 'user' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON * . * TO 'user'@'%' WITH GRANT OPTION; 3、再度hostの状態を確認して%になっていたらOK SELECT host, user, plugin FROM mysql.user; +------------------+-----------+ | user | host | +------------------+-----------+ | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | user | % | +------------------+-----------+ 問題2 エラー2 Unable to connect to host 127.0.0.1, or the request timed out. Be sure that the address is correct and that you have the necessary privileges, or try increasing the connection timeout (currently 10 seconds). MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2): image not found 対処方法 caching_sha2_password -> mysql_native_password に変更 手順 1、認証プラグインを確認 select user, host from mysql.user; +-----------+------------------+-----------------------+ | host | user | plugin | +-----------+------------------+-----------------------+ | % | user | caching_sha2_password | | localhost | mysql.infoschema | caching_sha2_password | | localhost | mysql.session | caching_sha2_password | | localhost | mysql.sys | caching_sha2_password | | localhost | root | caching_sha2_password | +-----------+------------------+-----------------------+ 2、pluginをmysql_native_passwordに変更 ALTER USER 'user'@"localhost" IDENTIFIED WITH mysql_native_password BY 'password'; 3、再度pluginの状態を確認してmysql_native_passwordになっていたらOK select user, host from mysql.user; +-----------+------------------+-----------------------+ | host | user | plugin | +-----------+------------------+-----------------------+ | % | user | mysql_native_password | | localhost | mysql.infoschema | caching_sha2_password | | localhost | mysql.session | caching_sha2_password | | localhost | mysql.sys | caching_sha2_password | | localhost | root | caching_sha2_password | +-----------+------------------+-----------------------+ 問題3 エラー3 SQLSTATE[HY000] [2002] Connection refused 対処方法 hostをコンテナ内のIPアドレスにする 同じDocker内の通信なのでlocalhost(127.0.0.1)でいいと思っていたのですが、コンテナでIPアドレスが異なるみたいです 手順 1、DBコンテナに接続してIPアドレスを確認 hostname -i root@b3179d7e8745:/# hostname -i 172.19.0.4 2、1で確認したhostを設定する $db = new PDO('mysql:host=172.19.0.4;dbname=db_name', $user, $pass);
- 投稿日:2021-10-26T14:08:00+09:00
研究の環境作る
Docker とりあえずubuntu20.04のdockerイメージを作成します。 Dockerfile FROM ubuntu:20.04 以下のコマンドを実行。 terminal docker build . # 最初だけ docker run -it ubuntu 以上でubuntu20.04の環境が作れます。 docker-compose いちいちコンテナIDをコピペするのが面倒なので、docker-composeを使って、楽しようと思います。 docker-compose.yml version: '3' services: # ubuntu コンテナ ubuntu: container_name: "ubuntu20.04" build: ./ # 同じディレクトリ内のDockerfileからビルド tty: true # コンテナが正常終了するのを防ぐため とりあえず必要最低限のcomposeファイルを作成してみた。 そしてコンテナの立ち上げから中に入るのには、以下のようなコマンドを実行。 terminal docker-compose build ubuntu # 最初だけ docker-compose up -d docker-compose exec ubuntu bash これで、コンテナのビルドと立ち上げ、そしてrootユーザーでdockerのコンテナに入ることができる。 MongoDBをいれる terminal apt-get install -y wget apt install gnupg wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add - echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" > /etc/apt/sources.list.d/mongodb-org-4.4.list apt update apt install -y mongodb-org ルートで実行することで、ここまではうまくいき、バージョン確認してみると、 terminal mongod --version db version v4.4.10 Build Info: { "version": "4.4.10", "gitVersion": "58971da1ef93435a9f62bf4708a81713def6e88c", "openSSLVersion": "OpenSSL 1.1.1f 31 Mar 2020", "modules": [], "allocator": "tcmalloc", "environment": { "distmod": "ubuntu2004", "distarch": "aarch64", "target_arch": "aarch64" } } 最新のバージョン (2021年現在)がインストールされた。 、、、が!なぜかmongodが起動できない。
- 投稿日:2021-10-26T12:01:40+09:00
Docker Desktop for Windwos 4.1.1へのアップグレードで起動しなくなった
環境 ホスト OS: Windows 10 Pro CPU:Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz RAM:32GB Docker Version: 更新前 4.0.1 → 更新後 4.1.1 Backend: WSL2 Docker Desktop for Windows を更新してみた 更新通知が来ていたので、更新した。バカだった。。。 4.1.1だったから大丈夫かと思った。4.1.0だと怖かったけど。。。 二度と立ち上がってこなくなった 「Docker Engine starting...」の表示のまま、二度と立ち上がることは無かった。。。 10分以上待って、エラー画面が出る。できることは、そのまま終了するか、継続させて「Factory Reset」くらい。 そして、Docker Backend プロセスのメモリ使用量は13GBを超えてた。欲張りめ! 試したこと ホストPC再起動 Docker Desktop for Windows のFactory Reset実行 Docker Desktop for Windows のアンインストール・インストール(Ver 4.1.1) 上記すべて効果なし。 結果 GitHubに結構な数のIssueが上がってた。面倒だから同じ現象の人は探さなかったけど、間違いなくバグだと思うので、対応策を探すよりも 4.0.1に戻すことに。 Issueの中にも「俺は4.0.1で快適だぜ!」という回答をしてる人も居るので、4.1.1を使うことが間違いだったな。ということで、さっさと戻した。あー、2時間無駄にした。 全然解決に至ってなくてごめんなさい。 自分用の備忘録ですので、悪しからず。