本帖最后由 neroxps 于 2018-1-3 14:28 编辑
前言
------
本文只是抛砖引玉,更多折腾方法建议看看 https://github.com/home-assistant/hassio-build 的代码,自己 Fork 一份属于自己的 hassio喔。期待有人推出中国化的 hassio,这样可以方便我们这些小白快速使用 homeassistant,不用再苦等 hassio 启动啦。
首先解析一下,一开始我也很懵逼,不就是docker 吗,找到 run语句,找到dockerfile 就好了啊,谁知道hassio项目为了自动化bulid,自动化管理,所以将bulid设置的十分复杂,docker run全部都是利用python实现的。利用 hassio-supervisor 来启动 homeassistant,所以我在 GitHub 找了半天没有找到 docker run 语句咯。
正文
------
1. 新建 Dockerfile 文件
------
$ mkdir ~/nero-homeassistant
$ cd ~/nero-homeassistant
$ vim Dockerfile
在Dockerfile 文件中输入以下代码。
FROM homeassistant/qemux86-64-homeassistant:latest
# 请将 qemux86-64-homeassistant 替换成你所在平台的 homeassistant 镜像,例如树莓派3可能要换成 homeassistant/raspberrypi3-homeassistant:latest
# add env
ENV LANG C.UTF-8
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
&& mkdir /root/.pip \
&& echo "[global]" > /root/.pip/pip.conf \
&& echo "trusted-host = mirrors.aliyun.com" >> /root/.pip/pip.conf \
&& echo "index-url = http://mirrors.aliyun.com/pypi/simple" >> /root/.pip/pip.conf
WORKDIR /config
CMD [ "python3", "-m", "homeassistant", "--config", "/config" ]
上面的dockerfile 其实就是将 alpinelinux 的系统 apk(类似 ubuntu 的 apt-get 包管理程序)源替换成国内源,将python 的 pip源替换成阿里云源。其余想添加更多语句自定义的可以写一个脚本,然后用 COPY 方式复制到docker镜像中运行,例子我就不写了,可以参考 https://yeasy.gitbooks.io/docker ... nt/image/build.html 我也是看这个文档学 docker 的。
2. 构建自定义镜像
------
刚刚我们建立好 Dockerfile 文件。现在我们可以根据文件构建属于我们自己的镜像。
在 Dockerfile 目录下执行下面命令
$ docker build -t nero/qemux86-64-homeassistant:latest .
注意 上面的命令最后面有个点,不要漏掉,这个点表示当前目录的意思。
如果你有 qemux86-64-homeassistant:latest 的话,这个过程会非常快,但是如果你本来的 qemux86-64-homeassistant 不是最新的,那么你可能需要重新 docker pull qemux86-64-homeassistant:latest ,这样编译出来的镜像才是最新的 homeassistant。
编译好后查看下docker images 是不是多了个 nero/qemux86-64-homeassistant:latest
3. 启用我们自己构建的镜像
------
如果你是 ubuntu 搭建的 docker 用一键安装脚本安装的话,那么这个目录下肯定会有 /usr/bin/hassio-start 这个脚本,打开这个脚本,你会发现其实它就是运行 hassio_supervisor 这个docker 的语句。
原来应该是这样的
#!/bin/bash
set -e
HASSIO_IMAGE_ID=$(docker inspect --format='{{.Id}}' homeassistant/amd64-hassio-supervisor)
HASSIO_CONTAINER_IMAGE_ID=$(docker inspect --format='{{.Image}}' hassio_supervisor || echo "")
runSupervisor() {
docker rm --force hassio_supervisor || true
docker run --name hassio_supervisor \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/run/hassio-hc.sock:/var/run/hassio-hc.sock \
-v /usr/share/hassio:/data \
-v /var/log/supervisor-log:/var/log \
-e SUPERVISOR_SHARE=/usr/share/hassio \
-e SUPERVISOR_NAME=hassio_supervisor \
-e HOMEASSISTANT_REPOSITORY=homeassistant/qemux86-64-homeassistant \
homeassistant/amd64-hassio-supervisor
}
([ "$HASSIO_IMAGE_ID" == "$HASSIO_CONTAINER_IMAGE_ID" ] && docker start --attach hassio_supervisor) || runSupervisor
-e HOMEASSISTANT_REPOSITORY= 这个选项就是定义homeassistant 镜像的镜像名,我们将他改成我们刚刚编译的镜像名即可。
改好应该是这样的:
#!/bin/bash
set -e
HASSIO_IMAGE_ID=$(docker inspect --format='{{.Id}}' homeassistant/amd64-hassio-supervisor)
HASSIO_CONTAINER_IMAGE_ID=$(docker inspect --format='{{.Image}}' hassio_supervisor || echo "")
runSupervisor() {
docker rm --force hassio_supervisor || true
docker run --name hassio_supervisor \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/run/hassio-hc.sock:/var/run/hassio-hc.sock \
-v /usr/share/hassio:/data \
-v /var/log/supervisor-log:/var/log \
-e SUPERVISOR_SHARE=/usr/share/hassio \
-e SUPERVISOR_NAME=hassio_supervisor \
-e HOMEASSISTANT_REPOSITORY=nero/qemux86-64-homeassistant \
homeassistant/amd64-hassio-supervisor
}
([ "$HASSIO_IMAGE_ID" == "$HASSIO_CONTAINER_IMAGE_ID" ] && docker start --attach hassio_supervisor) || runSupervisor
最后我们还需要干掉正在运行的 homeassistant,否则它是不会启动我们编译的homeassistant镜像的。
$ docker rm -f homeassistantdocker rm -f hassio_supervisor
$ sudo reboot
重启之后 docker ps 看看,homeassistant 已经换成了我们镜像的名称了。想替换地图,自定义什么的,只需要修改 Dockerfile 文件中的 RUN 即可。直接在命令后面加 && 就好了。
|