Estoy aprendiendo a Docker. Muchas veces he visto que Dockerfile
tiene el WORKDIR
mando:
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 WORKDIR
y Copy
tener mi Dockerfile
en la raíz de mi proyecto? ¿Cuáles son las desventajas de utilizar este enfoque?
docker
dockerfile
Le garcon
fuente
fuente
WORKDIR
Respuestas:
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 builder
y 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)?WORKDIR
la ventana acoplable , diría que mantiene el valor porque es una instrucción que se ejecuta en el Dockerfile antes de ejecutar laCOPY
únicaRUN mkdir
comando 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/app
Esto se creará automáticamente cuando especifique su
WORKDIR
fuente
Puede pensar en
WORKDIR
comocd
dentro del contenedor (afecta a los comandos que vienen más adelante en el Dockerfile, como elRUN
comando). Si eliminóWORKDIR
en su ejemplo anterior,RUN npm install
no funcionaría porque no estaría en el/usr/src/app
directorio 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
COPY
es una ruta relativa, por lo que si mueve su Dockerfile, es posible que deba actualizar esosCOPY
comandos.fuente
WORKDIR
agrega likecd
, ¿no tendrán los dosCOPY
en el ejemplo original el mismo origen y destino?WORKDIR
afecta el directorio de trabajo dentro del contenedor . En el ejemplo original, las primerasCOPY
copias delpackage.json
host (ruta relativa al Dockerfile)/usr/src/app/package.json
en el contenedor . De hecho,WORKDIR
no tiene ningún impacto en ese comando en particular porque el destino (dentro del contenedor) no utiliza una ruta relativa (la ruta comienza con/
).WORKDIR
actúa como uncd
. Entonces, ¿los 2 fragmentos a continuación equivalen?WORKDIR /usr/src/app
COPY package.json /usr/src/app/
yWORKDIR /usr/src/app
COPY 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
/Publish
fuente
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 seWORKDIR
comporta 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
WORKDIR
referencia falla ...mientras que tiene éxito en esto ...
.oO ( Quizás esté en los documentos y me lo perdí )
fuente
Tenga cuidado donde lo establece
WORKDIR
porque puede afectar el flujo de integración continuo. Por ejemplo, configurarlo en/home/circleci/project
provocará un error como.ssh
o lo que sea que esté haciendo el círculo remoto en el momento de la configuración.fuente