Este es mi archivo acoplable:
FROM node:6-onbuild RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app/ RUN npm install COPY . /usr/src/app ENV PORT 80 EXPOSE ${PORT} CMD [ "npm","run", "start" ]y en package.json tengo esto:
"scripts": { "start": "node start.js", "stagestart": "NODE_ENV=content-staging node start.js" } el script de start es para producción, ahora quiero una forma de ejecutar el script de preparación en dockerfile. ¿Hay alguna manera de leer NODE_ENV dentro de dockerfile, para que pueda tener un dockerfile que maneje la puesta en escena y la producción?
Aquí hay dos posibles implementaciones.
FYI: no necesita mencionar NODE_ENV en package.json si ya configuró NODE_ENV en el nivel del sistema o configuró NODE_ENV durante el tiempo de compilación o el tiempo de ejecución en Docker.
Aquí Dockerfile es igual pero solía usar una imagen base alpine
FROM node:alpine RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app/ RUN npm install COPY . /usr/src/app ENV PORT 3000 ARG DOCKER_ENV ENV NODE_ENV=${DOCKER_ENV} RUN if [ "$DOCKER_ENV" = "stag" ] ; then echo your NODE_ENV for stage is $NODE_ENV; \ else echo your NODE_ENV for dev is $NODE_ENV; \ fi EXPOSE ${PORT} CMD [ "npm","run", "start" ]cuando construyes este Dockerfile con este comando
docker build --build-arg DOCKER_ENV=stag -t test-node .Verás en la capa
---> Running in a6231eca4d0b your NODE_ENV for stage is stagCuando ejecute este contenedor docker y ejecute este comando, su salida será
/usr/src/app # echo $NODE_ENV stagEl enfoque más simple es la misma imagen y pero establece la variable de entorno en tiempo de ejecución
Su Dockerfile
FROM node:alpine RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app/ RUN npm install COPY . /usr/src/app ENV PORT 3000 EXPOSE ${PORT} CMD [ "npm","run", "start" ]Ejecute esta imagen acoplable con este comando
docker build -t test-node . docker run --name test -e NODE_ENV=content-staging -p 3000:3000 --rm -it test-node ashEntonces, cuando ejecute este comando en el contenedor, verá
/usr/src/app # echo $NODE_ENV content-stagingAsí es como puede iniciar su aplicación de nodo con NODE_ENV sin configurar la variable de entorno en package.json. Entonces, si su configuración de nodejs se basa en NODE_ENV , debe elegir la configuración de acuerdo con NODE_ENV .
Puede usar la instrucción ENV para obtener la variable de entorno como una variable de entorno dentro del contenedor. Tenga un script de punto de entrada que inyecte la variable de entorno disponible (quizás algo tan simple como sed) en lugar de un nombre de variable de marcador de posición que se encuentra en su archivo package.json. Luego inicie su aplicación de nodo. Obviamente, esto requerirá que realice algunos cambios en su Dockerfile con respecto al script de punto de entrada, etc.
Así es como he logrado tales cosas en el pasado.