Estoy aprendiendo a Docker. Muchas veces he visto que Dockerfiletiene el WORKDIRmando:
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
EXPOSE 3000
CMD [ “npm”, “start” ]
¿No puedo simplemente omitir WORKDIRy Copytener mi Dockerfileen la raíz de mi proyecto? ¿Cuáles son las desventajas de utilizar este enfoque?
docker
dockerfile
Le garcon
fuente
fuente

WORKDIRRespuestas:
Según la documentación :
Además, en las mejores prácticas de Docker, le recomienda que lo use:
Sugeriría mantenerlo.
Creo que puedes refactorizar tu Dockerfile a algo como:
fuente
FROM ubuntu as buildery luego el uso sucesivo de la imagenCOPY, ¿"sabe" que usé WORKDIR en la imagen del "constructor" o debo asumir que no (y usar una ruta absoluta)?WORKDIRla ventana acoplable , diría que mantiene el valor porque es una instrucción que se ejecuta en el Dockerfile antes de ejecutar laCOPYúnicaRUN mkdircomando no es necesario; es decir, esa línea podría eliminarse. Según la documentación "Si el WORKDIR no existe, se creará incluso si no se utiliza en ninguna instrucción posterior de Dockerfile". - docs.docker.com/engine/reference/builder/#workdirNo tienes que
RUN mkdir -p /usr/src/appEsto se creará automáticamente cuando especifique su
WORKDIRfuente
Puede pensar en
WORKDIRcomocddentro del contenedor (afecta a los comandos que vienen más adelante en el Dockerfile, como elRUNcomando). Si eliminóWORKDIRen su ejemplo anterior,RUN npm installno funcionaría porque no estaría en el/usr/src/appdirectorio dentro de su contenedor.No veo cómo esto se relacionaría con el lugar donde coloca su Dockerfile (ya que su ubicación de Dockerfile en la máquina host no tiene nada que ver con el pwd dentro del contenedor). Puede colocar el Dockerfile donde desee en su proyecto. Sin embargo, el primer argumento de
COPYes una ruta relativa, por lo que si mueve su Dockerfile, es posible que deba actualizar esosCOPYcomandos.fuente
WORKDIRagrega likecd, ¿no tendrán los dosCOPYen el ejemplo original el mismo origen y destino?WORKDIRafecta el directorio de trabajo dentro del contenedor . En el ejemplo original, las primerasCOPYcopias delpackage.jsonhost (ruta relativa al Dockerfile)/usr/src/app/package.jsonen el contenedor . De hecho,WORKDIRno tiene ningún impacto en ese comando en particular porque el destino (dentro del contenedor) no utiliza una ruta relativa (la ruta comienza con/).WORKDIRactúa como uncd. Entonces, ¿los 2 fragmentos a continuación equivalen?WORKDIR /usr/src/appCOPY package.json /usr/src/app/yWORKDIR /usr/src/appCOPY package.json .graciasAntes de aplicar WORKDIR. Aquí el WORKDIR está en el lugar equivocado y no se usa con prudencia.
Corregimos el código anterior para poner WORKDIR en la ubicación correcta y optimizamos las siguientes declaraciones eliminando
/Publishfuente
Tenga cuidado con el uso de vars como el nombre del directorio de destino para
WORKDIR- hacer eso parece resultar en un error fatal "no se puede normalizar nada". En mi opinión, también vale la pena señalar que seWORKDIRcomporta de la misma manera que,mkdir -p <path>es decir, todos los elementos de la ruta se crean si aún no existen.ACTUALIZACIÓN: Encontré el problema relacionado con la variable (mencionado anteriormente) mientras ejecutaba una compilación de varias etapas; ahora parece que usar una variable está bien, si (la variable) está "dentro del alcance", por ejemplo, en lo siguiente, la segunda
WORKDIRreferencia falla ...mientras que tiene éxito en esto ...
.oO ( Quizás esté en los documentos y me lo perdí )
fuente
Tenga cuidado donde lo establece
WORKDIRporque puede afectar el flujo de integración continuo. Por ejemplo, configurarlo en/home/circleci/projectprovocará un error como.ssho lo que sea que esté haciendo el círculo remoto en el momento de la configuración.fuente