Ik werk aan een taak waarbij ik een docker-image moet bouwen met centOsals basis met behulp van een Dockerfile. Voor een van de stappen in het dockerbestand moeten http_proxyen https_proxyENV-variabelen worden ingesteld om achter de proxy te kunnen werken.
Omdat dit Docker-bestand door meerdere teams met verschillende proxy’s wordt gebruikt, wil ik voorkomen dat ik het Docker-bestand voor elk team moet bewerken. In plaats daarvan ben ik op zoek naar een oplossing waarmee ik ENV-variabelen kan doorgeven tijdens het bouwen, bijvoorbeeld
sudo docker build -e http_proxy=somevalue .
Ik weet niet zeker of er al een optie is die dit biedt. Mis ik iets?
Antwoord 1, autoriteit 100%
Containers kunnen worden gebouwd met behulp van build arguments
(in Docker 1.9+) die werken als omgevingsvariabelen.
Hier is de methode:
FROM php:7.0-fpm
ARG APP_ENV=local
ENV APP_ENV ${APP_ENV}
RUN cd /usr/local/etc/php && ln -sf php.ini-${APP_ENV} php.ini
en bouw dan een productiecontainer:
docker build --build-arg APP_ENV=prod .
Voor uw specifieke probleem:
FROM debian
ENV http_proxy ${http_proxy}
en voer dan uit:
docker build --build-arg http_proxy=10.11.24.31 .
Houd er rekening mee dat als u uw containers bouwt met docker-compose
, u geef deze build-args op in het bestand docker-compose.yml
, maar niet op de opdrachtregel. U kunt echter variabele vervanging gebruiken in de docker-compose.yml
-bestand, dat gebruikmaakt van omgevingsvariabelen.
Antwoord 2, autoriteit 22%
Dus ik moest dit met vallen en opstaan opsporen, aangezien veel mensen uitleggen dat je ARG
-> ENV
maar het werkt niet altijd, omdat het erg uitmaakt of de ARG voor of na de tag FROM
wordt gedefinieerd.
Het onderstaande voorbeeld zou dit duidelijk moeten uitleggen. Mijn grootste probleem was oorspronkelijk dat al mijn ARGS waren gedefinieerd vóór FROM
, wat ertoe leidde dat alle ENV
altijd ongedefinieerd waren.
# ARGS PRIOR TO FROM TAG ARE AVAIL ONLY TO FROM for dynamic a FROM tag
ARG NODE_VERSION
FROM node:${NODE_VERSION}-alpine
# ARGS POST FROM can bond/link args to env to make the containers environment dynamic
ARG NPM_AUTH_TOKEN
ARG EMAIL
ARG NPM_REPO
ENV NPM_AUTH_TOKEN ${NPM_AUTH_TOKEN}
ENV EMAIL ${EMAIL}
ENV NPM_REPO ${NPM_REPO}
# for good measure, what do we really have
RUN echo NPM_AUTH_TOKEN: $NPM_AUTH_TOKEN && \
echo EMAIL: $EMAIL && \
echo NPM_REPO: $NPM_REPO && \
echo $HI_5
# remember to change HI_5 every build to break `docker build`'s cache if you want to debug the stdout
..... # rest of whatever you want RUN, CMD, ENTRYPOINT etc..
Antwoord 3, autoriteit 3%
Ik zat in dezelfde situatie.
Volgens het antwoord van Sin30 is een mooie oplossing het gebruik van shell,
CMD ["sh", "-c", "cd /usr/local/etc/php && ln -sf php.ini-$APP_ENV php.ini"]