从内部重新启动容器

问题描述 投票:0回答:3

在批处理作业中,我执行大量操作 在码头工人里面。

有没有从docker内部发送命令 可以像刚刚开始一样回来吗?

docker centos
3个回答
14
投票

您只需要在构建 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

0
投票

这是一个很好的老问题,但尚未得到解答。 就我个人而言,我喜欢将文件放入目录中,并让我的入口点脚本检测到它以退出容器。只要容器设置为重新启动,这就会起作用。例如重新启动:除非停止

#!/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 即可触发容器重新启动


-3
投票

reboot 命令在容器内运行。 我在 docker 内的 Go 代码中使用了它

out, err = exec.Command("reboot").Output()
© www.soinside.com 2019 - 2024. All rights reserved.