Kontejner Docker v kontejneru Docker používá démona Docker nadřazeného hostitele HOST, a proto se na všechny svazky, které jsou připojeny v případě „docker-in-docker“, stále odkazuje z HOST, a nikoli z kontejneru.
Proto skutečná cesta připojená z kontejneru Jenkins "neexistuje" v HOST. Díky tomu se v kontejneru "docker-in-docker" vytvoří nový adresář, který je prázdný. Totéž platí, když je adresář připojen k novému kontejneru Docker uvnitř kontejneru.
Velmi základní a zřejmá věc, která mi unikla, ale uvědomil jsem si to, jakmile jsem otázku napsal.
Dalším způsobem, jak toho dosáhnout, je použít pojmenované svazky nebo kontejnery svazků dat. Tímto způsobem kontejner uvnitř nemusí vědět nic o hostiteli a kontejner Jenkins i kontejner sestavení odkazují na objem dat stejným způsobem.
Pokusil jsem se udělat něco podobného, co děláte vy, s výjimkou agenta, spíše než pomocí Jenkinsova mistra. Problém byl stejný v tom, že jsem nemohl namontovat pracovní prostor Jenkins do vnitřního kontejneru. Co pro mě fungovalo, bylo použití přístupu kontejneru datového objemu a soubory pracovního prostoru byly viditelné pro kontejner agenta i vnitřní kontejner. Na tomto přístupu se mi líbilo, že oba kontejnery odkazují na objem dat stejným způsobem. Připojení adresářů pomocí vnitřního kontejneru by bylo složité, protože vnitřní kontejner nyní potřebuje vědět něco o hostiteli, na kterém běží jeho nadřazený kontejner.
Podrobný blogový příspěvek o mém přístupu mám zde:
http://damnhandy.com/2016/03/06/creating-containerized-build-environments-with-the-jenkins-pipeline-plugin-and-docker-well-almost/
Stejně jako kód zde:
https://github.com/damnhandy/jenkins-pipeline-docker
V mém konkrétním případě ne vše funguje tak, jak bych chtěl, pokud jde o plugin Jenkins Pipeline. Ale řeší problém vnitřního kontejneru, který má přístup k adresáři pracovního prostoru Jenkins.
V těchto příspěvcích je spousta dobrých informací, ale zjistil jsem, že žádný z nich není zcela jasný o tom, na který kontejner odkazují. Takže označme 3 prostředí:
- hostitel:H
- kontejner ukotvení běžící na H:D
- Docker kontejner běžící v D:D2
Všichni víme, jak připojit složku z H do D:začněte D pomocí
docker run ... -v <path-on-H>:<path-on-D> -v /var/run/docker.sock:/var/run/docker.sock ...
Výzva zní:chcete path-on-H
bude k dispozici v D2 jako path-on-D2
.
Ale všichni jsme se kousli, když jsme se snažili připojit stejný path-on-H
do D2, protože jsme D2 začali s
docker run ... -v <path-on-D>:<path-on-D2> ...
Když sdílíte docker socket na H s D, pak spouštění příkazů dockeru v D je v podstatě spouští na H. Pokud D2 spustíte takto, vše funguje (zpočátku zcela nečekaně, ale dává to smysl, když se nad tím zamyslíte):
docker run ... -v <path-on-H>:<path-on-D2> ...
Další ošemetnou záležitostí je pro mnohé z nás path-on-H
se bude měnit v závislosti na tom, kdo jej provozuje. Existuje mnoho způsobů, jak předávat data do D, aby věděl, co použít pro path-on-H
, ale asi nejjednodušší je proměnná prostředí. Aby byl účel takového varu jasnější, začínám jeho název na DIND_
. Poté od H začněte D takto:
docker run ... -v <path-on-H>:<path-on-D> --env DIND_USER_HOME=$HOME \
--env DIND_SOMETHING=blabla -v /var/run/docker.sock:/var/run/docker.sock ...
a od D spusťte D2 takto:
docker run ... -v $DIND_USER_HOME:<path-on-D2> ...