0x01 前言

我计划将家里的所有服务都通过 Docker 实现,阿里云的 DDNS 服务也在该计划中。今天终于有时间花一点点时间改造之前编写的 Python 脚本,使其适配在容器内运行的要求。

与此同时,还有一个必不可少的 Dockerfile,如果不想自己 build,你还可以在本文底部找到 Docker Hub 的链接,通过 Docker run 命令使用。

0x02 脚本

实现 DNS IP地址更新的核心只有一个 Python 脚本,你可以从以下地址找到该脚本及其 Dockerfile:

你还可以从以下地址找到单机运行的旧脚本及配置文件模板:

如果你有留意我的博客,那你应该知道我有以下与 DDNS 相关的文章:

为了适配 Docker,我将日志的部分移除,日志通过标准输出至 Docker,但我计划增加一个变量,让用户控制是否需要将日志保存至一个文件中。因为时间的关系,目前只支持单域名,与单机版脚本的多域名有所区别。

除了日志模块的移除,我还移除读取日志文件的部分,以传参的形式传递必要的内容:

parser = argparse.ArgumentParser(description="aliyun ddns via NGX.HK")
parser.add_argument('--domain', type=str, default=None, required=True)
parser.add_argument('--subdomain', type=str, default=None, required=True)
parser.add_argument('--ttl', type=int, default=600)
parser.add_argument('--ver', type=int, default=4)
parser.add_argument('--id', type=str, default=None, required=True)
parser.add_argument('--sk', type=str, default=None, required=True)
parser.add_argument('--time', type=int, default=60)
  • –domain:域名,必填
  • –subdomain:子域名,必填
  • –ttl:免费用户最低为600秒,免费用户低于此值时,阿里会回传错误,可选
  • –ver:网际协议本版,默认为 IPv4,可选
  • –id:阿里云 API KeyID,必填
  • –sk:阿里云 API Secret Key,必填
  • –time:轮询时间,默认为60秒,可选

主要逻辑与之前的没任何变化,而 Dockerfile 也极其简单:

FROM python:3.6.9-alpine3.9

LABEL maintainer "[email protected]"

RUN pip install aliyun-python-sdk-core-v3 aliyun-python-sdk-alidns requests

ADD ./aliyun_ddns.py ./

ENTRYPOINT ["python", "aliyun_ddns.py"]

当然,你还可以通过以下地址找到最新的 Docker 镜像:

0x03 使用

首先,请参照上面的文章链接,取得自己的域名、子域名、阿里云 API KeyID与Secret Key,然后通过以下命令运行即可:

docker run -itd \
 --name [container name] \
 ngxproj/aliyun_ddns:[tag name] \
 --domain=ngx.hk \
 --subdomain=ddns \
 --id=xxxx \
 --sk=xxxx

例如:

docker run -itd \
 --name ali-ddns \
 ngxproj/aliyun_ddns:v1.1 \
 --domain=ngx.hk \
 --subdomain=ddns \
 --id=xxxx \
 --sk=xxxx

结果如下:

查看日志:

使用 Rancher 运行也极其方便,只需要在 CMD 对话框中填入参数即可:

成功运行后即可进入相关页面检查状态:

还可以检查日志:

0x04 结语

如果需要使用 IPv6,请确认你的容器支持并已经拥有 IPv6,如果发现报错,请保存日志并与我取得联系。近期会更新一些小功能,请关注我的博客或 Gitlab,如果有其他需求,也欢迎与我联系。

0x05 其他