Vraag Hoe kan ik debuggen voor initialisatie van een docker-container?


Ik had een probleem met een container, hoewel deze perfect bouwt, start deze niet goed. De oorzaak is een tijdelijke oplossing die ik heb toegevoegd aan het Dockerbestand (voor een zelf geconfigureerde / etc / hosts-routering)

RUN mkdir -p -- /lib-override /etc-override && cp /lib/libnss_files.so.2 /lib-override
ADD hosts.template /etc-override/hosts
RUN perl -pi -e 's:/etc/hosts:/etc-override/hosts:g' /lib-override/libnss_files.so.2
ENV LD_LIBRARY_PATH /lib-override

Natuurlijk zit daar een fout in, maar ik vraag me af hoe ik meer informatie kan krijgen over wat docker aan het doen is tijdens het hardlopen. dit werkt bijvoorbeeld:

$ docker run image ls
usr bin ...

Maar dit betekent niet:

$ docker run image ls -l
$

Er staat niets in de logs en ik kan ook geen interactieve shell noemen. Ik kan strace gebruiken om te zien wat er gebeurt, maar ik hoopte dat er een betere manier was.

Is er een manier om docker in te stellen voor meer breedsprakigheid?

BEWERK: Met dank aan Andrew D. Ik weet nu wat er mis is met de bovenstaande code (ik heb hem verlaten zodat zijn antwoord kan worden begrepen). Nu is het probleem nog steeds hoe kan ik zoiets als dit debuggen of een paar insides krijgen over waarom ls -l mislukt waarom ls deed niet.

BEWERK: De -D = true kan meer output opleveren, maar niet in mijn geval ...


61
2018-05-19 15:28


oorsprong


Doe de moeite om een ​​van de antwoorden als "geaccepteerd" te markeren, bedankt! - Brian Topping


antwoorden:


havenarbeider events commando kan helpen en Docker-logboeken commando kan logs ophalen, zelfs nadat de afbeelding niet kon starten.

Eerste start docker events op de achtergrond om te zien wat er aan de hand is.

docker events&

Voer dan je tekortkoming uit docker run ... commando. Dan zou je zoiets als het volgende op het scherm moeten zien:

2015-12-22T15:13:05.503402713+02:00 xxxxxxxacd8ca86df9eac5fd5466884c0b42a06293ccff0b5101b5987f5da07d: (from xxx/xxx:latest) die

Vervolgens kunt u de opstart-hex-id van het vorige bericht of de uitvoer van de run-opdracht ophalen. Dan kunt u het gebruiken met de opdracht logs:

docker logs <copy the instance id from docker events messages on screen>

U zou nu wat output van het opstarten van de mislukte afbeelding moeten zien.

Zoals @alexkb in een opmerking heeft gesuggereerd: docker events& kan lastig zijn als uw container constant wordt herstart van zoiets als AWS ECS-service. In dit scenario is het misschien eenvoudiger om de hex-id van de container uit de logboeken te halen /var/log/ecs/ecs-agent.log.<DATE>. Gebruik vervolgens Docker logs <hex id>.


61
2017-12-22 13:24



Erg behulpzaam! Nieuw bij docker en probeerde portainer te laten draaien. Opgelost met deze stappen voor foutopsporing. Gevonden iemand op Medium.com met hetzelfde probleem: medium.com/@jameson_37151/... - Jameson
Ik krijg "container niet gevonden" !? - demented hedgehog
Vreemd. Om het zeker te weten, @dementedhedgehog probeerde je de hex-id uit het logbericht te kopiëren dat eindigt op "(from xxx/xxx:latest) die"? - Peter Lamberg
Heel erg bedankt dit antwoord, het is een redder in leven. Enige ding om toe te voegen is dat docker events& kan lastig zijn als uw container constant wordt herstart van zoiets als AWS ECS-service. In dit scenario is het misschien eenvoudiger om de hex-id van de container uit de logboeken te halen /var/log/ecs/ecs-agent.log.<DATE>. Gebruik dan docker logs <hex id> zoals gesuggereerd door dit antwoord om te zien waarom dingen niet opstarten. - alexkb
@alexkb Bedankt! Ik heb je suggestie toegevoegd aan het einde van het antwoord, zodat anderen het misschien gemakkelijker vinden. - Peter Lamberg


Nou, de beste die ik tot nu toe heb ontdekt is:

#stop the current demon and start it in debug modus
sudo service docker stop
dockerd -D # --debug

Het start gewoon de client vanuit een nieuwe shell. De misvatting was om te denken dat de cliënt eigenlijk helemaal iets doet ... wel, het is gewoon communiceren met de daemon, dus je wilt niet debug de client maar de daemon zelf (normaal).


15
2018-05-26 09:07





In mijn geval, de -a (hechten aan STDOUT / STDERR) vlag was genoeg:

user@machine:~$ docker start -a server_name
Error: The directory named as part of the path /log/log_path/app.log does not exist.
For help, use /usr/bin/supervisord -h

Het toonde de opstartfout (in ons geval een ontbrekend logpad gebruikt door supervisord). Ik neem aan dat de meeste opstartfouten van de container hier ook worden weergegeven.


7
2018-03-29 13:27





Ik kan je vraag niet beantwoorden over hoe je docker-uitvoer completer kunt maken, maar ik kan je vertellen dat in-place regex een string in een .so-bestand vervangt is een beetje gestoord: de string heeft alleen zoveel ruimte toegewezen, en als u de bestandssaneringen van andere items wijzigt, wordt het elf-bestand beschadigd. Probeer objdump uit te voeren of lees zelf in je .so-bestand na het uitvoeren van de opdracht perl (vóór LD_LIBRARY_PATH wijzigen) buiten een container - dollars aan donuts is het nu corrupt.

De reden waarom het werkt in deze helaas noodzakelijke hack is omdat "tmp" en "etc" dezelfde tekenreekslengte hebben, dus geen verschuivingen veranderen. Overweeg de directory / dkr of soortgelijk als u liever niet / tmp gebruikt.

Als u MOET deze benadering gebruiken en uw gewenste paden onveranderlijk zijn, herbouw dan de bibliotheek en wijzig het standaardpad voor / etc / hosts in de bron. Of beter, wanneer je je gemodificeerde bouwt libnss_files.so hernoem het naar zoiets libnss_altfiles.so en veranderen nsswitch.conf gebruiken hosts: altfiles bij het starten van uw docker-container (tenzij docker ook gemount nsswitch.conf heeft gekoppeld, dan kunt u dit niet wijzigen). Hiermee kun je de libnss_altfiles.so parallel hebben met je normale bibliotheken in het basissysteem. Als docker nsswitch.conf aan een bindmount koppelt, laat dan een kopie van uw herbouwde libnss_files.so in uw directory / lib-override staan ​​om te worden geladen door LD_LIBRARY_PATH.

Als een hoofd omhoog negeren suid / sgid binaries LD_LIBRARY_PATH en LD_PRELOAD, dus sommige dingen gaan kapot (lees: ga terug naar het gebruik van de standaard / etc / hosts) als je die variabelen gebruikt.


2
2018-05-19 21:01



Heel erg bedankt voor het geweldige inzicht ... Ik was te snel en zie nu wat er gebeurt. Ik weet nog steeds niet waarom het verkrijgen van de stat een host (ls -l) moet oplossen, terwijl de eenvoudige bestandslijst (ls) niet werkt ... - estani