El uso de contenedores Docker para gestionar bases de datos como SQL Server es una práctica cada vez más popular en desarrollo y producción. En este artículo, te contaré cómo configurar la imagen oficial de Docker de SQL Server para cargar un script SQL inicial durante el proceso de construcción de la imagen.
Esta técnica puede ahorrarte tiempo y esfuerzo al garantizar que tu base de datos esté lista desde el primer momento, algo esencial para entornos portátiles y eficientes. Si aún no estás familiarizado con los beneficios de Docker en entornos de desarrollo, te recomiendo revisar mi artículo sobre cómo utilizar Docker para crear entornos de desarrollo portátiles y eficientes.
¿Por qué cargar un script inicial en SQL Server con Docker?
Cargar un script inicial tiene muchas ventajas, como:
- Automatización: Permite inicializar tablas, vistas o procedimientos almacenados sin intervención manual.
- Consistencia: Garantiza que todos los entornos (desarrollo, pruebas, producción) tengan la misma configuración.
- Eficiencia: Evita pasos adicionales después de desplegar el contenedor.
Preparativos para comenzar
Antes de empezar, asegúrate de tener instalado Docker en tu sistema. Además, necesitarás:
- La imagen oficial de SQL Server para Docker:
mcr.microsoft.com/mssql/server:2019-latest
. - Un fichero SQL con los comandos que deseas ejecutar, por ejemplo,
init-database.sql
.
Para la descarga de la imagen, hay que utilizar el siguiente comando
docker pull mcr.microsoft.com/mssql/server
Crear el Dockerfile
El Dockerfile es el núcleo de esta configuración. Define cómo se construirá la imagen personalizada que incluirá el script SQL inicial. Este fichero se debe llamar Dockerfile, sin extesión, y debe llevar elsiguiente código:
# Usar la imagen oficial de SQL Server
FROM mcr.microsoft.com/mssql/server:2019-latest
# Variables de entorno
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=MyP@ssw0rd!1234
# Cambiar temporalmente al usuario root para operaciones con permisos
USER root
# Crear un directorio para los scripts y ajustar permisos
RUN mkdir -p /usr/src/sqlscripts && \
chmod 755 /usr/src/sqlscripts
# Copiar el script SQL al contenedor
COPY init-database.sql /usr/src/sqlscripts/init-database.sql
# Instalar herramientas necesarias
RUN apt-get update && \
apt-get install -y --no-install-recommends curl apt-transport-https gnupg && \
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list && \
apt-get update && ACCEPT_EULA=Y apt-get install -y mssql-tools unixodbc-dev && \
ln -s /opt/mssql-tools/bin/* /usr/local/bin/ && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# Volver al usuario predeterminado de SQL Server
USER 10001
# Ejecutar SQL Server y aplicar el script SQL
RUN (/opt/mssql/bin/sqlservr --accept-eula &) && \
sleep 20 && \
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "MyP@ssw0rd!1234" -i /usr/src/sqlscripts/init-database.sql && \
pkill sqlservr
# Exponer el puerto estándar
EXPOSE 1433
# Comando por defecto
CMD ["/opt/mssql/bin/sqlservr"]
Cada comando en el Dockerfile cumple un propósito específico. Vamos a desglosarlos:
- FROM mcr.microsoft.com/mssql/server:2019-latest: Este comando define la imagen base que utilizaremos, en este caso, la imagen oficial de SQL Server 2019 más reciente. Es el punto de partida para construir nuestra propia imagen personalizada.
- ENV ACCEPT_EULA=Y SA_PASSWORD=YourStrong!Password: Establece variables de entorno necesarias para la configuración de SQL Server:
- ACCEPT_EULA=Y: Acepta automáticamente los términos de la licencia de Microsoft.
- SA_PASSWORD: Define la contraseña del usuario sa (administrador). Es importante que sea segura para evitar vulnerabilidades.
- RUN mkdir -p /usr/src/sqlscripts && chmod 755 /usr/src/sqlscripts:
- mkdir -p /usr/src/sqlscripts: Crea un directorio en el contenedor donde se almacenarán los scripts SQL.
- chmod 755 /usr/src/sqlscripts: Otorga permisos de lectura, escritura y ejecución al propietario, y permisos de lectura y ejecución para otros usuarios.
- COPY init-database.sql /usr/src/sqlscripts/init-database.sql: Copia un archivo llamado init-database.sql desde el contexto de construcción (tu máquina) al contenedor, ubicándolo en el directorio creado anteriormente.
- RUN apt-get update && … && apt-get clean && rm -rf /var/lib/apt/lists/*: Este bloque instala herramientas adicionales necesarias para ejecutar comandos SQL dentro del contenedor:
- Actualiza los paquetes disponibles (apt-get update).
- Instala curl y mssql-tools para trabajar con SQL Server desde la línea de comandos.
- Limpia archivos temporales para reducir el tamaño de la imagen.
- ENTRYPOINT [«./entrypoint.sh»]: Especifica el script que se ejecutará al iniciar el contenedor. Este archivo debería contener instrucciones para cargar los scripts SQL en SQL Server.
- CMD [«tail», «-f», «/dev/null»]: Evita que el contenedor termine inmediatamente después de ejecutarse, manteniéndolo en ejecución para trabajar con él.
Construcción Script SQL ejemplo
A continuación, un script SQL que crea una base de datos de ejemplo llamada Biblioteca
, con dos tablas (Libros
y Autores
) y algunos datos iniciales:
-- Crear la base de datos
CREATE DATABASE Biblioteca;
GO
-- Usar la base de datos creada
USE Biblioteca;
GO
-- Crear la tabla Autores
CREATE TABLE Autores (
AutorID INT IDENTITY(1,1) PRIMARY KEY,
Nombre NVARCHAR(100) NOT NULL,
Nacionalidad NVARCHAR(50) NOT NULL
);
GO
-- Crear la tabla Libros
CREATE TABLE Libros (
LibroID INT IDENTITY(1,1) PRIMARY KEY,
Titulo NVARCHAR(200) NOT NULL,
AutorID INT NOT NULL,
FechaPublicacion DATE,
FOREIGN KEY (AutorID) REFERENCES Autores(AutorID)
);
GO
-- Insertar datos en la tabla Autores
INSERT INTO Autores (Nombre, Nacionalidad) VALUES
('Gabriel García Márquez', 'Colombiana'),
('Jane Austen', 'Británica'),
('Haruki Murakami', 'Japonesa');
GO
-- Insertar datos en la tabla Libros
INSERT INTO Libros (Titulo, AutorID, FechaPublicacion) VALUES
('Cien años de soledad', 1, '1967-06-05'),
('Orgullo y prejuicio', 2, '1813-01-28'),
('Kafka en la orilla', 3, '2002-09-12');
GO
Construir la imagen personalizada
Guarda el fichero Dockerfile
y el fichero init-database.sql
en el mismo directorio y ejecuta el siguiente comando para construir la imagen:
docker build -t my-custom-mssql .
Esto generará una nueva imagen de Docker llamada my-custom-mssql
que incluirá tu script SQL inicial.
Desplegar el contenedor
Para ejecutar el contenedor basado en la nueva imagen:
docker run -d -p 1433:1433 --name sqlserver my-custom-mssql
Este comando inicia el servidor SQL y expone el puerto 1433. Tu script init-database.sql
ya estará ejecutado al inicio.
Verificar los datos
Puedes conectarte al contenedor para verifcar los datos con el siguiente comando:
docker exec -it sqlserver-container /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "YourStrong!Passw0rd" -Q "SELECT * FROM DemoDB.dbo.Employees"