LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-12

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

ubuntu 20.04.1 上でプロキシ環境でdockerを使うための設定スクリプト という記事を書きましたが、プロキシなし環境に切り替えることができるスクリプトを作成しました。

スクリプト

準備

  1. setup-docker.py という名前で保存します。
  2. 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

スクリプト本体

#!/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')
0
0
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
0
0