HOWTO · Docker

Cambiar el comando del directorio de trabajo en Docker

Este artículo discutirá métodos para cambiar el directorio de trabajo en Docker.

En esta página

Usa WORKDIR en un Dockerfile para establecer el directorio de las instrucciones de compilación posteriores y el directorio de trabajo predeterminado de la imagen. Usa docker run -w /app para elegir el directorio del proceso de un contenedor nuevo, o docker exec -w /app para elegirlo para un comando que se inicia en un contenedor en ejecución. Para desplazarte de forma interactiva, inicia una shell con docker exec y ejecuta cd en ella. Estas opciones corresponden a distintas etapas y ámbitos: cambiar el directorio de un proceso o una shell no cambia el de todos los procesos del contenedor.

Cómo funcionan los directorios de trabajo en Docker

El directorio de trabajo es la ubicación inicial que usa un proceso para resolver rutas relativas. Una imagen puede definir su propio directorio de trabajo, así que no des por sentado que un contenedor empieza en /. WORKDIR establece un directorio en la configuración de la imagen y también para las instrucciones posteriores del Dockerfile. En tiempo de ejecución, docker run -w puede seleccionar otro directorio para esa invocación. docker exec -w selecciona un directorio para el comando que se inicia en un contenedor existente.

Elige el mecanismo según el momento en que necesites aplicar el directorio: durante la compilación de una imagen, al iniciar un contenedor o para un comando o una shell que se inicia después. El comando cd de una shell solo cambia el directorio actual de esa shell; no modifica el directorio de trabajo de otros procesos ni establece un estado para todo el contenedor.

Establecer el directorio de trabajo en un Dockerfile

En el Dockerfile, escribe WORKDIR /app antes de las instrucciones que deban usar /app. Por ejemplo, la secuencia de instrucciones puede ser FROM ubuntu:24.04, WORKDIR /app, COPY . . y RUN make. Esta es sintaxis de Dockerfile, no un script de shell. Las instrucciones posteriores COPY y RUN usan /app como directorio de trabajo. Si la ruta no existe, Docker la crea. Una instrucción WORKDIR posterior cambia el directorio para las instrucciones siguientes.

RUN ejecuta un comando durante la compilación; no es una forma persistente de establecer el directorio de trabajo. Por ejemplo, RUN cd /app solo cambia el directorio de la shell que usa esa instrucción RUN. La siguiente instrucción RUN inicia una shell distinta y no hereda el directorio de la anterior. Si varios comandos deben compartir un cambio de directorio dentro de una misma instrucción, RUN cd /app && make los ejecuta en la misma shell: make se ejecuta después de que cd termine correctamente. Si las instrucciones posteriores del Dockerfile deben usar esa ubicación, es preferible WORKDIR /app.

Elegir un directorio de trabajo al iniciar un contenedor

Usa -w (o --workdir) con docker run para elegir el directorio del proceso inicial del contenedor. Por ejemplo, la sintaxis docker run --rm -w /app alpine:3.20 pwd inicia un proceso en /app y le pide que muestre su directorio de trabajo. La imagen se llama alpine:3.20 y el comando que se ejecuta dentro del contenedor es pwd. Docker crea el directorio seleccionado si no existe en el contenedor. Esta opción se aplica a esa invocación del contenedor; no modifica el Dockerfile ni vuelve a compilar la imagen.

El comando anterior es ilustrativo y este paquete no incluye evidencia de su ejecución. Ejecútalo en un equipo con acceso a Docker para observar el resultado. Solo necesitas un montaje enlazado si el proceso debe acceder a archivos del equipo anfitrión; no hace falta para seleccionar un directorio de trabajo. Si montas archivos, especifica por separado la ruta del equipo anfitrión y la del contenedor, y asegúrate de que esta última coincida con la ruta seleccionada mediante -w.

Cambiar de directorio en un contenedor en ejecución

Para ejecutar un comando puntual en un contenedor existente, usa docker exec -w /app my_container pwd. Sustituye my_container por el nombre o el ID del contenedor y /app por la ruta que quieras usar. La opción -w se aplica a ese proceso pwd; no cambia el directorio del proceso principal del contenedor ni el de otros comandos.

Para abrir una shell interactiva, iníciala con docker exec -it my_container sh y luego escribe cd /app en el indicador. Usa bash en lugar de sh solo si la imagen incluye Bash. El cambio de directorio dura lo que dure esa sesión de shell. Al salir de ella, el cambio no persiste ni afecta a otros procesos del contenedor. Estos comandos requieren un contenedor que ya esté en ejecución y usan sintaxis específica de Docker; aquí no se proporciona ningún resultado de ejecución de Docker.

Este ejemplo de una shell local ilustra cómo cd afecta a la shell actual. No se ejecutó según la información del paquete y no requiere Docker:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

cd /tmp && printf 'Current directory: ' && pwd

Este ejemplo se ejecuta en la shell donde lo escribes; no inicia ni modifica ningún contenedor Docker. La misma distinción de alcance explica por qué cd en una shell interactiva del contenedor solo afecta a esa shell.

Usa WORKDIR para establecer el directorio de compilación y el directorio predeterminado de una imagen; docker run -w para el proceso inicial de un contenedor nuevo; y docker exec -w o una shell interactiva para trabajar en un contenedor en ejecución. En cada caso, comprueba qué proceso o instrucción usará el directorio elegido antes de depender de rutas relativas.