web-dev-qa-db-fra.com

Comment configurer différents Dockerfile pour le développement et la production

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 .
18
Dev Khadka

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 .
17
Michael Hirschler

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" ...
14
yamenk

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
1
jorence jovin

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 .
0
Nick Roz