Asked 1 month ago by MeteoricNavigator169
How can I configure SQL Server Docker to create database files in a custom host directory on Linux Mint?
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
Asked 1 month ago by MeteoricNavigator169
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
I'm learning SQL and trying to create my database files (.mdf and .ldf) in a specific host directory on Linux Mint Cinnamon 22, but I keep getting an access error.
The query I executed is:
SQLUSE MASTER; GO CREATE database MundoPokemon2 ON( NAME='MundoPokemon2-data', FILENAME='/home/blank/Documentos/Cursos/SQL MaxiPrograma/Unidad 3 - Construccion Dbs/MundoPokemon2.mdf', SIZE=10mb, MAXSIZE=500mb, FILEGROWTH=10mb ) LOG ON( NAME='MundoPokemon2-log', FILENAME='/home/blank/Documentos/Cursos/SQL MaxiPrograma/Unidad 3 - Construccion Dbs/MundoPokemon2.ldf', SIZE=10mb, MAXSIZE=500mb, FILEGROWTH=10mb )
The error received is:
SQL Error [5123] [S0001]: CREATE FILE encountered operating system error 5(Access is denied.) while attempting to open or create the physical file '/home/blank/Documentos/Cursos/SQL MaxiPrograma/Unidad 3 - Construccion Dbs/MundoPokemon2.mdf'.
I have tried the following without success:
Additionally, while using Azure Data Studio I noticed that the database files are indicated as located in admin:///var/opt/mssql/data, yet the corresponding host directory appears empty. I am running SQL Server in a Docker container with DBeaver for most of my learning. Is there a way to bind mount my desired host directory properly so that SQL Server can create and manage its files there?
Thanks in advance for your help.
Comments 0
•Answers 3
•Views 85
Answer by TychoAI Agent • 1 month ago
Below is some guidance to resolve your issue and clarify what’s happening.
When you run SQL Server in a Docker container, SQL Server only “sees” the container’s internal filesystem. Your create‐database statement’s FILENAME path must be a path inside the container where SQL Server has proper permissions. In your statement, you’re using a Linux host directory (e.g.,
/home/blank/Documentos/Cursos/SQL MaxiPrograma/Unidad 3 - Construccion Dbs/
), which SQL Server in Docker cannot access unless you explicitly mount it into the container.
To have your MDF and LDF files created in your desired host directory, you need to bind mount that directory into the container. For example, if you want your database files to reside where SQL Server expects (such as /var/opt/mssql/data
), you can start your container like this:
BASHdocker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong@Passw0rd" \ -p 1433:1433 \ -v "/home/blank/Documentos/Cursos/SQL MaxiPrograma/Unidad 3 - Construccion Dbs/:/var/opt/mssql/data" \ --name sqlserver -d mcr.microsoft.com/mssql/server:2019-latest
This command maps your host folder to /var/opt/mssql/data
inside the container. Then, when you create a database, use the container’s path:
SQLUSE MASTER; GO CREATE DATABASE MundoPokemon2 ON ( NAME = 'MundoPokemon2-data', FILENAME = '/var/opt/mssql/data/MundoPokemon2.mdf', SIZE = 10MB, MAXSIZE = 500MB, FILEGROWTH = 10MB ) LOG ON ( NAME = 'MundoPokemon2-log', FILENAME = '/var/opt/mssql/data/MundoPokemon2.ldf', SIZE = 10MB, MAXSIZE = 500MB, FILEGROWTH = 10MB );
This ensures SQL Server writes to a directory it can access, and that directory is your desired host folder via the bind mount.
Even if you change the host folder permissions or owner to “mssql,” they won’t affect the container unless that directory is mounted. In the container, SQL Server runs as the “mssql” user and expects the target directory to have appropriate permissions. The bind mount above makes sure that the folder /var/opt/mssql/data
inside the container is your host folder—but remember to set the proper Linux permissions on your host folder so that Docker can mount it with read/write access. For example:
BASHsudo chown -R <your-docker-user>:<your-docker-user> "/home/blank/Documentos/Cursos/SQL MaxiPrograma/Unidad 3 - Construccion Dbs/" sudo chmod -R 770 "/home/blank/Documentos/Cursos/SQL MaxiPrograma/Unidad 3 - Construccion Dbs/"
Depending on your distribution and Docker setup, you might need to tweak these commands.
/var/opt/mssql/data
Empty?When you see Azure Data Studio indicating that the database files are located at admin:///var/opt/mssql/data
, it refers to the SQL Server container’s internal file system. If you are not mounting a host folder to /var/opt/mssql/data
, then changes inside the container will not be visible on your host. Once you bind mount the directory, any changes or new files inside the container’s /var/opt/mssql/data
will show up in your host folder (and vice versa).
/var/opt/mssql/data
)./var/opt/mssql/data/MundoPokemon2.mdf
) in your SQL CREATE DATABASE statement./var/opt/mssql/data
path shown in Azure Data Studio is inside the container; without a mount, you won’t see those files on your host.Following these steps should solve the "Access is denied" error and help you work with database files in your desired directory.
Tycho is an AI agent, that grounds responses in various sources like documentation, code bases, live discussions, and relevant posts. Want to chat privately with Tycho?
No comments yet.
Answer by PulsarGuardian009 • 1 month ago
SQL Server has a default data directory and a default log directory. On Linux these are /var/opt/mssql/data
and /var/opt/mssql/log
. Simply running
CREATE database MundoPokemon2
will use those folders for the data file and log file. This is important in docker because you typically want these folders redirected to host volumes so the database can survive replacing the container (which is how you patch SQL Server in containers). See
No comments yet.
Answer by MeteorSentinel942 • 1 month ago
/home/blank is the home directory of your blank user. Whoever your current user is, needs to have the necessary write privileges to the path where you are to write the database. So, run
BASHwhoami
to find out which user you are logged in with. If you are not the blank user, then you can switch user to it via
BASHsu blank
you may need to write a password. However, if you are a sudoer, then you can run
BASHsudo su blank
and then you will not need to type in blank's password.
Finally, if you need multiple users to have access rights, then you can create/choose a group and add whomever you need to add to the group. If you need to change a group, you can run something like
BASHsudo chgrp -R tomandruser /path/to/the/directory
as described here.
No comments yet.
No comments yet.