投稿目的
- よりよい方法をご教授いただきたい
本題
きっかけ
個人開発やちょっとした検証を行う際、WSL上に環境を作成するのではなく、Dockerのコンテナを作成し、その中に環境を作成しています。
これまでは、作成したコンテナ内の環境とGitリポジトリを紐づける際に、「ssh-keygen
コマンドをコンテナ内で実行」 → 「GitHubにSSH鍵を登録」という流れを踏んでいました。
このため、コンテナが増えるにつれてGitHubのSSH鍵の数が肥大化してきていました。 (数えたら15個ありました...多い...)
この状況を解決するため、WSL上に存在するSSH鍵を、そのまま新しく作成するコンテナでも用いることができるようなDockerfileを作成し、このDockerfileをもとにコンテナを作成するように改めました。
Dockerfileの作成
今回Dockerfileを作成するディレクトリは以下の通りとします。
# ホームディレクトリの下の「dockerfiles」ディレクトリ
$ pwd
~/dockerfiles
# Dockerfileを作成する
$ vi Dockerfile
Dockerfileの中身は以下の通りです。
FROM ubuntu:latest
# 必要なパッケージ類のインストール(ご自身が必要と思うものを追加してください)
RUN apt-get upgrade && apt-get update && apt-get install -y \
sudo\
wget\
git\
curl\
tree\
ssh\
net-tools\
docker.io\
docker-compose-v2\
python3-setuptools
# ユーザを追加し、sudoをパスワードなしで有効化する
ARG USERNAME=<あなたのユーザ名>
ARG GROUPNAME=<あなたのグループ名>
ARG UID=<あなたのユーザID>
ARG GID=<あなたのグループID>
ARG PASSWORD=<あなたのパスワード>
RUN groupadd -g $GID $GROUPNAME && \
useradd -m -s /bin/bash -u $UID -g $GID -G sudo $USERNAME && \
echo $USERNAME:$PASSWORD | chpasswd && \
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER $USERNAME
WORKDIR /home/$USERNAME/
# Gitのタブ補完を有効化するためのスクリプトを取得
RUN wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -O ~/.git-completion.bash
RUN wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -O ~/.git-prompt.sh
# このDockerfileが存在するディレクトリにgit-prompt-sample.txtを作成し、.bashrcに記載したい内容を書いておく
COPY git-prompt-sample.txt /home/$USERNAME/git-prompt-sample
RUN cat git-prompt-sample >> .bashrc
# SSH鍵のコピー
COPY <秘密鍵のファイル名> /home/$USERNAME/.ssh/<秘密鍵のファイル名>
COPY <公開鍵のファイル名> /home/$USERNAME/.ssh/<公開鍵のファイル名>
ポイントは以下です。
sudoを有効化
Spritaro 様 「Dockerコンテナに一般ユーザーを追加するときのDockerfileの設定」
コンテナ作成後にtree
コマンドやnetstat
コマンドをインストールしたいのに「sudo
が使えないからapt-get install tree net-tools
ができない...」ということがあったため、sudo
を有効化しています。
# 必要なパッケージ類のインストール(ご自身が必要と思うものを追加してください)
RUN apt-get upgrade && apt-get update && apt-get install -y \
sudo\
...
# ユーザを追加し、sudoをパスワードなしで有効化する
ARG USERNAME=<あなたのユーザ名>
ARG GROUPNAME=<あなたのグループ名>
ARG UID=<あなたのユーザID>
ARG GID=<あなたのグループID>
ARG PASSWORD=<あなたのパスワード>
RUN groupadd -g $GID $GROUPNAME && \
useradd -m -s /bin/bash -u $UID -g $GID -G sudo $USERNAME && \
echo $USERNAME:$PASSWORD | chpasswd && \
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER $USERNAME
WORKDIR /home/$USERNAME/
Gitのタブ補完を有効化・プロンプトにブランチを表示
shun 様 「Gitコマンドの補完とGit情報のプロンプト表示」
caad1229 様 「プロンプトをカスタマイズしてgitブランチを表示する」
Gitのコマンドを使う際、いちいち --force-with-lease
などを打つのは手間なので、タブ補完を有効化しておきます。(aliasを設定しても良いですが)
また、いちいちgit status
を実行して現在のブランチを確認しなくてもよいように、ターミナルのプロンプトに現在のブランチを表示させます。
まずは、WSL上でgit-prompt-sample.txt
ファイルを作成しておきます。
$ pwd
~/dockerfiles
$ vi git-prompt-sample.txt
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ [\1]/'
}
function promps {
# 色は気分で変えたいかもしれないので変数宣言しておく
local BLUE="\[\e[1;34m\]"
local RED="\[\e[1;31m\]"
local GREEN="\[\e[1;32m\]"
local WHITE="\[\e[00m\]"
local GRAY="\[\e[1;37m\]"
case $TERM in
xterm*) TITLEBAR='\[\e]0;\W\007\]';;
*) TITLEBAR="";;
esac
local BASE="\u@\h"
PS1="${TITLEBAR}${GREEN}${BASE}${WHITE}:${BLUE}\w${GREEN}\$(parse_git_branch)${BLUE}\$${WHITE} "
}
promps
source /usr/share/bash-completion/completions/git
COPY git-prompt-sample.txt /home/$USERNAME/git-prompt-sample
のところで、WSL上の~/dockerfiles/git-prompt-sample.txt
がコンテナ内の~/git-prompt-sample
というファイルにコピーされます。
コンテナ内の.bashrc
にgit-prompt-sample
の内容を追記することで、Gitコマンドのタブ補完とプロンプトへのブランチ表示ができます。
# Gitのタブ補完を有効化するためのスクリプトを取得
RUN wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -O ~/.git-completion.bash
RUN wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -O ~/.git-prompt.sh
# このDockerfileが存在するディレクトリにgit-prompt-sample.txtを作成し、.bashrcに記載したい内容を書いておく
COPY git-prompt-sample.txt /home/$USERNAME/git-prompt-sample
RUN cat git-prompt-sample >> .bashrc
SSH鍵をコンテナにコピー
WSL上で、公開鍵・秘密鍵のファイルをDockerfileがあるディレクトリにコピーしておきます。
$ pwd
~/dockerfiles
# 既存のSSH鍵をコピ-
$ cp ~/.ssh/<秘密鍵のファイル名> <秘密鍵のファイル名>
$ cp ~/.ssh/<公開鍵のファイル名> <公開鍵のファイル名>
Dockerfileを実行する際、WSL上(~/dockerfiles/
ディレクトリ配下)のSSH鍵のファイルが、コンテナ内の~/.ssh
ディレクトリ配下にコピーされます。
# SSH鍵のコピー
COPY <秘密鍵のファイル名> /home/$USERNAME/.ssh/<秘密鍵のファイル名>
COPY <公開鍵のファイル名> /home/$USERNAME/.ssh/<公開鍵のファイル名>
Docker image / Docker containerの作成
~/dockerfiles/Dockerfile
が完成したら、下記を実行します。
コンテナ作成時の-v
オプションについては、下記記事をご覧ください。
mk3kohei 様 「【初心者】Dockerコンテナ内でDockerコマンドを使いたい!」
$ pwd
~/dockerfiles
# Docker imageを作成
$ docker image build -t <Docker imageの名前> .
# Docker containerを作成
$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock --name <Docker containerの名前> <Docker imageの名前>
上記を実行すると、ターミナルがコンテナ内で開かれている状態になります。
このまま、すぐにGitHubからリポジトリをcloneすることができます。
$ pwd
~
$ git clone <リポジトリのURL(SSH)>
Receiving objects: 100% (687/687), 686.19 KiB | 1.00 MiB/s, done.
Resolving deltas: 100% (335/335), done.
まとめ
いかがだったでしょうか。
「便利ではあるけどSSHとか面倒だな...」と感じていたDockerですが、今回の方法でさらに簡単に環境が構築できるようになりました。
とはいえ、セキュリティ面などでの心配もあります... (SSH鍵ってそもそも使いまわしていいんだっけ? etc..)
また、Docker imageを作成する際、下記のようなwarningが発生します。
これも解決したいですね。
1 warning found (use docker --debug to expand):
- SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ARG "PASSWORD") (line 19)
参考記事もぜひご確認ください。
よりよい方法がありましたら、コメントなどでご教示いただけますと幸いです m(_ _)m