質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

SQLServeronLinuxをDockerでUser毎に運用する際のファイルアクセス権限問題

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 649

score 17

前提・実現したいこと

SQLServer on LinuxをCentOS7+Dockerコンテナで稼働させます。
hostにUserを登録して、以下ディレクトリをマウントして永続化します。
-v /home/<username>:/var/opt/mssql

また、hostにはsambaをインストール・設定して、/home/<username>ディレクトリをWindowsから共有フォルダとして利用できるようにします。
該当ユーザー(<username>)の認証でのみアクセスできるよう設定します。
共有フォルダの目的は、主にmdf,ldfやバックアップファイル等をWindowsとやり取りすることです。

各ユーザーは基本的にLinuxを意識せず、Windows上からのManagement Studioとエクスプローラ操作のみでこの環境を運用します。

発生している問題

SQLServer on Linuxがroot権限で稼働しているので、バックアップファイル等を作成すると、そのファイルもroot権限でしか触れません。
各々のユーザーの権限でバックアップファイルをLinux⇒Windowsに取り出すことができません。

該当のソースコード

docker run --name user01sql2017 \
-e 'ACCEPT_EULA=Y' \
-e 'SA_PASSWORD=<userstrongpassword>' \
-e 'MSSQL_LCID=1041' \
-e 'MSSQL_COLLATION=Japanese_CI_AS' \
-p 1401:1433 \
-v /etc/passwd:/etc/passwd:ro \
-v /etc/group:/etc/group:ro \
-v /home/user01:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2017-latest

試したこと

docker runを該当ユーザーで実行→アクセス拒否
visudoでroot権限を記述してdocker run→コンテナは作成されるがExitedのまま稼働できず、logにはやはりアクセス拒否
ユーザーをdockerグループに所属させてdocker run→結局root権限になる

まだまだ知識が追い付かず、基本的なところを抜かしているかもしれません。
手法に拘りすぎているようで、発想の転換が必要なようにも思うのですが、アイデアが出てきません。
何かご教授いただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

docker cp コマンドを利用することで、
コンテナ上のファイルをコマンド実行ユーザの所有権で取得することができます。

例えば、コンテナ user01sql2017 上の所有権がrootである /etc/hostsを
docker cp user01sql2017:/etc/hosts .
と実行して取得するとカレントディレクトリに生成される hosts ファイルは
内容はコンテナ上と同一内容で、ファイル所有権はホストの実行ユーザのものになります。

参考: docker docs - docker cp

Ownership is set to the user and primary group at the destination. For example, files copied to a container are created with UID:GID of the root user. Files copied to the local machine are created with the UID:GID of the user which invoked the docker cp command. 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/27 10:08 編集

    回答ありがとうございます。勉強になります。

    Windowsからバッチを実行→共有フォルダ内にダウンロード可能なファイルが複製されている…という仕組みが作れれば、各ユーザーで運用可能と思います。
    これから諸々勉強して試行してみようと思います。

    ### 追記
    docker cp コンソールで動作を確認できました。
    あとは、Windowsからバッチ実行できるまでを手順化できるかどうか…やってみます。

    ### 追記2
    WindowsにOpenSSHを設定して、PowerShellでバッチ実行できました。
    コンテナのマウントディレクトリからホストの同ディレクトリへと上書きコピーすることができたので、とても便利でした。
    `#!/bin/bash
    $FILENAME = Read-Host "転送したいファイル名を入力"
    ssh user01@<host-ip> docker cp user01sql2017:/var/opt/mssql/backup/$FILENAME /home/user01/backup/$FILENAME`

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る