Saltar al contenido
Curso Docker y Laravel Sail desde cero
09/10 Laravel Sail por dentro Comandos de Laravel Sail y su equivalente en docker compose
Tu lectura Quedan 9 min
Lección 9 de 10 · Laravel Sail por dentro

Comandos de Laravel Sail y su equivalente en docker compose

9 min de lectura Docker Engine 29.8

Hola, bienvenido. Llevamos 2 lecciones escribiendo sail delante de todo, y en esta vamos a abrir el script para comprobar que no hay magia. sail es un script de bash que lee el .env, comprueba que Docker está en marcha y le pasa cada comando a docker compose: up, down, ps o build tal cual, y php, composer, artisan o tinker como un docker compose exec -u sail laravel.test. Cuando sepas qué ejecuta cada uno, podrás usar Sail o Docker Compose según te convenga, y leer sus errores sabiendo de dónde salen.

En esta lección no cambiamos ningún archivo del proyecto: partimos de sail-app tal como lo dejamos en la lección anterior, con laravel.test, mysql y redis en marcha.

Cómo está hecho vendor/bin/sail

vendor/bin/sail es un lanzador que crea Composer y que ejecuta el script de verdad, vendor/laravel/sail/bin/sail. Son unas 700 líneas de bash, pero la mayoría es la ayuda y una rama por comando. Lo primero que hace, después de comprobar que estás en Linux o en macOS, es cargar tu .env y definir unas cuantas variables con su valor por defecto:

Ejemplo vendor/laravel/sail/bin/sail: el .env y las variables
if [ -n "$APP_ENV" ] && [ -f ./.env."$APP_ENV" ]; then
source ./.env."$APP_ENV";
elif [ -f ./.env ]; then
source ./.env;
fi
# Define environment variables...
export APP_PORT=${APP_PORT:-80}
export APP_SERVICE=${APP_SERVICE:-"laravel.test"}
export APP_USER=${APP_USER:-"sail"}
export DB_PORT=${DB_PORT:-3306}
export WWWUSER=${WWWUSER:-$UID}
export WWWGROUP=${WWWGROUP:-$(id -g)}

Fíjate en las 2 últimas líneas: aquí es donde salen el WWWUSER y el WWWGROUP que vimos en el compose.yaml, con tu UID y tu GID si no los has puesto en el .env. Y APP_SERVICE es el servicio donde se ejecutan los comandos, laravel.test, que también se puede cambiar desde el .env.

Después decide con qué binario va a hablar y, tras un bloque para usar archivos de Compose adicionales que aquí nos saltamos, comprueba que todo está en marcha:

Ejemplo vendor/laravel/sail/bin/sail: Compose y las comprobaciones
# Define Docker Compose command prefix...
if ${SAIL_DOCKER_BINARY} compose &> /dev/null; then
COMPOSE_CMD=(${SAIL_DOCKER_BINARY} compose)
else
COMPOSE_CMD=(${SAIL_DOCKER_BINARY}-compose)
fi
EXEC="yes"
if [ -z "$SAIL_SKIP_CHECKS" ]; then
# Ensure that Docker is running...
if ! ${SAIL_DOCKER_BINARY} info > /dev/null 2>&1; then
echo "${BOLD}Docker or Podman is not running.${NC}" >&2
exit 1
fi
# Determine if Sail is currently up...
if "${COMPOSE_CMD[@]}" ps "$APP_SERVICE" 2>&1 | grep 'Exit\|exited'; then
echo "${BOLD}Shutting down old Sail processes...${NC}" >&2
"${COMPOSE_CMD[@]}" down > /dev/null 2>&1
EXEC="no"
elif [ -z "$("${COMPOSE_CMD[@]}" ps -q)" ]; then
EXEC="no"
fi
fi

SAIL_DOCKER_BINARY vale docker salvo que lo cambies, así que Sail usa docker compose y solo cae en el antiguo docker-compose, con guion, si tu Docker no tiene el plugin de Compose. Después ejecuta docker info, el mismo comando que usa el script de laravel.build, y si falla, se para ahí. Por eso, con Docker parado, cualquier comando de Sail responde solo esto:

Salida
Docker or Podman is not running.

Y si Docker funciona pero los contenedores del proyecto están parados, EXEC pasa a valer no, y los comandos que tienen que entrar en el contenedor se niegan con otro mensaje. Esto es lo que da sail artisan --version después de un sail stop:

Salida
Sail is not running. You may Sail using the following commands: './vendor/bin/sail up' or './vendor/bin/sail up -d'
Lo que queda de esta lección
  1. 02Los que pasan tal cual y los que entran en el contenedor
  2. 03Sail frente a docker compose
  3. 04Cuándo usar docker compose directamente
  4. 05Xdebug en Laravel Sail
Sigue leyendo gratis Este curso es gratuito. Déjanos tu email y te enviamos un enlace para leerlo entero, junto con el resto de cursos gratuitos.

¿Ya lo habías pedido o entras desde otro dispositivo? Escribe el mismo email: recuperas tu acceso y tu avance.