解決 debian8 中 /etc/default/docker 無效問題
問題
環境:Debian 8 + Docker 1.6
問題:
- /etc/default/docker 中 DOCKER_OPTS 引數無效
- /etc/default/docker didn’t work
- DOCKER_OPTS do not work
過程
一開始,只是因為搭了一個 registry,想新增 --insecure-registry=192.168.11.33:5000
作為 docker daemon 的啟動引數。做法是在 /etc/default/docker
中新增 DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=192.168.11.33:5000"
然而,絲毫沒有起作用。docker client 對 registry 的訪問都會因為 tls 失敗。如果檢視 docker 的啟動引數:
➜ ~ ps -ef | grep docker
root 11085 1 0 20:32 ? 00:00:00 /usr/bin/docker -d -H fd://
angryro+ 11148 1554 0 20:33 pts/1 00:00:00 grep --color=auto docker
會發現,DOCKER_OPTS 引數根本沒有被讀取。在 github 上找到這個 /lib/systemd/system/docker.service
中根本沒有設定 EnvironmentFile 變數,意味著 /etc/docker/default 根本沒有被讀取。 issue 裡面的修改方法是,修改 /lib/systemd/system/docker.service
:
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
EnvironmentFile=-/etc/default/docker #這裡添加了 EnvironmentFile 引數
ExecStart=/usr/bin/docker -d $DOCKER_OPTS -H fd:// # 增加了 $DOCKER_OPTS
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
EnvironmentFile 變數後面 =- 表示 ignore_errors=yes 的意思,$DOCKER_OPTS
新增到 ExecStart 裡意思應該是讓 systemd 把 EnvironmentFile 裡的 $DOCKER_OPTS
作為 docker 的啟動引數。然而這對於我並不起作用,如果成功的同學請告知我一下。錯誤的原因是 $DOCKER_OPTS
好像沒有被解析,docker 直接以 /usr/bin/docker -d $DOCKER_OPTS -H fd://
啟動,而不是 /usr/bin/docker -d --insecure-registry=192.168.11.33:5000 -H fd://
,所以 docker 會有啟動的錯誤。
$ ps -ef | grep docker # 檢視 docker 是否啟動及啟動引數
$ sudo systemctl status docker # 檢視 docker 啟動狀態
$ sudo journalctl -u docker # 檢視 docker 啟動日誌
看到 docker 關於 systemd 的文件,here. 這裡其實已經給了一個用 $OPTIONS
引數啟動的例子,只是當時比較執著,結果最後在一個 stackoverflow 上看到用 $OPTIONS
啟動的,我才這樣修改成功。記下下面幾條除錯的命令:
$ sudo systemctl show docker | grep EnvironmentFile
EnvironmentFile=-/etc/sysconfig/docker (ignore_errors=yes)
$ sudo systemctl status docker | grep Loaded
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
$ sudo grep EnvironmentFile /usr/lib/systemd/system/docker.service
EnvironmentFile=-/etc/default/docker
解決方案
在 /etc/default/docker
用 OPTIONS 選項,並相應修改 /lib/systemd/system/docker.service
:
➜ ~ cat /etc/default/docker
# Docker Upstart and SysVinit configuration file
# Customize location of Docker binary (especially for development testing).
#DOCKER="/usr/local/bin/docker"
# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"
# This is also a handy place to tweak where Docker's temporary files go.
#export TMPDIR="/mnt/bigdrive/docker-tmp"
OPTIONS=--insecure-registry 192.168.11.33:5000
➜ ~ cat /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
➜ ~ sudo systemctl daemon-reload
➜ ~ sudo systemctl restart docker
➜ ~ ps -ef | grep docker
root 5516 1 40 21:10 ? 00:00:02 /usr/bin/docker -d -H fd:// --insecure-registry 192.168.11.33:5000
angryro+ 5552 1573 0 21:10 pts/0 00:00:00 grep --color=auto docker