- 投稿日:2020-09-27T22:46:54+09:00
Install latest git for Debian10
cd ~ git clone https://github.com/git/git.git cd git make prefix=/usr/local all sudo make prefix=/usr/local install参考サイト
https://www.digitalocean.com/community/tutorials/how-to-install-git-on-debian-10
- 投稿日:2020-09-27T17:25:37+09:00
.dockerignoreが効かない?.gitignoreとは書き方が違うよ!
この記事は
.dockerignoreと.gitignore、名前が似ているし書き方も似ているので同じように書けばよいと思っていましたが、違いました。この記事では違いを見ていきます。
対象読者
.gitignoreは書いたことがあるけれど、.dockerignoreはあまり書いたことがない人
ポイント
.gitignoreの仕様は 公式ページのgitignoreのページ に記載されています。
日本語だとQiitaの .gitignoreの仕様詳解 が分かりやすいです。.dockerignoreの仕様は 公式ページのdocker build#dockerignore に記載されています。
主なルールは3つです。
- パターンマッチングには Go 言語の filepath.Match ルールが用いられています。
- 特別なワイルドカード文字列
**
をサポートしています。 これは複数のディレクトリ(ゼロ個を含む)にマッチします。- 行頭を感嘆符
!
で書き始めると、それは除外に対しての例外を指定するものとなります。.dockerignoreとは
.dockerignoreと.gitignoreの違いを説明する前に、docker build時のファイル転送と.dockerignoreの役割を説明します。
docker build時のファイル転送
Dockerfileをビルドする際、dockerはビルドコンテキスト以下をtarでまとめています。これは対象のディレクトリをdockerデーモンに転送するためです。
このtarの中には、COPYやADDされないファイルも含まれます。ビルドコンテキスト以下の全てのファイルが含まれるのです。.dockerignore
dockerビルドに必要ない(tarの中に入れたくない)ファイルは.dockerignoreに記載します。
.dockerignoreを作成することで、ビルド時間の短縮、docker imageサイズの最適化、機密情報(パスワードなど)の不本意な漏洩の防止、等の効果があります。ビルドコンテキストルート
ビルドコンテキストルートは、docker buildで使用するパスです。(Dockerfileの場所ではありません)
docker build -f path/to/Dockerfile myprj ----- ↑ docker buildの引数に指定しているパスがビルドコンテキストルート ↑上の例だと、
myprj
がビルドコンテキストルートです。上記の例の場合、.dockerignoreはmyprj
ディレクトリに配置します。.dockerignoreと.gitignoreの違い
さて本題です。.dockerignoreと.gitignore、目的も書き方も似ていますが、実装は同じではありません。仕様も違っています。
パスの指定の仕方
.gitignore
.gitignoreでは書かれたファイルorディレクトリ名は.gitignoreファイル以下の階層であれば、どの階層であっても無視されます。
例えば、
.gitignoretargetと記載すると、
target src/target path/a/b/targetなどが無視されます。
.dockerignore
.dockerignoreでは、パスはすべて.dockerignoreが置かれているパスからの相対パスで記載します。1
例えば、
.dockerignoretargetと記載すると、
targetのみが無視され、
src/target path/a/b/targetは無視されません。
.gitignoreのように任意の階層を対象にしたい場合は
dockerignore**/targetと記載します。
サブディレクトリにあるignorefile
.gitignore
.gitignoreの場合、.gitignoreをサブディレクトリにも配置することができます。その場合は対象ファイルに近い方のルールが優先されます。
.dockerignore
.dockerignoreはビルドコンテキストルートにある.dockerignoreしか読み込まれません。サブディレクトリにある.dcokerignoreファイルは読み込まれません。
Dockerfileのディレクトリとビルドコンテキストが異なる場合に注意が必要です。Dockerfileと同じ場所に.gitignoreを置くのではなく、ビルドコンテキストに.dockerignoreを配置します。
あとがき
もしかしてもう少し違いがあるかもしれませんが、今のところ見つけた違いはこのくらいでした。
快適なdockerライフを。環境
- Docker: 19.03.12
- Docker for Mac: 2.3.0.5
参考資料リンク
- Dockerfile リファレンス — Docker-docs-ja 17.06 ドキュメント#dockerignore-file
- build — Docker-docs-ja 17.06 ドキュメント#dockerignor
- Dockerfile 記述のベストプラクティス | Docker ドキュメント#ビルドコンテキストの理解
- Docker Buildにおけるリードタイム短縮のための3つの改善ポイント | PLAID engineer blog
- docker-compose で一向にビルドがはじまらない、もしくは起動しない。はたまた忘れたころに起動する。 - Qiita
.gitignoreと同様にパスの先頭に
/
を付けることも可能です。 ↩
- 投稿日:2020-09-27T12:27:04+09:00
[rails] NOFILEのマイグレーションファイルを削除
事件内容
このようなファイルができてしまい、
rollbackができないため、マイグレーションファイルをdownさせることができないup 20200926110535 ********** NO FILE **********事件が起こった経緯
おそらくマイグレーションのステータスがUPの状態で
マイグレーションファイルを削除してしまった。私の場合はgitデスクトップでchangeを丸ごと削除したので、この事件が起きた模様。
解決策
えっと、皆様が載せてくださっていた記事を何個か見させていただいた結果、無事解決いたしました。
まず、no faileに名前を付与するために
ターミナルでこのコマンドを実行してください
(マイグレーションIDはあなた様のnofileになっているIDに変えてください。
その後の名前はダミーですのでなんでも構いません。)% touch db/migrate/20200926110535_fuwafuwa.rb実行後↓
20200926110535_fuwafuwa.rbclass Hoge < ActiveRecord::Migration[5.2] def change end endそうすれば、上記の名前マイグレーションファイルが
存在しているはずです。バージョンはあなた様のrailsのバージョンを指定してください!!!!!
その後, rails db:migrate:statusで確認するとこのようになっていれば成功です。
up 20200926110535 fuwafuwaあとは、先ほどのマイグレーションファイルを削除すれば無事解決!
- 投稿日:2020-09-27T10:49:48+09:00
初心者がPythonでウェブスクレイピング(4) - 2
それでは前回作成したCloud Source RepositroiesのリポジトリにスクレイピングのPGMを追加していきます。
Pythonでのウェブスクレイピング学習のロードマップ
(1)ローカルでとりあえず目的のブツのスクレイピングに成功する。
(2)ローカルでスクレイピングした結果をGoogleスプレッドシートに連携する。
(3)ローカルでcron自動実行を行う。
(4)クラウドサーバー上での無料自動実行に挑戦する。(Google Compute Engine)
(4)-1 クラウドにテスト用PGMを載せて、CloudShell上で正常稼働させる
(4)-2 スクレイピングPGMをリポジトリに追加し、CloudShell上で正常稼働させる。 ←いまココ
(4)-3 ComputeEngineのVMインスタンスを作成して、スクレイピングを自動実行させる。
(5)クラウド上で、サーバーレスでの無料自動実行に挑戦する。(たぶんCloud Functions + Cloud Scheduler)今回の手順
[1]ローカルのリポジトリにスクレイピングPGMを追加
[2]Cloud Source Repositories のマスターにpush
[3]マスターからCloudShell上のクローンにpull
[4]requirements.txtを使った必要モジュールの一括インストール
[5]CloudShell上でのスクレイピングの実行[1]ローカルのリポジトリにスクレイピングPGMを追加
ローカルのリポジトリにファイルを追加します。
Macのzsh11:28:14 [~] % cd gce-cron-test 11:28:25 [~/gce-cron-test] % ls -la total 40 drwxr-xr-x 7 hoge staff 224 9 26 11:27 . drwxr-xr-x+ 45 hoge staff 1440 9 23 16:45 .. -rw-r--r--@ 1 hoge staff 6148 9 26 11:26 .DS_Store drwxr-xr-x 13 hoge staff 416 9 23 16:49 .git -rw-r--r-- 1 hoge staff 146 9 21 15:29 cron-test.py -rw-r--r--@ 1 hoge staff 2352 9 16 17:54 my-web-hoge-app-hogehoge.json -rw-r--r-- 1 hoge staff 2763 9 17 13:22 requests-test2.pyコミットが必要なファイルがあることを確認し、add、commitを行います。
Macのzsh11:28:28 [~/gce-cron-test] % git status On branch master Your branch is up to date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed) .DS_Store my-web-hoge-app-hogehoge.json requests-test2.py nothing added to commit but untracked files present (use "git add" to track) 11:28:34 [~/gce-cron-test] % 11:28:52 [~/gce-cron-test] % 11:28:53 [~/gce-cron-test] % git add . 11:28:58 [~/gce-cron-test] % 11:29:38 [~/gce-cron-test] % 11:29:38 [~/gce-cron-test] % git commit -m "Add requests-test to Cloud Source Repositories" [master 44abc4d] Add requests-test to Cloud Source Repositories 3 files changed, 73 insertions(+) create mode 100644 .DS_Store create mode 100644 my-web-hoge-app-hogehoge.json create mode 100644 requests-test2.py[2]Cloud Source Repositries のマスターにpush
masterへのpusuを行います。
Macのzsh11:30:13 [~/gce-cron-test] % 11:30:23 [~/gce-cron-test] % 11:30:23 [~/gce-cron-test] % git push origin master Enumerating objects: 6, done. Counting objects: 100% (6/6), done. Delta compression using up to 4 threads Compressing objects: 100% (5/5), done. Writing objects: 100% (5/5), 3.48 KiB | 891.00 KiB/s, done. Total 5 (delta 0), reused 0 (delta 0) To https://source.developers.google.com/p/my-gce-app/r/gce-cron-test 938ea70..44abc4d master -> master 11:31:37 [~/gce-cron-test] %[3]マスターからCloudShell上のクローンにpull
CloudShellで前回クローンしたリポジトリにpullします。
cloudshellcloudshell:09/26/20 02:54:33 ~/gce-cron-test $ git pull origin master
CloudShellのリポジトリに追加されたことを確認します。(後で、漏らしていたrequirements.txtを追加しています。)
cloudshellcloudshell:09/26/20 02:55:06 ~/gce-cron-test $ cloudshell:09/26/20 02:55:06 ~/gce-cron-test $ ls -la total 40 drwxr-xr-x 3 hoge hoge 4096 Sep 26 02:52 . drwxr-xr-x 13 hoge rvm 4096 Sep 23 11:18 .. -rw-r--r-- 1 hoge hoge 80 Sep 23 11:09 cron.log -rw-r--r-- 1 hoge hoge 146 Sep 23 09:03 cron-test.py -rw-r--r-- 1 hoge hoge 6148 Sep 26 02:47 .DS_Store drwxr-xr-x 8 hoge hoge 4096 Sep 26 02:52 .git -rw-r--r-- 1 hoge hoge 2352 Sep 26 02:47 my-web-scraping-app-hogehoge.json -rw-r--r-- 1 hoge hoge 2763 Sep 26 02:47 requests-test2.py -rw-r--r-- 1 hoge hoge 334 Sep 26 02:52 requirements.txt[4]requirements.txtを使った必要モジュールの一括インストール
requirements.txtを使って必要モジュールを一括でインストールします。
cloudshellcloudshell:09/26/20 02:55:10 ~/gce-cron-test $ pip install -r requirements.txtpipのlistを確認します。
Macローカルで"pip freeze > requirements.txt"で丸ごと必要なモジュールをrequirements.txtに入れてるので、当然ながらちゃんと揃っています。cloudshellcloudshell:09/26/20 02:55:41 ~/gce-cron-test $ pip list Package Version -------------------- --------- appdirs 1.4.4 beautifulsoup4 4.9.1 cachetools 4.1.1 certifi 2020.6.20 chardet 3.0.4 distlib 0.3.1 filelock 3.0.12 google-auth 1.21.0 google-auth-oauthlib 0.4.1 gspread 3.6.0 httplib2 0.18.1 idna 2.10 oauth2client 4.1.3 oauthlib 3.1.0 pip 20.1.1 pyasn1 0.4.8 pyasn1-modules 0.2.8 requests 2.24.0 requests-oauthlib 1.3.0 rsa 4.6 setuptools 47.1.0 six 1.15.0 soupsieve 2.0.1 urllib3 1.25.10 virtualenv 20.0.31 WARNING: You are using pip version 20.1.1; however, version 20.2.3 is available. You should consider upgrading via the '/home/hoge/.pyenv/versions/3.8.5/bin/python3.8 -m pip install --upgrade pip' command.[5]スクレイピングの実行
スクレイピングのPGM"requests-test2.py"を実行してみます。
cloudshellcloudshell:09/26/20 02:55:49 ~/gce-cron-test $ python requests-test2.py Traceback (most recent call last): File "requests-test2.py", line 40, in <module> sheet = get_gspread_book(secret_key, book_name).worksheet(sheet_name) File "requests-test2.py", line 20, in get_gspread_book credentials = ServiceAccountCredentials.from_json_keyfile_name(secret_key, scope) File "/home/hoge/.pyenv/versions/3.8.5/lib/python3.8/site-packages/oauth2client/service_account.py", line 219, in from_json_keyfile_name with open(filename, 'r') as file_obj: FileNotFoundError: [Errno 2] No such file or directory: '/Users/hoge/git-repository/env2/my-web-hoge-app-hogehoge.json'うっかり、そんなファイルはありません。Macローカルのフルパス指定のままだったので当然です。
ローカルはVScodeですが、こちらはCloudShellのコードエディターで修正します。cloudshellcloudshell:09/26/20 02:55:55 ~/gce-cron-test $ pwd /home/hoge/gce-cron-test cloudshell:09/26/20 02:56:12 ~/gce-cron-test $ cloudshell open requests-test2.py"cloudshell open"コマンドでコードエディターが立ち上がるので、jsonのパスを修正します。
再実行です。
cloudshellcloudshell:09/26/20 03:00:32 ~/gce-cron-test $ cloudshell:09/26/20 03:00:33 ~/gce-cron-test $ python requests-test2.py 2020/09/26 03:01:15 スクレイピングを終了しました。 cloudshell:09/26/20 03:01:18 ~/gce-cron-test $無事にスクレイピングできました。
尚、ソースの全容はこちら。初心者がPythonでウェブスクレイピング(2)
尚、GCP上の時間はデフォルトでUTCですので、東京時間−9時間となります。
次回は、Google Compute EngineにVMを作成して、スクレイピングの動作確認、cronでの自動実行に挑みます。