My committed image of SQL Server does not seem to work when using a mount. When not mounted, the image contains the changes I made but when when I mount the data directory I don't see the committed changes.
Step to reproduce:
Run a container with SQL server 2019.
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=P#ssword123" -p 14350:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Connect to this SQL Server and create a database named TestDB.
Commit the container, tagged as testDB, and delete the container. (My contianer ID is cabc3ac26dd0)
docker commit cabc3ac26dd0 testdb
docker container stop cabc3ac26dd0
docker rm cabc3ac26dd0
Run a container with this new image.
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=P#ssword123" -p 14350:1433 -d testdb
Connect to this SQL sServer container and you will see the new TestDB database. This is your new database, saved as part of the commit. This shows that the commit worked.
Remove the container, and run a new container for testdb with the data drive mounted to your local filesystem.
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=P#ssword123" -p 14350:1433 --mount type=bind,source=C:\Users\me\testdbfiles\mssql\data,target=/var/opt/mssql/data -d testdb
Connect to this sql server conatiner and you will not see the new TestDB.
It seems that the commit has worked when I run without the mount. When I run with the mount, I don't see the changes for my committed image.
This docker run command is the same one I have used for months.
This problem started about a week ago, near when I upgraded to docker
desktop 4.12.0.
The mounted location (C:\Users\me\testdbfiles\mssql\data) has the
sql server database files (such as master.mdf), therefore the mount
the syntax must be correct.
Running a select from sys.databases shows the new TestDB when I am not mounted. When mounted, this select doesn't show this database. This indicates that the master database itself is different when mounted.
Listing the contents of the /var/opt/mssql/data shows the TestDB file when not mounting, but does not show them when mounting.
Has anyone else experienced this problem?
How can I troubleshoot what happens during the mounting phase?
Update: I also added a new sql server login to the image. When I mount I don't see the login, with no bind mount the login is there.
Related
I'm trying to create a container with SQL Server running on with this command:
docker run -e "ACCEPT_EULA=Y" -e MSSQL_SA_PASSWORD="MyPassword1"
-e MSSQL_COLLATION="Polish_CI_AS" -p 1434:1433
-v C:/Users/User1/sql-server/data:/var/opt/mssql/data
-d mcr.microsoft.com/mssql/server:2019-latest
Everything is working fine, the env variable is set but the server collation is still the default - SQL_Latin1_General_CP1_CI_AS.
Any ideas?
Note that at the time of this writing, MSSQL_COLLATION only works when initializing the server for the first time (i.e. creating the master database). In order to change the server collation:
Create backups of all user databases.
Stop the old container.
Start container with -e MSSQL_COLLATION=Polish_CI_AS. Ensure the data volume is empty except for the backups.
Restore from the backups.
I'm trying to add a volume to a docker container but when I commit it and run with the new volume none of the sql services run on this copy?? Why would that be.
https://learn.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-powershell
I am adding the initial one as above and it works.All fine. Services running. I can connect to it, run SQL but I need to share a drive.
Seems I cant add one directly to an existing instance??
docker commit 5a8f89adeead newimagename
docker run -ti -v "C:/dir1":/dir1 newimagename /bin/bash
I do the above to clone it and add a volume. WORKS. But the sql services just arent running on this new one. Ill accept it either way I just want SQL running and a share in there.
Can anyone help.
Manged it:
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Pa55word1" `
-v C:/db:/dir1 `
-p 1433:1433 --name sql3 `
-d mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04
Had an issue with having no drive or no services but this has done it.
I am using postgres docker image in my project. For initialization I am using following command to create and init my database (tables, views, data, ...)
COPY sql_dump.sql /docker-entrypoint-initdb.d/
Is possible persist these data after container is stopped and removed? For instance when I run image of postgres, it will create database with these data wihout loading script every time of container start. Just load created data of first run.
I did some research and I found VOLUME command, but I don't know how to use it for my purpose, I am new with Docker. Thanks for any help. I am using Docker For Win v18.
You can use docker named volumes more information can be found here.
this will create a named volume called postgres-data
docker volume create postgres-data
and say this is your command to create the container.
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
change that to this.
docker run --name some-postgres -v postgres-data:/var/lib/postgresql -e POSTGRES_PASSWORD=mysecretpassword -d postgres
this should mount the postgres-data volume under /var/lib/postgresql. can they initialize your DB and when you stop and start the container it will contain the persisted data.
-HTH
Should containers be able to maintain state?
I am using a SQLServer Image like so.
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -d microsoft/mssql-server-linux:2017-latest
Then I create a database in it using dotnet ef.
dotnet ef database update -v
Database works fine until I restart the container. At which point my database is gona and the container is reset to it's initial state.
What am I missing? Do containers not persist state?
If so what's the point in using them for databases?
Yes they can if you don not delete the container so you can
docker stop xxx
or just simply restart your machine and than use
docker start xxx
or
docker restart xxx
if you use docker run you create a new container so there is no previous state to talk about. For sql server specifically there is an option to create a volume and store data there. If you do that you can delete a container and recreate it again without loosing data as its is no longer stored inside it.
I'm using MacOS Sierra with the latest version of the mssql docker file for linux.
I had built a database which grew to a size of ~69 GB. I started getting an error "Could not allocate a new page for database because of insufficient disk space in filegroup". I attempted to solve this problem by running this code:
USE [master]
GO
ALTER DATABASE [db]
MODIFY FILE ( NAME = N'db', FILEGROWTH = 512MB )
GO
ALTER DATABASE [db]
MODIFY FILE
(NAME = N'db_log', FILEGROWTH = 256MB )
GO
After doing this, I was no longer able to startup the the mssql container. I then manually replaced a backup copy of the container folder which in MacOs is called "com.docker.docker" and which contained the prior working version of the database.
After doing this, I stated getting the following error: "The extended event engine has been disabled by startup options. Features that depend on extended events may fail to start."
At this point I re-installed the docker container using the procedure mentioned in this post. the command I used was:
docker create -v /var/opt/mssql --name mssql microsoft/mssql-server-linux /bin/true
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Test#123' -p 1433:1433 --volumes-from mssql -d --name sql-server microsoft/mssql-server-linux
Although now I'm able to start the server with the new container, I would like restore the original SQL server database (~69 GB). I tried doing so by again manually copying the file named "Docker.qcow2" into the docker container folder. This is obviously not working.
How can I restore my database?