Ik vraag me af of een env-variabele kan worden gebruikt in een docker van? Reden hiervoor is om de tagging te controleren. Stel bijvoorbeeld dat ik deze regel in mijn Dockerfile heb:
From myApp
Wat ik wil is dit:
From myApp:${VERSION}
Op deze manier kan ik zeggen docker build . myApp --build-arg VERSION=9
Het proces om docker-images voor deze app te maken is hetzelfde. Ik wil geen Dockerfiles hebben die bijna identiek zijn, alleen maar om een andere basisafbeelding te gebruiken. Als ik versie 9 wil bouwen, moet deze versie 9 van de basisafbeelding gebruiken.
Antwoord 1, autoriteit 100%
Citeer deze link
:
Dit is nu mogelijk als iemand hier komt op zoek naar antwoorden: https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
FROM
instructies ondersteunen variabelen die worden gedeclareerd door ARG
instructies die vóór de eerste FROM
voorkomen.
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app
FROM extras:${CODE_VERSION}
CMD /code/run-extras
Antwoord 2, autoriteit 34%
Voor in ieder geval deze docker-versie is dit haalbaar
docker --version
docker version 18.09.8, build bfed4f5
Het vereist een vooraf ingestelde variabele in Dockerfile, bijvoorbeeld
ARG TAG=latest
FROM traefik:${TAG}
Vervolgens kunt u deze voorinstelling overschrijven met het volgende
docker build --build-arg "TAG=2.2.8" -t my-app:$TAG
Het versienummer wordt niet weergegeven tijdens het bouwen. als je wilt testen of het werkt, verwijs dan naar een niet-bestaande versie – het zal mislukken met: manifest my-app:version not found.
Antwoord 3, autoriteit 3%
U kunt eenvoudig uw Dockerfile genereren op basis van een sjabloon. Zetten
zoiets als dit in een Makefile:
MYTAG=latest
.PHONY: Dockerfile
Dockerfile: Dockerfile.in
sed 's/MYTAG/$(MYTAG)/' $< > $@ || rm -f $@
Dan kun je het volgende uitvoeren:
make MYTAG=8; docker build -t my-app-8 .
Dit heeft alleen zin als u regelmatig afbeeldingen maakt die
vereisen een andere tag in de regel FROM
.
Antwoord 4
Het is niet mogelijk.
U kunt echter een variabele tag zoals from myApp:latest
gebruiken en de tag latest
overschrijven wanneer u een nieuwe versie maakt.
Antwoord 5
Bouw uw container programmatisch met behulp van buildah(het kan ook Dockerfile gebruiken).
Dus voor jouw gebruik:
VERSION=v0.1.0
myCon=$(buildah from myApp:${VERSION})
buildah config --cmd "sleep 1d" $myCon
buildah commit $myCon $USER/sleeping1d
Je kunt het natuurlijk scripten, opslaan en aanroepen, en nog een voordeel is:
buildahheeft geen docker-daemon nodig, wat geweldig is voor CI. Het is ook een open-source project, bekijk de projectpagina.
Tussen haakjes, ik zag dit probleem de laatste tijd en dat is precies wat je wilt – https://github. com/projectatomic/buildah/issues/581
Antwoord 6
Helaas is dat niet mogelijk. De eerste regel van uw Dockerfile moeteen FROM
-instructie zijn, en dus sluit het gebruik van de ARG
-instructie uit. Er is een goed antwoord van larsks over het genereren van een Dockerfile, maar ik zou ook willen voorstellen om gewoon verschillende Dockerfiles te maken en vervolgens een bepaalde op te geven in je docker build
-opdracht met behulp van de -f
schakelaar:
docker build -t codemiester/app:latest -f ./Dockerfile.apache2.ubuntu