20200927のGitに関する記事は4件です。

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.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されないファイルも含まれます。ビルドコンテキスト以下の全てのファイルが含まれるのです。

build_context.png

.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ファイル以下の階層であれば、どの階層であっても無視されます。

例えば、

.gitignore
target

と記載すると、

target
src/target
path/a/b/target

などが無視されます。

.dockerignore

.dockerignoreでは、パスはすべて.dockerignoreが置かれているパスからの相対パスで記載します。1

例えば、

.dockerignore
target

と記載すると、

target

のみが無視され、

src/target
path/a/b/target

は無視されません。

.gitignoreのように任意の階層を対象にしたい場合は

dockerignore
**/target

と記載します。

サブディレクトリにあるignorefile

.gitignore

.gitignoreの場合、.gitignoreをサブディレクトリにも配置することができます。その場合は対象ファイルに近い方のルールが優先されます。

gitignore_directory.png

.dockerignore

.dockerignoreはビルドコンテキストルートにある.dockerignoreしか読み込まれません。サブディレクトリにある.dcokerignoreファイルは読み込まれません。

dockerignore_directory_2.png

Dockerfileのディレクトリとビルドコンテキストが異なる場合に注意が必要です。Dockerfileと同じ場所に.gitignoreを置くのではなく、ビルドコンテキストに.dockerignoreを配置します。

あとがき

もしかしてもう少し違いがあるかもしれませんが、今のところ見つけた違いはこのくらいでした。
快適なdockerライフを。

環境

  • Docker: 19.03.12
  • Docker for Mac: 2.3.0.5

参考資料リンク


  1. .gitignoreと同様にパスの先頭に / を付けることも可能です。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[rails] NOFILEのマイグレーションファイルを削除

事件内容

このようなファイルができてしまい、
rollbackができないため、マイグレーションファイルをdownさせることができない

up     20200926110535  ********** NO FILE **********

事件が起こった経緯

おそらくマイグレーションのステータスがUPの状態で
マイグレーションファイルを削除してしまった。

私の場合はgitデスクトップでchangeを丸ごと削除したので、この事件が起きた模様。

解決策

えっと、皆様が載せてくださっていた記事を何個か見させていただいた結果、無事解決いたしました。

まず、no faileに名前を付与するために
ターミナルでこのコマンドを実行してください:zap:
(マイグレーションIDはあなた様のnofileになっているIDに変えてください。
  その後の名前はダミーですのでなんでも構いません。)

% touch db/migrate/20200926110535_fuwafuwa.rb

実行後↓

20200926110535_fuwafuwa.rb
class Hoge < ActiveRecord::Migration[5.2]
  def change
  end
end

そうすれば、上記の名前マイグレーションファイルが
存在しているはずです。

バージョンはあなた様のrailsのバージョンを指定してください!!!!!:shamrock:

その後, rails db:migrate:statusで確認するとこのようになっていれば成功です。

up     20200926110535  fuwafuwa

あとは、先ほどのマイグレーションファイルを削除すれば無事解決!:corn:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者が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のzsh
11: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のzsh
11: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のzsh
11: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します。

cloudshell
cloudshell:09/26/20 02:54:33 ~/gce-cron-test $ git pull origin master

CloudShellのリポジトリに追加されたことを確認します。(後で、漏らしていたrequirements.txtを追加しています。)

cloudshell
cloudshell: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を使って必要モジュールを一括でインストールします。

cloudshell
cloudshell:09/26/20 02:55:10 ~/gce-cron-test $ pip install -r requirements.txt

pipのlistを確認します。
Macローカルで"pip freeze > requirements.txt"で丸ごと必要なモジュールをrequirements.txtに入れてるので、当然ながらちゃんと揃っています。

cloudshell
cloudshell: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"を実行してみます。

cloudshell
cloudshell: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のコードエディターで修正します。

cloudshell
cloudshell: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のパスを修正します。
スクリーンショット 2020-09-26 12.00.21.png

再実行です。

cloudshell
cloudshell: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時間となります。
スクリーンショット 2020-09-26 19.15.39.png

次回は、Google Compute EngineにVMを作成して、スクレイピングの動作確認、cronでの自動実行に挑みます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む