在批处理作业中,我执行大量操作 在码头工人里面。
有没有从docker内部发送命令 可以像刚刚开始一样回来吗?
您只需要在构建 docker 镜像和映射时安装 docker 客户端
/var/run/docker.sock
在运行新容器时即可使容器内的 docker 客户端能够连接主机上的 docker 守护进程,然后您就可以像上一样使用 docker
命令主持人。
首先,在您的
Dockerfile
中添加安装 docker-ce 的命令:
FROM centos:7.8.2003
ENV DOCKER_VERSION='19.03.8'
RUN set -ex \
&& DOCKER_FILENAME=https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz \
&& curl -L ${DOCKER_FILENAME} | tar -C /usr/bin/ -xzf - --strip-components 1 docker/docker
然后,构建一个新映像并使用它运行一个新容器:
$ docker build --tag docker-in-docker:v1 .
$ docker run -dit \
--name docker-in-docker \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
docker-in-docker:v1 bash
现在,您可以在 docker 容器内操作 docker-daemon(在主机上)。
$ docker exec -it docker-in-docker docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bdc2d81b2227 docker-in-docker:v1 "bash" 8 seconds ago Up 7 seconds docker-in-docker
# just restart the container docker-in-docker in the container docker-in-docker:
$ docker exec docker-in-docker docker restart docker-in-docker
这是一个很好的老问题,但尚未得到解答。 就我个人而言,我喜欢将文件放入目录中,并让我的入口点脚本检测到它以退出容器。只要容器设置为重新启动,这就会起作用。例如重新启动:除非停止
#!/bin/bash
# Begin long running process, add a `&` to do so in the background
/app/scripts/long_running.sh &
# Wait for a signal to restart
while true; do
if [ -f /app/restart.txt ]; then
echo "Restarting container..."
# Remove the restart flag
rm -f /app/restart.txt
# Do any additional cleaning up if you need to.
# exit the container - exit code is optional
exit 3010
fi
sleep 5
done
在您的容器中只需
touch
/app/restart.txt 即可触发容器重新启动
reboot 命令在容器内运行。 我在 docker 内的 Go 代码中使用了它
out, err = exec.Command("reboot").Output()