Vraag Hoe kan ik een upstart-script krijgen om een ​​docker-afbeelding goed te beheren?


Ik heb een lokale docker-registry waar ik me graag mee zou willen redden parvenu.

Ik heb het volgende script (in /etc/init/docker-registry.conf):

description "docker registry" 
author "me" 
start on filesystem and started docker 
stop on runlevel [!2345] 
respawn 
script
    /usr/bin/docker.io run -a stdout --rm --name=docker-registry \
    -v /var/local/docker-registry:/var/local/docker-registry \
    -p 5000:5000 mysite:5000/docker-registry
end script

Ik kan mijn docker-registerboete starten met:

sudo start docker-registry

Reactie: docker-registry start / running, proces 8620 

Vink aan om te bevestigen dat het loopt?

sudo status docker-registry

Reactie: docker-registry start / running, proces 8620 

Probeer het te stoppen met:

sudo stop docker-registry

Reactie: docker-register stop / wachten

Het stopt echter niet echt. Het proces is nog steeds in leven, de container draait en functioneert nog steeds perfect


Het stopt perfect met:

docker stop docker-registry

Ik heb geprobeerd dit aan het upstart-script toe te voegen:

post-stop script
    docker stop docker-registry
end script

Maar het keert gewoon terug: stop: opdracht is mislukt tijdens het stoppen


12
2018-06-01 17:47


oorsprong


antwoorden:


Dit werkte voor mij:

description "container foo"
author "me"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
  /usr/bin/docker start -a foo
end script
pre-stop script
  /usr/bin/docker stop foo
end script

Ik ga ervan uit de officiële Docker-documenten alleen maar om het automatische startgedeelte. De feitelijke PID-uitvoer door parveneur verschilt van de feitelijke PID-proces van het koppelaar en ik vermoed dat dit enige misaanpassing veroorzaakt bij het stoppen:

sudo service foo-docker start
foo-docker start/running, process 30313

Wat is dit proces? Het lijkt erop dat Docker de container heeft gelanceerd:

ps -p 30386 -f
UID        PID  PPID  C STIME TTY          TIME CMD
root     30386     1  0 14:48 ?        00:00:00 /bin/sh -e -c /usr/bin/docker start -a foo  /bin/sh

De PID van de feitelijke opdracht die in de container loopt, is een andere:

pidof foo
30400

En het doden van de PID van de havenarbeider, zoals ik vermoed service foo-docker stop Doet de container niet doden (of de opdracht die erin wordt uitgevoerd):

sudo kill 30386 # or sudo service foo-docker stop
#30400 is still running

8
2017-11-24 15:56



Probeer het voorvoegsel docker run regel met exec. Hierdoor wordt de docker-container uitgevoerd in de context van het shell-script in plaats van dat de shell-container wordt gebruikt. Dientengevolge, de docker run binair signaal ontvangt de signalen en ruimt zichzelf op.

Ik heb bijvoorbeeld het volgende:

description "Docker container for OpenVPN server"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
  exec docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
end script

En rennen start docker-openvpn en stop docker-openvpn werkt zoals verwacht (--rm is ook vereerd).

Getest op Docker version 1.4.0, build 4595d4f op Ubuntu 14.04.

Als dit niet werkt, overweeg dan om de upstream docker apt repo te updaten:

   curl https://get.docker.io/gpg | sudo apt-key add -
   echo deb http://get.docker.io/ubuntu docker main | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update && sudo apt-get install -y lxc-docker

3
2017-12-15 01:40



U hoeft Docker hier niet te bellen om te stoppen Het stopcommando van de opstart stuurt het SIGTERM-signaal naar de container, wat hetzelfde is.

Er kan echter een probleem zijn met het hier krijgen van --rm. Er is een open probleem met Github over


0
2018-06-14 04:33



Om uw pre-stop-script te laten werken, voegt u gewoon "rm" toe om de benoemde container op te ruimen, dus:

...
...
pre-stop script
  / usr / bin / docker stop [containernaam]
  / usr / bin / docker rm [containernaam]
einde script

Je kunt ook voorkomen dat je in dit geval ook een container moet starten (vs "docker run"), in dit geval (start werkt alleen als je al een run en stop hebt gedaan). Dus je startscript ziet er als volgt uit:

...
script
   / usr / bin / docker rm [containernaam] | waar
   / usr / bin / docker uitvoeren [-v vol: vol] [-p port: poort] --name = [containernaam] [docker-tag]
einde script

Om dit te laten werken, moet je met --naam uitvoeren, of stop kan je container niet vinden. Als je echt wilt beginnen met -a, kun je starten, stoppen, starten in je opstartscript.

Compleet voorbeeld:

omschrijving "stormbegeleider docker container"
auteur "youremail@emailprovider.domain"

start op het bestandssysteem en start docker
stop op runlevel [! 2345]
respawn
script
        / usr / bin / docker rm storm-supervisor | waar
        / usr / bin / docker uitvoeren --naam = "storm-supervisor" -v / var / log / docker-storm-supervisor: / var / log -p 6700: 6700 -p 6701: 6701 -p 6702: 6702 -p 6703: 6703-p 6704: 6704-p 6705: 6705-p 6706: 6706 tycoon / storm-supervisor
einde script

pre-stop script
        / usr / bin / docker stoppen storm-supervisor
        / usr / bin / docker rm storm-supervisor
einde script

0
2018-04-16 23:31



Je kunt gebruiken --restart=always bij het starten van docker-register, d.w.z.

docker run -d --restart=always docker-registry

Op deze manier wordt het beeld automatisch opnieuw opgestart, samen met een herstart van de machine, net als bijstarten.

Meer informatie over het herstartbeleid hier


-1
2018-01-29 10:04