Kan een variabele worden gebruikt in docker FROM?

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

FROMinstructies ondersteunen variabelen die worden gedeclareerd door ARGinstructies die vóór de eerste FROMvoorkomen.

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:latestgebruiken en de tag latestoverschrijven 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 -fschakelaar:

docker build -t codemiester/app:latest -f ./Dockerfile.apache2.ubuntu

Other episodes