New Rice Growth

新米SESエンジニア日々の成長日記

alpineのユーザ作成が曲者だった

alpineのユーザ作成がうまく行かなかった

alpine環境のnodeのdocker imageを元にDockerfileを書いていて、dockerfileにlinuxユーザを作成する命令を書いてdocker-compose buildしたとき

Building app
Step 1/7 : FROM node:12.12.0-alpine
 ---> 0fcfd7e52b09
Step 2/7 : WORKDIR /usr/src/app
 ---> Running in 1f7f40cfe516


<<<< 中略 >>>>


/bin/sh: useradd: not found
ERROR: Service 'app' failed to build : The command '/bin/sh -c useradd -m --uid ${DOCKER_UID} --groups sudo ${DOCKER_USER}   && echo ${DOCKER_USER}:${DOCKER_PASSWORD} | chpasswd' returned a non-zero code: 127

useraddコマンドがないよとのこと

結論

adduserコマンドを使いましょう
オプションの使い方も違うので注意

adduser

Usage: adduser [OPTIONS] USER [GROUP]

Create new user, or add USER to GROUP

    -h DIR      Home directory
    -g GECOS    GECOS field
    -s SHELL    Login shell
    -G GRP      Group
    -S      Create a system user
    -D      Don't assign a password
    -H      Don't create home directory
    -u UID      User id
    -k SKEL     Skeleton directory (/etc/skel)

Githubの二要素認証を設定したらgit pushがエラーになるのでSSH接続設定する

二要素認証とは

異なる2つの要素で認証を行うことによってセキュリティの強化を図る手法のこと
「認証の三要素」と言われる下記の3つの要素から2つの要素を組み合わせる - 認証の三要素 - 知識(本人が知っていること:暗証番号、パスワード) - 所有(本人が持っているもの:キャッシュカード、スマホ) - 生態(本人の特徴:指紋、顔、静脈)

二要素認証の設定を行うことで、パスワードが盗まれてもアカウントの不正利用を防止することができる

Gitの二要素認証の設定自体はめちゃ簡単にできる

Gitの接続方式をSSHに変更する必要がある

Gitの二要素認証設定を行うと、git pushができなくなる事象が発生する
こんな感じ

$ git push
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

デフォルトではhttpsを用いた接続でリポジトリとのやりとりを行うような設定になっているが、この接続方式をSSHに変更することで正常にgit pushすることができる

SSH接続できるようにする(本題)

本題はlinux環境で行っています。

SSH認証の公開鍵と秘密鍵を作成する

ssh-keygenコマンドで鍵を生成する
メールアドレスはGitHubのメールアドレスを指定するのが一般的

$ cd ~/.ssh
$ ssh-keygen -t ed25519 -C test@hoge.com //自分のメールアドレス
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519.
Your public key has been saved in /root/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:A8NkbBxnD63KEoupkrsdAQ8fErexXRaIC2jKpmQ7Xhg test@hoge.com
The key's randomart image is:
+--[ED25519 256]--+
|o o. +Bo+.       |
|o+.=.*+o o.      |
|B.+...+  ..      |
|.E...  o.        |
|= Bo + .S        |
|.+ooo o  .       |
|.o+  .           |
|+o .             |
|+o.              |
+----[SHA256]-----+

オプション
-t : 作成する鍵の暗号化方式を「rsa」「dsa」「ecdsa」「ed25519」から指定する
-C : コメントを指定する(デフォルトは「ユーザ名@ホスト名」)

このコマンドを打つとデフォルトのファイル場所をどこにするか、とパスフレーズを聞かれるの任意入力する

これによって鍵ができる
id_ed25519 : 秘密鍵
id_ed25519.pub : 公開鍵

クライアントへのSSHキーの設定

キーを管理するために新しいSSHキーをssh-agentに追加する

$ eval "$(ssh-agent -s)"
Agent pid 23

SSHプライベートキーをssh-agentに追加する

$ ssh-add ~/.ssh/id_ed25519

リモートURLをHTTPSからSSHへ切り替える

ワーキングディレクトリをローカルプロジェクトに変更し、 変更したいリモートの名前を取得するため既存のリモート一覧を表示する

$ cd your_local_project
$ git remote -v
origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
origin  https://github.com/USERNAME/REPOSITORY.git (push)

git remote set-urlコマンドでリモートの URL を HTTPS から SSH に変更する
USERNAMEとREPOSITORYは自分の環境によって書き換える

$ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git

変更できたか確認する

$ git remote -v
origin  git@github.com:USERNAME/REPOSITORY.git (fetch)
origin  git@github.com:USERNAME/REPOSITORY.git (push)

GitHubへの公開鍵の登録

ssh公開鍵をクリップボードにコピーする

$ sudo apt-get install xclip
$ xclip -selection clipboard < ~/.ssh/id_ed25519.pub

※うまくコピーできてない時はエディタで~/.ssh/id_ed25519.pubを開いて中身をコピーする

下記の1〜6はGitHubサイト上で行う

  1. GitHubの任意のページでプロフィール画像をクリックし、Settings(設定)をクリック
  2. ユーザ設定サイドバーでSSH and GPG keys(SSHおよびGPGキー)をクリック
  3. New SSH key, Add SSH keyをクリック
  4. titleに新しいキーを説明するラベルを追加
  5. キーをKeyフィールドに貼り付ける
  6. Add SSH keyをクリック

SSH接続テスト

$ ssh -T git@github.com
Warning: Permanently added the RSA host key for IP address '52.69.186.44' to the list of known hosts.
Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.

You've seccessfully authenticatedをみるにいけたっぽい

git pushしてみる

$ git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 283 bytes | 94.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:USERNAME/REPOSITORY.git
 * [new branch]      master -> master

無事git push完了

DockerでGolangコンテナ立てて入門する

前提条件

  • dockerがインストールされている

docker imageを持ってくる

このコマンドでdockerhubから最新のgolang docker imageを落とすことができる

$ docker pull golang

落としてきたdocker imageを確認する

$ docker images
REPOSITORY              TAG       IMAGE ID       CREATED         SIZE
golang                  latest    861b1afd1d13   7 weeks ago     862MB

コンテナを起動する

落としてきたimageのコンテナを起動する

$ docker run -d -ti --name my_golang golang

最後のgolangはIMAGE IDでもおっけい
今回やと861b1afd1d13

オプション
-d : コンテナをバックグラウンドで実行するよ
-t (tty) : ホスト側のコンソールの標準出力とコンテナの標準出力をつなげる
-i (interactive) : ホスト側の入力をコンテナの標準出力をつなげる
--name : コンテナの名前を決める

コンテナが立ち上がったかどうか確認する

$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS        PORTS                               NAMES
455c14a23d88   golang                  "bash"                   2 seconds ago   Up 1 second                                       my-golang

これでmy-golangという名前のgolangコンテナができた

いざ、立ち上げたコンテナに入る

$ docker exec -ti golang bash
root@7272531ef7bd:/go#

実行環境構築完了

これだけで新しい言語に挑戦できるdocker素敵☆

ついでにHello Goする

エディタ入れる

viもvimも入っていなかったのでvimをinstallする
vscodeのremote containerを使う選択肢もありではあるが、今回はvimを使うことにする

ディストリビューションの確認

まずはlinuxディストリビューションを確認

$ cat /etc/*release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Debianなのでパッケージ管理はapt

apt-getをアップデート

$ apt-get update
Get:1 http://deb.debian.org/debian buster InRelease [121 kB]
Get:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:4 http://security.debian.org/debian-security buster/updates/main amd64 Packages [271 kB]
Get:5 http://deb.debian.org/debian buster/main amd64 Packages [7907 kB]
Get:6 http://deb.debian.org/debian buster-updates/main amd64 Packages [9504 B]
Fetched 8426 kB in 4s (2232 kB/s)
Reading package lists... Done

vimをinstallする

$ apt-get -y install vim

vimを起動して見て確認

$ vim

:qvim終了

goを書いてみる

$ mkdir myapp
$ cd myapp
$ vim hello_world.go
package main

import "fmt"

func main() {
    fmt.Println("Hello Go")
}

goファイルを実行する

golangコンパイル言語ですがgo runコマンドでコンパイルと実行を一緒にやってくれる

$ go run hello_world.go
Hello Go

いつもCentOSのISOファイル何を選ぶか迷うので用語をまとめてみた

ISOファイルとは

CD,DVDの中身をひとつにまとめたアーカイブファイルのこと 今回の場合だとCentOSの中身がひとつにまとまったファイル

CPUアーキテクチャの種類

OSを動かすにはCPUが必要です。
そのためCPUアーキテクチャによってISOファイルの中身も変わってきます。

x86_64

インテルの64ビットマイクロプロセッサのアーキテクチャの名称

x86が32ビット、x64が64ビット

x86_64は、x86(32ビット)が64ビットに拡張されたもの

32ビットなのに、x86である理由はインテルの型番から取られたかららしい

ARM64

イギリスのケンブリッジに本社を置くARMという会社により開発されたアーキテクチャの名称

AndroidiPhone,Rasberrypyに使われている

IBM Power

IBMのマイクロプロセッサ

IBMなどのスーパーコンピュータ、UNIXワークステーション、オフィスコンピュータなどで使用されている。

ディスクイメージの違い

DVD ISO

CentOSGUIインストーラでインストールできる全パッケージが最初から含まれているディスクイメージ

多くの場合このイメージが使われる

Everything ISO

CentOSで利用できる全パッケージが最初から含まれているディスクイメージ

このイメージを使用すればネット接続していなくても任意のパッケージをインストールできる

その代わりサイズが大きいので基本的にUSBなどにダウンロードする

Minimal ISO

必要最低限のパッケージだけが含まれているディスクイメージ

後にyum | dnf install 〇〇 する人用