Перезапустите контейнер изнутри

avatar
quantCode
7 апреля 2018 в 23:43
10996
2
7

В пакетном задании я выполняю большое количество операций внутри докера.

Можно ли отправить команду изнутри, чтобы докер может вернуться, как если бы он только что начался ?

Источник
johnharris85
8 апреля 2018 в 00:09
1

Можете ли вы объяснить, чего вы пытаетесь достичь/зачем вам это нужно?

quantCode
8 апреля 2018 в 01:19
0

обычно мое приложение python открывает слишком много портов tcp, выделение ОЗУ, .... Просто хочу сбросить исходное состояние.

Yuankun
8 апреля 2018 в 16:19
0

Мое решение будет использовать сигнал для запуска перезагрузки приложения.

quantCode
9 апреля 2018 в 12:17
0

что делать, если приложение съедает все ресурсы докеров

Ответы (2)

avatar
Max2019
4 мая 2019 в 16:38
-1

команда перезагрузки работает из контейнера. Я использую это в своем коде Go внутри docker

.
out, err = exec.Command("reboot").Output()
OneCricketeer
29 октября 2019 в 12:44
1

Это просто убивает контейнер. Вам придется использовать внешнее планирование, чтобы заставить его вернуться

avatar
Weike
8 апреля 2018 в 02:46
10

Вам просто нужно установить клиент Docker при создании образов Docker и карты /var/run/docker.sock при запуске нового контейнера, чтобы включить клиент Docker внутри контейнера для подключения демона Docker на хосте, затем вы можете использовать команду docker просто как на хосте.

Сначала добавьте команды для установки docker-ce в ваш Dockerfile:

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.

$ 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
halfer
8 апреля 2018 в 15:47
2

Этот подход будет работать и может быть уместным в некоторых обстоятельствах. Однако он потеряет всю изоляцию безопасности контейнера и, по сути, предоставит ему root-доступ ко всему хосту (включая доступ ко всему, включая контейнеры, работающие на нем).

Mikl
2 октября 2018 в 19:44
0

Объясните, пожалуйста, почему клиент docker имеет доступ на запись к хосту docker с разрешениями только на чтение на docker.sock?

Sunchezz
14 мая 2021 в 07:56
0

@Mikl В большинстве производственных сред этого делать не следует. Вы раскрываете много информации, и, вероятно, с небольшим количеством знаний злоумышленник все еще может получить root-доступ через нее. Также злоумышленник может запустить новые контейнеры и использовать вашу машину для ботнета ;)