@Android-student

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

DockerでSQL SERVERを構築し、テーブルを作成したい。

解決したいこと

Dockerからコマンド投入によりSQLSERVERを構築し、構築したSQLSERVERに対してDockerからコマンド投入によりテーブルの作成を行いたい。

発生している問題・エラー

下記DockerのSQLSERVER構築コマンドと思われるものを投入した際に何か処理が行われてPCの再起動を要求されたため再起動したが、SQLSERVER構築コマンドが正常に終了したか途中でなにか不具合があるか操作が足りないか状態がわからない。
状態の確認方法とその後何をすれば良いかわからない。

該当するソースコード

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<passXXXXX>" -p 1433:1433 --name sql1 --hostname sql1 -d mcr.microsoft.com/mssql/server:2022-latest

### 自分で試したこと
Docker DesktopをインストールしてContainersタブを開いたが投入したSQLSERVERが表示されずView all your running containers and applications.Learn more⁠が表示される。
0 likes

3Answer

一度コンテナを削除して、もう一度runしてみてください。
削除は以下で可能です。
docker stop container name
docker rm container name

0Like

Comments

  1. コメントありがとうございます。
    まずはUbuntuから実行していることの記載が漏れていました。申し訳ございません。
    次にコメントを受けて実施した内容と状況を記載致します。
    docker stop sql1とdocker rm sql1を実行後に上記の該当するソースコードのdocker runを再度実行し、
    docker ps -a を実行したところ STATUSがExited(255)となっていました。
    次にdocker logs sql1を実行し
    SQL Server 2022 will run as non-root by default.
    This container is running as user mssql.が出力されていたため
    docker runに -v sqlvolume:/var/opt/mssql を追加し
    docker stop sql1
    docker rm sql1
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=" -p 1433:1433 -v sqlvolume:/var/opt/mssql --name sql1 --hostname sql1 -d mcr.microsoft.com/mssql/server:2022-latest
    を実行後にdocker ps -a と docker logs sql1を実行したが結果は変わっていませんでした。

  2. 異なる方法としてdocker-composeを使用することとし、
    https://qiita.com/75ks/items/b156905968535e23278c
    を参考にし、
    Github上に次の通りファイルを作成いたしました。

    ┝ docker
        ┝ init.db.d
            ┝ entrypoint.sh
            ┝ init.sql
        ┝ docker-compose.yml
    
    entrypoint.sh
    echo "Waiting for SQL Server to start..."
    /opt/mssql/bin/sqlservr & MSSQL_PID=$!
    
    while ! /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P xxxx -Q "SELECT 1" > /dev/null 2>&1; do
      sleep 1
    done
    echo "SQL Server started."
    
    echo "Initializing database..."
    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P xxxx -i /docker-initdb.d/init.sql
    echo "Database initialized."
    
    wait $MSSQL_PID
    
    init.sql
    IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'test_db')
    BEGIN
      CREATE DATABASE test_db;
    END
    GO
    
    USE test_db;
    GO
    
    IF NOT EXISTS(SELECT * FROM sys.tables WHERE name = 'user' AND type = 'U')
    BEGIN
      CREATE TABLE user(
        [id] INT NOT NULL IDENTITY(1,1)
        , [name] VARCHAR(MAX)
        , PRIMARY KEY(ID)
      );
    
      INSERT INTO user (name) VALUES('taro');
      INSERT INTO user (name) VALUES('jiro');
      INSERT INTO user (name) VALUES('saburo');
    END
    GO
    
    docker-compose.yml
    version: '3'
    
    services:
      mssql:
        image: mcr.microsoft.com/mssql/server:2022-latest
        user: root
        container_name: mssql
        environment:
          - ACCEPT_EULA=Y
          - SA_PASSWORD=xxxx
          - MSSQL_PID=Express
          - MSSQL_TCP_PORT=1433
          - MSSQL_LCID=1041
          - TZ="Asia/Tokyo"
          - Japanese_CI_AS=Japanese_CI_AS
        ports:
          - 1433:1433
        volumes:
          - ./initdb.d:docker-initdb.d
          - mssql_data:/var/opt/mssql/data
          - mssql_log:/var/opt/mssql/log
          - mssql_secrets:/var/opt/mssql/secrets
        command: ["/bin/bash", "-c", "chmod +x /docker-initdb.d/entrypoint.sh && /docker-initdb.d/entrypoint.sh"]
    volumes:
      mssql_data:
      mssql_log:
      mssql_secrets:
    

    次にVSCodeのターミナルより

    git clone https://github.com/xxxxxxxx/docker.git
    

    を実行後

    docker-compose -p docker up -d
    

    を実行すると下記のエラーが発生いたしました。

    time="2025-02-18T20:14:55+09:00" level=warning msg="C:\\Users\\user\\docker\\docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion"unable to get image 'mcr.microsoft.com/mssql/server:2022-latest': error during connect: Get "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/v1.47/images/mcr.microsoft.com/mssql/server:2022-latest/json": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.
    

    次にdocker-compose.ymlの1行目であるversion: '3'をコメント化して再度

    docker-compose -p docker up -d
    

    を実行すると下記のエラーが発生いたしました。

    unable to get image 'mcr.microsoft.com/mssql/server:2022-latest': error during connect: Get "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/v1.47/images/mcr.microsoft.com/mssql/server:2022-latest/json": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.
    

    現在はここで詰まっている状況となります。
    以上。

  3. 続けてフォルダ名をinit.db.d から initdb.d に変更し、

    ┝ docker
        ┝ initdb.d
            ┝ entrypoint.sh
            ┝ init.sql
        ┝ docker-compose.yml
    

    docker-initdb.dをdocker/initdb.dに変更し、

    entrypoint.sh
    echo "Waiting for SQL Server to start..."
    /opt/mssql/bin/sqlservr & MSSQL_PID=$!
    
    while ! /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P xxxx -Q "SELECT 1" > /dev/null 2>&1; do
      sleep 1
    done
    echo "SQL Server started."
    
    echo "Initializing database..."
    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P xxxx -i /docker-initdb.d/init.sql
    echo "Database initialized."
    
    wait $MSSQL_PID
    
    docker-compose.yml
    # version: '3'
    
    services:
      mssql:
        image: mcr.microsoft.com/mssql/server:2022-latest
        user: root
        container_name: mssql
        environment:
          - ACCEPT_EULA=Y
          - SA_PASSWORD=xxxx
          - MSSQL_PID=Express
          - MSSQL_TCP_PORT=1433
          - MSSQL_LCID=1041
          - TZ="Asia/Tokyo"
          - Japanese_CI_AS=Japanese_CI_AS
        ports:
          - 1433:1433
        volumes:
          - ./initdb.d:docker-initdb.d
          - mssql_data:/var/opt/mssql/data
          - mssql_log:/var/opt/mssql/log
          - mssql_secrets:/var/opt/mssql/secrets
        command: ["/bin/bash", "-c", "chmod +x /docker/initdb.d/entrypoint.sh && /docker/initdb.d/entrypoint.sh"]
    volumes:
      mssql_data:
      mssql_log:
      mssql_secrets:
    

    vscodeの拡張機能でRemote Developmentをインストールし、

    docker-compose -p docker up -d
    

    を実行すると下記のエラーが発生いたしました。

    Error response from daemon: invalid volume specification: '/run/desktop/mnt/host/c/Users/username/.docker/docker/initdb.d:docker/initdb.d:rw': invalid mount config for type "bind": invalid mount path: 'docker/initdb.d' mount path must be absolute
    

    現在はここで詰まっている状況となります。
    以上。

解決手順

  1. コンテナとボリュームのクリーンアップ

    docker stop sql1
    docker rm sql1
    docker volume rm sqlvolume
    
  2. 正しいdocker runコマンドで起動

    • パスワードは8文字以上(大文字、小文字、数字、記号含む、例:P@ssw0rd123)。
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=P@ssw0rd123" -p 1433:1433 --name sql1 --hostname sql1 -d mcr.microsoft.com/mssql/server:2022-latest
    
    • ポート競合時は-p 1434:1433に変更。
  3. 起動確認

    • コンテナ状態:
      docker ps
      
      • Upなら成功、Exitedならdocker logs sql1でエラー確認。
    • ログ確認:
      docker logs sql1
      
      • SQL Server is now readyが表示されれば正常。
  4. SQL Server接続

    • sqlcmdで接続:
      docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "P@ssw0rd123"
      
  5. テーブル作成

    • sqlcmd内で実行:
      CREATE DATABASE TestDB;
      GO
      USE TestDB;
      GO
      CREATE TABLE Users (Id INT PRIMARY KEY IDENTITY(1,1), Name NVARCHAR(50), Email NVARCHAR(100));
      GO
      
  6. ボリューム追加(任意)

    • データ永続化:
      docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=P@ssw0rd123" -p 1433:1433 -v sqlvolume:/var/opt/mssql --name sql1 --hostname sql1 -d mcr.microsoft.com/mssql/server:2022-latest
      

エラー対処

  • パスワードエラー:強力なパスワード(例:P@ssw0rd123)に変更。
  • ポート競合netstat -aon | findstr :1433で確認、ポート変更。
  • メモリ不足:Docker Desktopでメモリを4GB以上に設定。

注意

  • ログ(docker logs sql1)でエラー詳細を確認。
0Like

Your answer might help someone💌