如何基地自动更新您的码头集装箱
假设我有一个基于ubuntu:latest
的平凡容器ubuntu:latest
。 现在有一个安全更新和ubuntu:latest
更新在码头回购。
1)我如何知道我的本地图像和它的容器在后面运行?
2)是否有一些最佳做法可以自动更新本地映像和容器以遵循docker repo更新,这在实践中会为您提供与在常规ubuntu-machine上运行无人值守升级相同的细节
我们使用脚本来检查正在运行的容器是否启动了最新的映像。 我们也使用upstart初始化脚本来启动Docker镜像。
#!/usr/bin/env bash
set -e
BASE_IMAGE="registry"
REGISTRY="registry.hub.docker.com"
IMAGE="$REGISTRY/$BASE_IMAGE"
CID=$(docker ps | grep $IMAGE | awk '{print $1}')
docker pull $IMAGE
for im in $CID
do
LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
RUNNING=`docker inspect --format "{{.Image}}" $im`
NAME=`docker inspect --format '{{.Name}}' $im | sed "s////g"`
echo "Latest:" $LATEST
echo "Running:" $RUNNING
if [ "$RUNNING" != "$LATEST" ];then
echo "upgrading $NAME"
stop docker-$NAME
docker rm -f $NAME
start docker-$NAME
else
echo "$NAME up to date"
fi
done
而init看起来像
docker run -t -i --name $NAME $im /bin/bash
“码头方式”将是使用码头中心自动化构建。 当上游容器重建时,Repository Links功能将重建您的容器,Webhooks功能将向您发送通知。
它看起来像webhooks仅限于HTTP POST调用。 你需要设置一个服务来捕捉它们,或者使用POST之一来发送邮件服务。
我没有看过它,但新的Docker通用控制平面可能具有检测更新的容器和重新部署的功能。
我有同样的问题,并认为它可以通过每天调用unattended-upgrade
的cron作业简单解决。
我的意图是将此作为自动快速解决方案,以确保生产容器的安全性和更新,因为它可能需要我花一些时间来更新我的映像并部署具有最新安全更新的新Docker映像。
还可以使用Github钩子自动化图像构建和部署
我创建了一个基本的docker镜像,每天自动检查和安装安全更新(可以通过docker run itech/docker-unattended-upgrade
直接docker run itech/docker-unattended-upgrade
)。
我还遇到另一种不同的方法来检查容器是否需要更新。
我的完整实现:
Dockerfile
FROM ubuntu:14.04
RUN apt-get update
&& apt-get install -y supervisor unattended-upgrades
&& rm -rf /var/lib/apt/lists/*
COPY install /install
RUN chmod 755 install
RUN /install
COPY start /start
RUN chmod 755 /start
助手脚本
安装
#!/bin/bash
set -e
cat > /etc/supervisor/conf.d/cron.conf <<EOF
[program:cron]
priority=20
directory=/tmp
command=/usr/sbin/cron -f
user=root
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
EOF
rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["/start"]
开始
#!/bin/bash
set -e
echo "Adding crontab for unattended-upgrade ..."
echo "0 0 * * * root /usr/bin/unattended-upgrade" >> /etc/crontab
# can also use @daily syntax or use /etc/cron.daily
echo "Starting supervisord ..."
exec /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
编辑
我开发了一个小型工具docker-run,作为docker容器运行,可用于更新所有或选定运行容器中的软件包,也可用于运行任意命令。
可以使用以下命令轻松测试:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
默认情况下会在所有正在运行的容器中执行date
命令并显示结果。 如果你传递update
而不是exec
,它将在所有正在运行的容器中执行apt-get update
然后执行apt-get upgrade -y
上一篇: How to automatically update your docker containers, if base