Skip to content

Instantly share code, notes, and snippets.

@tmorioka
Last active March 18, 2025 03:19
Show Gist options
  • Save tmorioka/7e0e2a1e91b8a237bcaac130bc5f4379 to your computer and use it in GitHub Desktop.
Save tmorioka/7e0e2a1e91b8a237bcaac130bc5f4379 to your computer and use it in GitHub Desktop.
Dockerビルド時に, GitHubのPersonal access tokenを使ってプライベートリポジトリをクローンする

概要

Dockerビルド時にプライベートリポジトリをクローンする方法は色々考えられる.

  1. 秘密鍵を ADD してリポジトリをクローン, 終えたら削除(ssh経由)
  2. --build-arg で秘密鍵情報を渡してリポジトリをクローン, 終えたら削除(ssh経由)
  3. --build-arg でユーザ名, パスワードを渡してリポジトリをクローン(https経由)
  4. ユーザ名, パスワードを記した ~/.netrcADD してリポジトリをクローン, 終えたら削除(https経由)

上記で挙げた方法のなかには, セキュリティの点から好ましくないものもある.
ここでは, GitHubのPersonal access tokenを使って
Dockerビルド時にプライベートリポジトリをクローンする方法(https経由)について説明する.

HowTo

GitHubのPersonal access token

GitHubのプライベートリポジトリにアクセスする手段は2つである.

  1. ssh経由でアクセス
  2. https経由でアクセス

後者のhttps経由では, ユーザ名とパスワードの入力を求められるが,
パスワードの代わりに Personal access token を使うことができる.
このトークンを発行するときに, リポジトリのRead権限などを事細かに選択することができる.

Personal access tokenの申請方法

  1. Settings > Developer settings を開く
  2. 左のメニューから Personal access tokens を選択
  3. Generate new token でトークンを発行

Personal access tokenを使って, Dockerビルド時にプライベートリポジトリをクローン

flaskで簡単なアプリケーションサーバを作り, uwsgi+NGINXでデプロイする例を考える.
リポジトリ(simpleapp)構成は下記のものを想定する.

[simpleapp]
  |- Dockerfile
  |- docker-compose.yml
  |- server.conf
  |- server.py
  +- uwsgi.ini

この例では, DockerfileのARGにて github_usernamegithub_password を指定するようになっている.
docker-composeを使用する場合は, 設定ファイルの所定の場所に, ユーザ名と上の手順で発行したPersonal access tokenを指定する.
docker-composeを使用しない場合は, --build-arg でユーザ名とPersonal access tokenを指定する.

$ docker build --build-arg github_username=USERNAME --build-arg github_password=PERSONAL_ACCESS_TOKEN simpleapp ./

利点

  • 秘密鍵を作る場合どうしても適当なファイルを作る必要があるが, https経由であればuriでユーザ名とパスワードを指定できるので安心(?)
  • パスワードは漏れたらアカウントが乗っ取られるが, Personal access tokenは発行時に権限を設定できるので, 設定した範囲までしか情報が漏れない(?)
  • 再発行・削除が簡単にできる

欠点

  • GitHubじゃないと使えない

まとめ・感想

Dockerビルド時にプライベートリポジトリをクローンする方法として, GitHubのPersonal access tokenを使用した方法を紹介した.
鍵情報を ADD する, 平文のパスワードを保存するよりかは安全なような気がしている.
GitHubリポジトリではこうしたやり方が通用するが, bitbucketや他のホスティングでも同じようなやり方があるかは不明である...

関連情報

version: "3"
services:
nginx:
image: nginx:latest
ports:
- "8080:8080"
volumes:
- ./server.conf:/etc/nginx/conf.d/server.conf
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
my_server:
tty: true
volumes:
- ./uwsgi.ini:/PATH/TO/APP/SERVER/uwsgi.ini
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
build:
context: ./
dockerfile: ./Dockerfile
args:
github_username: "USERNAME"
github_password: "PERSONAL_ACCESS_TOKEN"
FROM debian:jessie
ARG github_username
ARG github_password
RUN apt update
RUN apt install -y locales
RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_CTYPE ja_JP.UTF-8
RUN localedef -f UTF-8 -i ja_JP ja_JP.utf8
RUN mkdir -p /etc/sysconfig
RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock
RUN rm -f /etc/localtime
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN apt install -y python3
RUN apt install -y python3-pip
RUN pip3 install -U pip
RUN pip3 install flask
RUN pip3 install uwsgi
RUN apt install -y git
RUN mkdir -p /opt
RUN cd /opt && git clone https://${github_username}:${github_password}@github.com/USERNAME/simpleapp.git
ENTRYPOINT [ "uwsgi", "/opt/simpleapp/uwsgi.ini" ]
server {
listen 8080;
server_name localhost;
charset utf-8;
client_max_body_size 75M;
access_log /var/log/nginx/server.log;
location / {
try_files $uri @server_app;
}
location @server_app {
include uwsgi_params;
uwsgi_pass my_server:5000;
}
}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
f = random.random() < 0.5
return "一生世界に挨拶してろ" if f else "Hello, world!!!"
if __name__ == '__main__':
app.run()
[uwsgi]
socket = 0.0.0.0:5000
pidfile = /tmp/server.pid
chdir = /PATH/TO/APP/SERVER
module = server
callable = app
process = 1
threads = 1
log-x-forwarded-for = true
log-format = %(addr) - %(user) [%(ltime)] &quot;%(method) %(uri) %(proto)&quot; %(status) %(size)<code></code> &quot;%(referer)&quot; &quot;%(uagent)&quot;
logto = /tmp/server.log
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment