Help us understand the problem. What is going on with this article?

サーバー上のDockerのbuild時にGithubのprivateレポジトリからpip installする方法

内容

  • ssh-agentを使ってサーバー上でGithubにssh接続する
  • DockerのBuild-time secretsssh-keyscanを使ってbuild時にGithubにssh接続する

具体例としてDockerのbuild中にプライベートレポジトリにあるパッケージを pip install する。(※ このpip installの具体例だけではなくprivateレポジトリとのやり取りを行う処理の全般に使える。)

環境は以下の通り。(ただし、Macであれば他は問題にならないはず)

  • Mac OS (10.14)
  • サーバー: Ubuntu 16.04
  • Docker 18.09 or higher (必須)

ssh-agentを使ってサーバー上でGithubにアクセス

普段手元のPCで使っている秘密鍵をサーバー上でも使えるようにする。

まずは秘密鍵を登録する。以下のコマンドで登録されているかどうかを確認できる。まだ何も登録していないので何も登録されていない。

$ ssh-add -l
The agent has no identities.

ここで秘密鍵の登録を行う。サーバー上でGithubとのやり取りを行いたいのでGithubに接続できる秘密鍵を選択する。Githubにsshアクセスできない方はGitHubでssh接続する手順~公開鍵・秘密鍵の生成から~でまずは登録を行う。

$ ssh-add ~/.ssh/id_rsa

これで登録ができるので、以下のように登録されていることが確認できる。

$ ssh-add -l
2048 xxx xxx/.ssh/id_rsa (RSA)

以上で秘密鍵が登録できたので、普段のssh接続のときに-Aのオプションをつけてアクセスする。

$ ssh -A xxx

サーバー上で以下のように打って、接続が確認できたら完了。

$ ssh -T git@github.com
Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.

Docker build上でprivateレポジトリからpip install

Dockerfile サンプル

# syntax=docker/dockerfile:1.0.0-experimental

FROM ubuntu:16.04
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    build-essential \
    curl \
    git \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libssl-dev \
    libcairo2-dev \
    libgirepository1.0-dev \
    make \
    openssh-client \
    python-dev \
    python-pip \
    vim \
    wget \
    zip \
    zlib1g-dev && \
    rm -rf /var/lib/apt/lists/*

ENV HOME /root

RUN git clone git://github.com/yyuu/pyenv.git $HOME/.pyenv
RUN git clone https://github.com/yyuu/pyenv-virtualenv.git $HOME/.pyenv/plugins/pyenv-virtualenv

ENV PYTHON_VERSION 3.6.8
ENV PYTHON_ROOT $HOME/local/python-$PYTHON_VERSION
ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH

RUN pyenv install 3.6.8
RUN pyenv global 3.6.8

RUN mkdir -m 700 $HOME/.ssh
RUN ssh-keyscan github.com > $HOME/.ssh/known_hosts
RUN --mount=type=ssh pip install git+ssh://git@github.com/xxx/xxx.git@vx.x.x

これを以下のようにbuildする。

$ export DOCKER_BUILDKIT=1
$ docker build -t xxx --ssh default .

Build-time secrets

docker buildを行うときにsecretsを使えるようになる機能。 Docker 18.09以降のバージョンが必要。以下のようにDockerfileの先頭に# syntaxの記述をすることと、対象となる行に--mount=type=sshをつけることでssh接続が実現できる。

# syntax=docker/dockerfile:1.0.0-experimental

RUN --mount=type=ssh xxx

また、実行時には以下のようにする。

$ export DOCKER_BUILDKIT=1
$ docker build -t xxx --ssh default .

ssh-keyscan

上記の処理だけだと接続時に以下のようなエラーが出てしまう。これはknown_hostsがうまく設定されていないからである。

Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.

ssh-keyscanを使って以下のようにknown_hostsを設定してあげることでエラーは解消される。

RUN mkdir -m 700 $HOME/.ssh
RUN ssh-keyscan github.com > $HOME/.ssh/known_hosts

ssh-keyscanを使うためにはopenssh-clientapt-getで入れておいてあげる必要があることに注意。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away