ubuntu 20.04.1 上でプロキシ環境でdockerを使うための設定スクリプト

# ubuntu 20.04.1 上でプロキシ環境でdockerを使うための設定スクリプト

[ubuntu 20.04.1 上でプロキシ環境でdocker を利用する](https://qiita.com/m-tmatma/items/5718ac5294e6acc61908) の設定を一括でやるスクリプトを作成しました。

## 使い方

1. `docker-proxy.py` とかいう名前で保存します。
2. `chmod +x docker-proxy.py` で実行権限を付けます。
3. `sudo docker-proxy.py proxy-url` のようにして実行します。

ここで proxy-url には `http://192.168.11.61:3128` などの文字列を指定します。

## スクリプト本体

```
#!/usr/bin/python3

import string
import subprocess
import os
import sys

###########################################################################
#  template for /etc/apt/apt.conf
###########################################################################
template_apt_conf = """\
Acquire::http::Proxy "$proxy_url";
Acquire::https::Proxy "$proxy_url";
"""


###########################################################################
#  template for /etc/systemd/system/docker.service.d/override.conf
###########################################################################
template_docker_service_override = """\
[Service]
Environment="HTTP_PROXY=$proxy_url"
Environment="HTTPS_PROXY=$proxy_url"
Environment="NO_PROXY=localhost,127.0.0.1"
"""

###########################################################################
#  template for ~/.docker/config.json
###########################################################################
template_config_json = """\
{
  "proxies": {
    "default": {
      "httpProxy": "$proxy_url",
      "httpsProxy": "$proxy_url",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}
"""


###########################################################################
#  write proxy data to a file
###########################################################################
def write_proxy(file_name, input_template, proxy_url):
    context = {
        'proxy_url' : proxy_url
    }
    template = string.Template(input_template)
    data = template.substitute(context)

    with open(file_name, "w") as fout:
        fout.write(data)
    print("wrote: " + file_name)

###########################################################################
#  get the home directory of the original user
###########################################################################
def get_original_home():
    user = os.environ['SUDO_USER']
    if user:
        home_dir = os.path.expanduser('~' + user)
    else:
        home_dir = os.path.expanduser('~')
    return home_dir

###########################################################################
#  write etc/apt/apt.conf
###########################################################################
def write_apt_conf(proxy_url):
    write_proxy('/etc/apt/apt.conf', template_apt_conf, proxy_url)

###########################################################################
#  write /etc/systemd/system/docker.service.d/override.conf
###########################################################################
def write_docker_service_override(proxy_url):
    docker_service_d = '/etc/systemd/system/docker.service.d'
    if not os.path.isdir(docker_service_d):
        os.mkdir(docker_service_d)

    override_conf = os.path.join(docker_service_d, "override.conf")
    write_proxy(override_conf, template_docker_service_override, proxy_url)

###########################################################################
#  write ~/.docker/config.json
###########################################################################
def write_docker_config(proxy_url):
    # get the path of ~/.docker
    home_dir = get_original_home()
    docker_dir = os.path.join(home_dir, ".docker")

    # create ~/.docker
    if not os.path.isdir(docker_dir):
        os.mkdir(docker_dir)

    # get ~/.docker/config.json
    config_json = os.path.join(docker_dir, "config.json")
    write_proxy(config_json, template_config_json, proxy_url)

###########################################################################
#  usage
###########################################################################
def usage():
    print("usage: sudo docker-proxy.py proxy-url")
    print("example: sudo docker-proxy.py http://192.168.11.61:3128")
    
def exec(command):
    subprocess.call(command.split(), shell=False)
    print("ran: " + command)

if __name__ == '__main__':
    if len(sys.argv) != 2 or os.getuid() != 0:
        usage()
        sys.exit(1)

    proxy_url = sys.argv[1]

    exec('apt install -y docker.io docker-compose')

    write_apt_conf(proxy_url)
    write_docker_service_override(proxy_url)
    write_docker_config(proxy_url)

    exec('systemctl daemon-reload')
    exec('systemctl restart docker')
```

https://gist.github.com/m-tmatma/4f5d3e8233c1040fa453d5857326fd4c

## 処理内容

1.
docker をインストールする。

```
apt install -y docker.io docker-compose
```

2.
以下ファイルにプロキシ設定を書き込みます。(必要に応じてフォルダも作成します。)

* `/etc/apt/apt.conf`
* `/etc/systemd/system/docker.service.d/override.conf`
* `~/.docker/config.json`

3.
以下コマンドを実行して docker デーモンの設定ファイルを反映します。

* `systemctl daemon-reload`
* `systemctl restart docker`