質問: ### 前提・実現したいこと SQLServer on LinuxをCentOS7+Dockerコンテナで稼働させます。 hostにUserを登録して、以下ディレクトリをマウントして永続化します。 -v /home/:/var/opt/mssql また、hostにはsambaをインストール・設定して、/home/ディレクトリをWindowsから共有フォルダとして利用できるようにします。 該当ユーザー()の認証でのみアクセスできるよう設定します。 共有フォルダの目的は、主に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=' \ -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権限になる ### まだまだ知識が追い付かず、基本的なところを抜かしているかもしれません。 手法に拘りすぎているようで、発想の転換が必要なようにも思うのですが、アイデアが出てきません。 何かご教授いただけると幸いです。
回答: `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. > > >