J'utilise docker pour le développement et en production pour le projet laravel. J'ai un fichier docker légèrement différent pour le développement et la production. Par exemple, je monte le répertoire local sur le conteneur docker dans l'environnement de développement afin que je ne le fasse pas besoin de faire docker build pour chaque changement de code.
Comme le répertoire monté ne sera disponible que lors de l'exécution du conteneur docker, je ne peux pas mettre de commandes comme "composer install" ou "npm install" dans dockerfile pour le développement.
Actuellement, je gère deux fichiers docker, existe-t-il un moyen de le faire avec un seul fichier docker et de décider des commandes à exécuter lors de la construction du docker en envoyant des paramètres.
Ce que j'essaie de réaliser est
Dans le fichier docker
...
IF PROD THEN RUN composer install
...
Pendant la construction du docker
docker build [PROD] -t mytag .
Vous pouvez utiliser deux Dockerfiles différents.
# ./Dockerfile (non production)
FROM foo/bar
MAINTAINER ...
# ....
Et un deuxième:
# ./Dockerfile.production
FROM foo/bar
MAINTAINER ...
RUN composer install
En appelant la commande build, vous pouvez dire quel fichier il doit utiliser:
$> docker build -t mytag .
$> docker build -t mytag-production -f Dockerfile.production .
Comme meilleure pratique, vous devriez essayer de viser à utiliser un Dockerfile pour éviter les erreurs inattendues entre les différents environnements. Cependant, vous pouvez avoir un cas d'utilisation où vous ne pouvez pas le faire.
La syntaxe Dockerfile n'est pas suffisamment riche pour prendre en charge un tel scénario, mais vous pouvez utiliser des scripts Shell pour y parvenir.
Créez un script Shell, appelé install.sh
qui fait quelque chose comme:
if [ ${ENV} = "DEV" ]; then
composer install
else
npm install
fi
Dans votre Dockerfile, ajoutez ce script puis exécutez-le lors de la construction
...
COPY install.sh install.sh
RUN chmod u+x install.sh && ./install.sh
...
Lors de la construction, passez un argument de génération pour spécifier l'environnement, par exemple:
docker build --build-arg "ENV=PROD" ...
J'ai quand même plusieurs méthodes comme le faire via docker-compose, multi-étapes, passer l'argument par le biais de fichiers et comme ce qu'elles ont spécifié ci-dessus.Mon entreprise doit faire un bon moyen de le faire et je passais par une partie de la méthode et ici est mon avis
La meilleure méthode consiste à passer l'argument à travers la cmd et vous pouvez également le passer à travers vscode tout en cliquant à droite et en cliquant sur l'image de construction Image du code Visual Studio pendant la construction de l'image de clikcing et dans le code comme
ARG BuildMode
RUN echo $BuildMode
RUN if [ "$BuildMode" = "debug" ] ; then apt-get update \
&& apt-get install -y --no-install-recommends \
unzip \
&& rm -rf /var/lib/apt/lists/* \
&& curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /vsdbg ; fi
et dans la section de construction de dockerfile
ARG BuildMode
ENV Environment=${BuildMode:-debug}
RUN dotnet build "debugging.csproj" -c $Environment -o /app
FROM build AS publish
RUN dotnet publish "debugging.csproj" -c $Environment -o /app
Vous pouvez utiliser directement des arguments de génération sans fournir de script sh supplémentaire. Cela pourrait sembler un peu désordonné, cependant. Mais ça marche.
Dockerfile doit être comme ceci:
FROM Alpine
ARG mode
RUN if [ "x$mode" = "xdev" ] ; then echo "Development" ; else echo "Production" ; fi
Et les commandes à vérifier sont:
docker build -t app --build-arg mode=dev .
docker build -t app --build-arg mode=prod .