3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker 便利なコンテナを作成できるDockerfileを紹介させてください

Posted at

投稿目的

  • よりよい方法をご教授いただきたい

本題

きっかけ

個人開発やちょっとした検証を行う際、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
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というファイルにコピーされます。
コンテナ内の.bashrcgit-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

image.png

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?