20200911のdockerに関する記事は11件です。

rails チュートリアル

4章まで終了
次回5章から

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

Docker Hubで配布されているDocker ImageをGoogle Container Registry に push してそのImageを元にVMを起動する

注意

本記事は自分用のメモの為、体裁が整っていません。ご了承ください。

記事を書く動機

以下のようなケースに対処する必要があり、手順などをアウトプットするため。

  • Digdag, Embulk サーバー構築用の Docker Image を(Docker Hubで)共有してもらい、
  • それを用いてGCPのVMを立ててサーバー構築する

参考ページ

始める前に

  1. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。
  2. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。(参考
  3. Container Registry API を有効にします。
  4. Cloud SDK をインストールして初期化します。
  5. Docker をインストールします。
    1. Ubuntu, debianなどの場合は、sudo usermod -a -G docker ${USER}+再起動により、sudoなしでdockerコマンドを実行できるようにしましょう

手順一覧

  1. Docker Imageを Docker Hub から pullする
  2. (pullした)Docker Image を Container Registry にpushする
  3. Container Registry に push したDocker Imageを元にVMを起動する
  4. 課金されないようにクリーンアップ

1. Docker Imageを Docker Hub から pullする

今回は例として、busyboxを使います。

docker pull busybox:latest
# check image
docker image ls
REPOSITORY  TAG     IMAGE ID      CREATED       SIZE
busybox     latest  6d5fcfe5ff17  8 months ago  1.22MB

2. (pullした)Docker Image を Container Registry にpushする

2.1. gcloud コマンドライン ツールを認証ヘルパーとして使用するように docker を構成する

以下、参考ページより引用

イメージを push または pull するには、gcloud コマンドライン ツールを使用して Container Registry へのリクエストを認証するように Docker を構成する必要があります。これを行うには、次のコマンドを実行します(実行する必要があるのは一度だけです)。

gcloud auth configure-docker

2.2. イメージにレジストリ名をタグ付けする

docker push は通常だとDocker Hubにpushします。特定の場所にpushしたい場合は、レジストリ名のタグを書き換えることで制御するようです。

参考ページより引用

Docker イメージを Container Registry に push する前に、そのイメージにレジストリ名をタグ付けする必要があります。Docker イメージにレジストリ名をタグ付けすると、イメージを特定の場所に push するように docker push コマンドが構成されます。このクイックスタートでは、ホストの場所は gcr.io です。Docker イメージにタグを付けるには、次のコマンドを実行します。

docker tag busybox gcr.io/[PROJECT-ID]/busybox:v1
# check img
REPOSITORY                   TAG  IMAGE ID      CREATED       SIZE
gcr.io/[PROJECT-ID]/busybox  v1   6d5fcfe5ff17  8 months ago  1.22MB

2.3. イメージを Container Registry に push する

docker push gcr.io/[PROJECT-ID]/busybox:v1

3. Container Registry に push したDocker Imageを元にVMを起動する

※一旦GUIでVM起動するケースを考える

GCPのダッシュボード画面から ComputeEngine->VMインスタンス という流れでVMインスタンス起動画面に移行する。

VM起動画面において、コンテナイメージからインスタンス生成する旨を入力する(下図)

image.png

コンテナイメージには、例に記載されたように事前にpushしたコンテナイメージのパスを記載する。
ContainerRagistryに保存しているコンテナイメージを指定する際は、gcr.io/... というパスになる。

※本VMと同一プロジェクト内のGCRに保存されているイメージに対してはデフォルトでpullする権限が与えられているのでアクセス権限周りは調整する必要はない。そうでない場合は、イメージをpullしようとするサービスアカウントに対して、コンテナイメージを格納しているGCSバケットに対して適切なアクセス権限を付与する必要がある。
参考

あとはVMインスタンス作成ボタンを押すだけ。

4. 課金されないようにクリーンアップ

4.1. ContainerRegistryのクリーンアップ

Google Cloud での Container Registry の使用によれば、

gcloud container images delete gcr.io/[PROJECT-ID]/busybox:v1 --force-delete-tags

で実行できるとのことだが、以下のエラーによりgcloudコマンドからのDocker Image 削除ができなかった。

ERROR: (gcloud.container.images.delete) [gcr.io/[PROJECT-ID]/busybox:v1] is not a valid name. Expected tag in the form "base:tag" or "tag" or digest in the form "sha256:<digest>"

(現在調査中……)

今回は、Google Cloud ConsoleよりGCRの該当イメージを削除する。

つもりが、見当たらない。。。。(?)

4.2. ComputeEngineのクリーンアップ

Google Cloud Console でVMインスタンスを削除します。

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

《コロナに負けず!!》29歳で営業職からジョブチェンジ。未経験で受託開発企業から内定を頂けました。

はじめに

昨年「エンジニアになるぞ!」と決意をし、
今年の3月に前職を退職(最終出社)、
3月下旬からプログラミングスクールに通いました。

現在、29歳(今年で30歳!)です。
新卒からずっと営業職で、プログラミングは未経験。

そんな自分でも、webエンジニアのスタートラインに
立つ事が出来ました。

自分なりに戦略を立てて行った就活でもありましたので、
就職活動中の方の参考にして頂ければ幸いです。

目次

・工夫して就活を行おうとした背景
・就活の結果
・学習開始〜内定までの流れ
・今回の転職活動でのポイント
・ポートフォリオについてのポイント
・学習方法について(おまけ)
・最後に

工夫して就活を行おうとした背景

(興味ない方は読み飛ばして下さい!笑)

スクールに入った時点の私は転職に関しての認識が甘く、

「高い金額のスクールで基礎をしっかり学べば、転職はできるはず!」
「スクールからも紹介があるし!」
などと、このくらいの認識でした。

ですが、この認識は間違いです!!!

少なくとも、20代前半の若い方でない限りは
エージェントからの紹介案件はごく少数になります。
※SESならいっぱいあります!

企業側としてはエージェントを通して採用をすると、
その人の年収の30%程を支払う必要があります。

つまり年収350万円の人材なら105万円もお金がかかります。

それならば、エージェント経由ではより若く優秀な人材だけを
選びたいですよね?

そのため、エージェントから紹介される案件は
応募者の年齢や経験などが非常に大事になります。

そのため、年齢が高くなるほど
そもそも紹介される案件の数は絞られます。

そこに、今回はコロナによる経済打撃もあり
自分がスクールでの学習を終えた2020年6月、
「未経験」でのスクール経由の募集案件は3件のみでした。

しかし、3社とも書類選考が通らず、、、涙

そこでやっと、このままでは「やばいぞ!!」と
気付かされました。。。

そこで、ここから必死に情報の収集と
採用までの戦略を立てることにしました。

就活結果について

《内定》
・2社(受託開発)

《応募》
・企業HPからの直接応募:20社
・スクールのエージェント経由での応募:3社
・求人サイトでの応募:10社ほど
・DODAのエージェント経由での応募:20社ほど

学習開始〜内定までの流れ

◇学習期間
2020年3月末月〜7月末(4ヶ月間)

◇転職活動期間
2020年8月(1ヶ月間)

《3月末〜5月末まで》
プログラミングスクールにて学習、卒業

《6月》
1ヶ月かけて初めての自主制作アプリを作成!

ですが、他の方のポートフォリオのレベルの高さを見て絶望し、
2つ目のポートフォリの作成を決意しました!

《7月》
2週間程で2つ目のポートフォリを作成!
そこから2週間はインフラの環境構築やCI/CDに
挑戦していました。

《8月》
企業HPからのweb応募を開始しました!
8月末に内定を獲得!

今回の転職活動でのポイント

  1. しっかり作り込んだポートフォリオを用意した
    →スクール卒業後、すぐに転職活動を開始せずにポートフォリオの強化に努めました

  2. 応募は企業のHPから送ることを徹底した
    →書類選考の突破が重要です

上記の2点が今回の就活でのポイントになります。

ポートフォリオについてのポイント

自主制作アプリ:「BestYourTitle」

このアプリは、求人広告のライター初心者や採用担当者が、
求人広告を書く際に「応募したい!」と思ってもらえるような
キャッチコピーを書けるよう、練習出来るサイトです。

▼URL
https://www.bestyourtitle.com/
※かんたんログイン機能で、ゲストとしてログイン出来ます。

▼GitHub
https://github.com/y-kiku1111/docker_byt
※ポートフォリオに関しての詳細は、上記Githubに記載しています

0807b84593e579d5e9515addd31381f5.gif

87216988-a08bc980-c37f-11ea-8c7a-46716366a1cb.jpg

内定頂いた2社とも、ポートフォリオについて
非常に高評価を頂けました。

特にDocker、AWSのFargateは
印象が良かったです。

ただ、実際に見て頂くと
サイト自体はレベルの高いものではないので、

・モダンな技術に挑戦し、その企業で活用している技術とマッチした
・サイトデザインやインフラ構成図など、目に見える差別化を行う

この2点に尽きるのかなと思います。

また、ポートフォリオに関しましては
youtuberの勝又さんの動画やオンラインサロンで
「高評価されるポートフォリオ」がどの程度のレベルなのかを
知ることが出来、とても参考にさせて頂きました!

スクールではポートフォリオに関してのアドバイスは
一切ありませんでしたので、

実際に採用された初学者のポートフォリオが
数多く見れるのは、非常に有り難かったです。

就職活動についてのポイント

・求人サイトを使って応募したい企業のリストアップ
・エージェントサービスを利用しての面接練習や情報の入手(応募もしましょう)
・上記を行った上でHPからの直接応募

これが自分の中では、最も効率的かと思います。

リストアップに利用した求人サイト
・wantedly
・Green
・Find job!

特にFindjobは、業務未経験OKの企業で絞ることが出来て
重宝しました。

基本的には上記のサイトから応募するのではなく、
サイトからリストアップをして直接応募をします。

なぜ直接、採用HPから応募をするかと言うと、
求人サイトによっては、エージェントと同じく
掲載は無料だが、採用すると企業にお金がかかるサイトもあるため
企業HPからの応募が、企業側にメリットが大きいためです。

採用課金型でなければ、
求人サイトからの応募も一緒にした方が
良いかと思います。

例えば、1日10社を目標に各企業のHPから
応募をし続けると良いと思います。
(自分は1日5社と決めていました)

書類選考さえ突破すれば、あとはエージェントさんと
練習した面接だけです。

しっかりと自分がエンジニアになりたい理由、
また作り込んだポートフォリについて熱弁できれば問題無いはずです!

学習方法について(おまけ)

個人的には、強制的に勉強に集中し基礎を学べるスクールは
重宝しましたので、やるかやらないかなら、お勧めです。

ただ、スクールはあくまで基礎を学ぶための環境にお金を出すようなイメージです。
そのため、スクール費用が高すぎると割に合わない可能性もあります!

スクールを卒業するだけでは、レベルとしては確実に低いと思いますので、
例えばメンターさんを雇いながらポートフォリオのレベルを高めるなど、
基礎を身につけてからの自己学習を強く推奨します。

自分はMENTAというサービスを利用していました。
(https://menta.work/about)

最後に

ここまで長文を読んで頂き、
本当にありがとうございました!

長くなりましたが、上記が自分の転職活動で
意識したことや、実践したことになります。

少しでも、お役に立てましたら幸いです。

また、今回やっとエンジニアのひよっことして
スタートラインに立てたのは、自分の転職活動を支えて下さった
周りの方々のお陰です。

無職になったのにも関わらず応援してくれた同居人や、
期待を込めて送り出して頂いた前職の上司や同僚、
心配しながらも応援して下さった両親、

本当にありがとうございました!!!

就職した企業は、ひよっこではなく
成果を出す人材を期待して頂いているかと思いますので、
その期待を超えられるよう、頑張って行きます!

改めまして、最後までお読み頂きありがとうございました!

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

Dockerで使い捨てPHP

環境

  • Windows 10
  • Docker Toolbox

目的

使い捨てのPHP環境を構築するため

手順

ディレクトリ構成

[d]
┗ [docker]
  ┗ [php73]
    ┣ Dockerfile
    ┗ [src]
      ┗ index.php

Dockerfile作成

ベースイメージはあらかじめ dockerhub で検索しておく。

Dockerfile
FROM php:7.3.22-apache-stretch
COPY src/ /var/www/html

RUN apt-get update

Dockerfileからイメージをビルドする

$ cd /d/docker/php73
$ docker build --tag=hellophp .

イメージの一覧を表示してビルドがあるか確認

$ docker image ls

イメージからコンテナを起動する

$ docker run -p 5000:80 --name myphp -d hellophp

DockerマシンのIPアドレスを確認する

Docker-Toolbox は localhost ではない。
DockerマシンのIPアドレスを確認する必要がある。

$ docker-machine ls

動作確認

確認したIPアドレスとコンテナ起動時のホスト側のポート番号の組み合わせでアクセスできる。

http://{IPアドレス}:5000

あと片付け

コンテナのIDを確認して停止させる。

$ docker ps
$ docker stop {CONTAINER ID}

その他

使わなくなったコンテナは削除もできる。

$ docker ps -a
$ docker rm {CONTAINER ID}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerのコンテナ内のmysqlの日本語設定

はじめに

Rails初学者ですが、docker+mysqlで開発したい!と思いdockerでrailsのプログラミングをしています。
イロイロ試行錯誤しながら、dockerコンテナを作っては消し、作っては消しを繰り返ししています。
(めちゃくちゃ面倒)
その都度、dockerコンテナの日本語設定をしているので、改めてまとめてみました。

*この設定を行わないと、日本語が正しく表示されず????になります。
*多分都度都度でやらなくてもイロイロ方法があるんだと思う・・・ご教示いただければ幸いです。

*以下のqiitaを全面的に参考にさせていただいております。ありがとうございます。
https://qiita.com/maejima_f/items/4d5432aa471a9deaea7f

Dockerコンテナに入る


$ docker exec -it コンテナ名 bash

コンテナ内でlocaleの設定を確認する

root@XXXX :/# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

このlocaleの情報を日本かつUTF-8に変更するところからスタートです。
その前にコンテナ内をアップデートしたり、vimを入れ準備します。

root@XXXX :/# apt-get update
root@XXXX :/# apt-get install vim

*どちらも途中でインストールしますか?がでてきますのでyを入力し、コンテニューさせます。

2つを行ったあと、以下の設定を行います。

1.言語設定

*何度かenterを押しているとLocales to be generated:が出てくるので
 日本語の285. ja_JP.UTF-8 UTF-8 を入力しenterを押す(285は変わる可能性があります)

root@XXXX :/# dpkg-reconfigure locales

-------------------

Locales are a framework to switch between multiple languages and allow users to use their language, country, characters, collation
order, etc.

Please choose which locales to generate. UTF-8 locales should be chosen by default, particularly for new installations. Other
character sets may be useful for backwards compatibility with older systems and software.

  1. All locales               125. el_GR ISO-8859-7               249. gl_ES ISO-8859-1           373. pl_PL ISO-8859-2
  2. aa_DJ ISO-8859-1          126. el_GR.UTF-8 UTF-8              250. gl_ES.UTF-8 UTF-8          374. pl_PL.UTF-8 UTF-8
  3. aa_DJ.UTF-8 UTF-8         127. el_GR@euro ISO-8859-7          251. gl_ES@euro ISO-8859-15     375. ps_AF UTF-8
  4. aa_ER UTF-8               128. en_AG UTF-8                    252. gu_IN UTF-8                376. pt_BR ISO-8859-1
  5. aa_ER@saaho UTF-8         129. en_AU ISO-8859-1               253. gv_GB ISO-8859-1           377. pt_BR.UTF-8 UTF-8
  6. aa_ET UTF-8               130. en_AU.UTF-8 UTF-8              254. gv_GB.UTF-8 UTF-8          378. pt_PT ISO-8859-1
  7. af_ZA ISO-8859-1          131. en_BW ISO-8859-1               255. ha_NG UTF-8                379. pt_PT.UTF-8 UTF-8
  8. af_ZA.UTF-8 UTF-8         132. en_BW.UTF-8 UTF-8              256. hak_TW UTF-8               380. pt_PT@euro ISO-8859-15
  9. agr_PE UTF-8              133. en_CA ISO-8859-1               257. he_IL ISO-8859-8           381. quz_PE UTF-8
  10. ak_GH UTF-8              134. en_CA.UTF-8 UTF-8              258. he_IL.UTF-8 UTF-8          382. raj_IN UTF-8
  11. am_ET UTF-8              135. en_DK ISO-8859-1               259. hi_IN UTF-8                383. ro_RO ISO-8859-2
  12. an_ES ISO-8859-15        136. en_DK.ISO-8859-15 ISO-8859-15  260. hif_FJ UTF-8               384. ro_RO.UTF-8 UTF-8
  13. an_ES.UTF-8 UTF-8        137. en_DK.UTF-8 UTF-8              261. hne_IN UTF-8               385. ru_RU ISO-8859-5
[More] 

(略)

(Enter the items you want to select, separated by spaces.)

Locales to be generated: 285 #これは現在の日本語 UTF-8の設定番号です。

2.タイムゾーン設定

*まずは地域選択で、6のアジアを選択し、
*タイムゾーン選択で 79のTokyoを選択する

root@XXXX :/# dpkg-reconfigure tzdata
------------------

Please select the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list of
cities, representing the time zones in which they are located.

  1. Africa   3. Antarctica  5. Arctic  7. Atlantic  9. Indian    11. SystemV  13. Etc
  2. America  4. Australia   6. Asia    8. Europe    10. Pacific  12. US
Geographic area: 6 #アジアを選択

Please select the city or region corresponding to your time zone.

  1. Aden      14. Beirut      27. Gaza         40. Karachi       53. Muscat        66. Riyadh         79. Tokyo
  2. Almaty    15. Bishkek     28. Harbin       41. Kashgar       54. Nicosia       67. Sakhalin       80. Tomsk
  3. Amman     16. Brunei      29. Hebron       42. Kathmandu     55. Novokuznetsk  68. Samarkand      81. Ujung_Pandang
  4. Anadyr    17. Chita       30. Ho_Chi_Minh  43. Khandyga      56. Novosibirsk   69. Seoul          82. Ulaanbaatar
  5. Aqtau     18. Choibalsan  31. Hong_Kong    44. Kolkata       57. Omsk          70. Shanghai       83. Urumqi
  6. Aqtobe    19. Chongqing   32. Hovd         45. Krasnoyarsk   58. Oral          71. Singapore      84. Ust-Nera
  7. Ashgabat  20. Colombo     33. Irkutsk      46. Kuala_Lumpur  59. Phnom_Penh    72. Srednekolymsk  85. Vientiane
  8. Atyrau    21. Damascus    34. Istanbul     47. Kuching       60. Pontianak     73. Taipei         86. Vladivostok
  9. Baghdad   22. Dhaka       35. Jakarta      48. Kuwait        61. Pyongyang     74. Tashkent       87. Yakutsk
  10. Bahrain  23. Dili        36. Jayapura     49. Macau         62. Qatar         75. Tbilisi        88. Yangon
  11. Baku     24. Dubai       37. Jerusalem    50. Magadan       63. Qostanay      76. Tehran         89. Yekaterinburg
  12. Bangkok  25. Dushanbe    38. Kabul        51. Makassar      64. Qyzylorda     77. Tel_Aviv       90. Yerevan
  13. Barnaul  26. Famagusta   39. Kamchatka    52. Manila        65. Rangoon       78. Thimphu

Time zone: 79 #Tokyoを選択

環境変数LANGへ設定をする
先ほどインストールしたvimで、.bashrcを編集し、
export...を追加する。

<vimでの編集方法>
vim ~/.bashrcで、vimが起動。
十字キーでファイルの一番下に移動して、「i」を押して入力モードへ
export〜を追記し、escを押してコマンドモードに戻る
「:wq」と入力して変更を保存する

root@XXXX :/# export LANG=ja_JP.UTF-8
root@XXXX :/# vim ~/.bashrc

もう一度 localeを見て見ると

root@XXXX :/# locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

変更されてる!

プラスで、.inputrcというファイルを作成し、内容を追加しましょう。

root@XXXX :/# vim ~/.inputrc
#以下の3行を.inputrcに追加する
set convert-meta off
set meta-flag on
set output-meta on

#適用
root@XXXX :/# source ~/.inputrc

以下のようにすると、mysql内の設定も変わっているかと思います。
以上です。

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

ECRへの手動push方法メモ

動機

CircleCIで設定されてたのでECRへの手動pushは必要なかったけど、
CircleCIがイカれてしまったので、手動pushすることにした。

ログイン認証

$ aws ecr get-login-password --region [リージョン] | docker login --username AWS --password-stdin [AWSアカウントID].dkr.ecr.[リージョン].amazonaws.com  

ビルド

docker build -t [ECRのリポジトリ名] .

イメージにタグ付け

docker tag [ECRのリポジトリ名]:latest [AWSアカウントID].dkr.ecr.[リージョン].amazonaws.com/[ECRのリポジトリ名]:latest

ECRへpush

docker push [AWSアカウントID].dkr.ecr.[リージョン].amazonaws.com/[ECRのリポジトリ名]:latest

ECSのタスク定義を更新する必要がある
新しいリビジョンの作成でリビジョンが1つ上がることだけ確認して、その他の設定はいじる必要なし

あとは古いタスクとかサービスとか消せば完成。

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

Docker Desktop for Mac で Kubernetesが起動しないとき

状況

以前までは起動していたんですが、ある日突然起動しなくなり、
ずっとKubernetes is starting...でスタックしてしまっている状況。
再起動しても状況は変わらず。
しかも、この状態でpreferenceも固まっていて、開くことができない。

環境: Docker Desktop for Mac

対処法

issueに上がっていた中で対処法がありました。
https://github.com/docker/for-mac/issues/2990#issuecomment-544754304

注意:Kubernetesのcontextとか諸々は消えます :crying_cat_face:

1. pkiと.kubeの中身を削除

以下のコマンドを叩き、該当のものを消します。

rm -rf ~/Library/Group\ Containers/group.com.docker/pki/
rm -rf ~/.kube

2. Reset Kubernetes cluster

Troubleshoot -> Reset Kubernetes cluster をクリック
スクリーンショット 2020-09-11 14.04.28.png

3. Restart

Docker Desktop for Macを再起動したら起動した。

補足

  • .kubeの方を消すのは嫌だったので、pkiだけ消してみてやってみたけどだめだった。。。
  • preferenceを開こうにも固まっていて開けない :anger:
    • Docker Desktop for Macを再起動すると十秒程度preferenceを動かせるタイミングがあるので、そこで気合で開く :innocent:

何か他にもっといい方法があるよって方はご教授いただけると嬉しいです。

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

GitHub ActionsのHadolint Actionを使って安全なDockerfileを運用する

GitHub Actions と hadolint を組み合わせて Dockerfile の静的解析を自動化しよう! - kakakakakku blog を読んで、自身のGHAにも組み込んでみた。

hadolint (Haskell Dockerfile Linter)

hadolintとは、DockerfileをDockerfile Best Practicesに沿って解析してくれるツールだそうな。

詳しくは本家へ↓↓

Created by https://ghlinkcard.com/

さっそくGHAに組み込む

めちゃくちゃ簡単!
以下の感じで brpaz/hadolint-action@master を使うだけでGitHub ActionsでDockerfileを解析してくれる!

.github/workflows/workflow.yml
name: Workflow
on: push
jobs:
  build:
    name: Hadolint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Hadolint
        uses: brpaz/hadolint-action@master

結果

GHAの実行結果として、 Dockerfile:23 DL3006 Always tag the version of an image explicitly と返ってきた。

その時のDockerfileが以下

./Dockerfile
    | ...
L23 | FROM gcr.io/distroless/base-debian10
    | ...

ベースイメージのタグを明示的に付けて〜的なやつの警告です。
対応としては、 base-debian10:latest とか base-debian10:v1.0.0 とかにするのだが、この distroless とやらは バージョンタグがなく latest かハッシュ値しか使えない。さらに、今回の対応で latest を指定しても、hadolintで別の警告( DL3007 Using latest is prone to errors if the image will ever update. Pin the version explicitly to a release tag )が出される。

警告(DL3006)における対応

hadolint公式にHow to useConfigureという項目があり、起動オプションやyamlファイルで設定できるよ〜と書いたあった

ただ、DL3006の警告をすべて無視するとDockerfileのマルチステージビルド時に別の箇所(今回で言うL23以外)で同様の警告が出た際も無視され、本来やりたかったベストプラクティスに沿った安全な運用ができなくなってしまう。

悩んでいると同僚にhadolintにはDockerfileに直接警告を無視するコメントを付与できる、Inline ignoresというのがあることを教えてもらった(感謝!

確かに公式を見てみるとちゃんと書いてあった(公式をちゃんと読もうと再認識した

よって、以下のように1行コメント(Inline ignores)を入れて、再度git pushすると無事にGHAが走りhadolintの警告がなくなった。

./Dockerfile
    | ...
L23 | # hadolint ignore=DL3006
L24 | FROM gcr.io/distroless/base-debian10
    | ...

まとめ

  • hadolintをGHAに簡単に組み込むことができた
  • ベストプラクティスに沿った安全なDockerfileを運用できた
  • Exh: 公式サイトはちゃんと読もう
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メモ:Exment on Lightsail + Docker(nginx)環境で、CORSするためのnginx.conf設定

先日、Lightsail + Dockerという組み合わせで、ExmentというOSS WebDBシステムを構築したという話を書きました。

んで、その後にもExmentとMFクラウド請求書をAPIで組み合わせる記事も書きました。

で、両者の記事で大事なことを書き忘れていたんですね。

ExmentのAPIが通らない

Postmanでは通るんだけど、Node.jsで通らない。なぜだ… そうか、CORSか…

ということで、Exmentを運用しているDocker-composeはこちらなのですが、Webサーバーはnginxで動いています。

というわけで、nginx用のCORS設定を追記しました。

nginx.conf
server {
    listen 8080;
    server_name _;

    root  /var/www/exment/public;
    index index.php index.html;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        if ($request_method = 'OPTIONS') {
            add_header Access-Control-Allow-Origin '*';
            add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE';
            add_header Access-Control-Allow-Headers 'Origin, Authorization, Accept, Content-Type';
            add_header Access-Control-Max-Age 3600;

            add_header Content-Type 'text/plain charset=UTF-8';
            add_header Content-Length 0;

            return 204;
         }

        try_files $uri /index.php?$query_string;
    }

    location ~ \.php$ {
        add_header Access-Control-Allow-Origin '*' always;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

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

HerokuでDocker環境Rails MySQLなものを動かす。deviseかつtwitter APIを隠しながら

人に見せる用に書いていません。

自作記事のお父上、Rails+MySQL+Nginx+Unicorn+Docker+CircieCIな開発環境を作りたいえ〜の記事の続き。

上で作った環境に[Rails] deviseの使い方(rails5版)を追加し、かつTwitterAPIをgem 'dotenv-rails'で隠しながら、本番環境のherokuにアップロードした。

①docker-compose.ymlのコマンドを変更する

docker-compose.yml
command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"

② gem 'dotenv-rails'を導入する

目的:TwitterAPIキーをGitHubのローカルに入れたくない

envファイルはGitの管理に入れたくないので、.gitignoreファイルに以下を追記しておきましょう。

.gitignore.envを追加する。

これで.envはGitの管理下から外れます。

https://pikawaka.com/rails/dotenv-rails
http://vdeep.net/rubyonrails-dotenv

③ APIキーをdotenv-railsの.envで隠しながら導入する

[Rails] deviseの使い方(rails5版)の記事のtwitterAPIを追加する場所をENV[]に書き換える

config/initializer/devise.rb
config.omniauth :twitter, ENV['TWITTER_API_KEY'], ENV['DATABASE_URL']

④ Herokuの環境変数を変更する

多分、DATABASE_URLとTWIITER_API_KEY,DATABASE_URLはマスト。

herokuのGUIのSettingのConfig VarsHerokuアプリの環境変数設定(CUIで設定)で設定する

Herokuアプリの環境変数設定

  • ClearDBのURL確認
    以下のコマンドで、ClearDBのURLが確認できる。
$ heroku config
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
  • 環境変数の設定
    上記コマンドで表示されたそれぞれの値を変数に設定する。
$ heroku config:add DB_NAME='<データベース名>'
$ heroku config:add DB_USERNAME='<ユーザー名>'
$ heroku config:add DB_PASSWORD='<パスワード>'
$ heroku config:add DB_HOSTNAME='<ホスト名>'
$ heroku config:add DB_PORT='3306'
$ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'

※ RailsのGemfileで'mysql2'を使用しているので、DATABASE_URLmysql2://で始める必要がある。

設定内容を確認すると、以下のように表示される。

$ heroku config
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DATABASE_URL:         mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DB_HOSTNAME:          <ホスト名>
DB_NAME:              <データベース名>
DB_PASSWORD:          <パスワード>
DB_PORT:              3306
DB_USERNAME:          <ユーザー名>

Herokuへデプロイ

Railsプロジェクトに必要な準備

  • config/environments/production.rbに以下を追記
    (この辺りの設定に関しては、後々修正します。)
config.assets.compile = true
config.assets.initialize_on_precompile=false

これプラス、gem 'dotenv-rails'.envで作ったTwitterAPIをheroku側に設定する。

参考
https://qiita.com/ymstshinichiro/items/d6ea229f6eb4778006c2
https://golikyua.hatenablog.com/entry/2020/01/09/135254
https://www.sejuku.net/blog/tutorial/111347

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

rails チュートリアル

次回2.2.2から

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