ubuntu 20.04.1 上でdockerを使うための設定スクリプト (プロキシ切り替え対応)

# ubuntu 20.04.1 上でdockerを使うための設定スクリプト (プロキシ切り替え対応)

[ubuntu 20.04.1 上でプロキシ環境でdockerを使うための設定スクリプト](https://qiita.com/m-tmatma/items/edf0466027af1096c8d9) という記事を書きましたが、プロキシなし環境に切り替えることができるスクリプトを作成しました。

## スクリプト

https://gist.github.com/m-tmatma/7556d81a850a8145ded7074578722334

## 準備

1. `setup-docker.py` という名前で保存します。
1. `chmod +x setup-docker.py` で実行権限を付けます。

## 使い方

### ヘルプ

```
$ ./setup-docker.py 
usage:
sudo ./setup-docker.py set http://proxy:port
sudo ./setup-docker.py noproxy
```

### 指定したプロキシを設定する

`http://192.168.11.61:3128` に設定する場合

```
sudo ./docker-proxy.py http://192.168.11.61:3128
```

### プロキシなしでアクセスする場合

```
sudo ./docker-proxy.py noproxy
```

### 一般ユーザーで sudo なしで　docker を使用したい場合

```
sudo usermod -a -G docker $USER
sudo reboot
```

## スクリプト本体

https://gist.github.com/m-tmatma/7556d81a850a8145ded7074578722334

```
#!/usr/bin/python3

import string
import subprocess
import os
import sys

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


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

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


###########################################################################
#  write proxy data to a file
###########################################################################
def write_proxy(file_name, input_template, http_proxy_url, https_proxy_url):
    if http_proxy_url or https_proxy_url:
        context = {
            'http_proxy_url' : http_proxy_url,
            'https_proxy_url' : https_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)
    else:
        if os.path.exists(file_name):
            os.unlink(file_name)
        print("removed: " + 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(http_proxy_url, https_proxy_url):
    write_proxy('/etc/apt/apt.conf', template_apt_conf, http_proxy_url, https_proxy_url)

###########################################################################
#  write /etc/systemd/system/docker.service.d/override.conf
###########################################################################
def write_docker_service_override(http_proxy_url, https_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, http_proxy_url, https_proxy_url)

###########################################################################
#  write ~/.docker/config.json
###########################################################################
def write_docker_config(http_proxy_url, https_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, http_proxy_url, https_proxy_url)

###########################################################################
#  usage
###########################################################################
def usage():
    script = sys.argv[0]
    print("usage:")
    print("sudo " + script + " set http://proxy:port")
    print("sudo " + script + " noproxy")

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)

    http_proxy_url = None
    https_proxy_url = None
    cmd = sys.argv[1]
    if cmd == "set":
        if len(sys.argv) == 3:
            http_proxy_url = sys.argv[2]
            https_proxy_url = sys.argv[2]
        else:
            usage()
            sys.exit(1)
    elif cmd == "noproxy":
        pass
    else:
        usage()
        sys.exit(1)

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

    write_apt_conf(http_proxy_url, https_proxy_url)
    write_docker_service_override(http_proxy_url, https_proxy_url)
    write_docker_config(http_proxy_url, https_proxy_url)

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