如果我们使用交互式 shell 启动 mssql 容器:
docker run -it --rm mcr.microsoft.com/mssql/server /bin/bash
然后查看容器内的活跃用户:
mssql@ed73727870bb:/$ whoami
mssql
我们看到活跃用户是mssql。此外,如果我们查看容器内/usr/src 的权限:
mssql@ed73727870bb:/$ ls -lisa /usr | grep -i src
163853 4 drwxr-xr-x 2 root root 4096 Apr 15 2020 src
我们看到只有root 对目录/usr/src 具有写访问权限。
因此,如果我们想创建一个目录/usr/src/app,以便用户mssql可以写入它,我们将不得不
- 将其创建为
root 和
- 向
mssql 授予适当的权限。
这导致以下Dockerfile:
FROM mcr.microsoft.com/mssql/server
# change active user to root
USER root
# create the app directory
RUN mkdir -p /usr/src/app
# set mssql as owner of the app directory
RUN chown mssql /usr/src/app
# change back to user mssql
USER mssql
WORKDIR /usr/src/app
# sanity check: try to write a file
RUN echo "Hello from user mssql" > hello.txt
如果我们构建并运行这个Dockerfile:
docker build -t turing85/my-mssql -f Dockerfile .
docker run -it --rm turing85/my-mssql /bin/bash
我们现在可以看到:
-
活跃用户仍然是mssql:
mssql@85e401ccc3f9:/usr/src/app$ whoami
mssql
-
文件/usr/src/app/hello.txt 已创建,用户mssql 具有读取权限:
mssql@85e401ccc3f9:/usr/src/app$ cat hello.txt
Hello from user mssql
-
用户mssql 拥有/usr/src/app 的写入权限:
mssql@85e401ccc3f9:/usr/src/app$ touch test.txt && ls -lisa
total 16
171538 4 drwxr-xr-x 1 mssql root 4096 Nov 6 20:13 .
171537 8 drwxr-xr-x 1 root root 4096 Nov 6 20:02 ..
171539 4 -rw-r--r-- 1 mssql root 17 Nov 6 20:02 hello.txt
171604 0 -rw-r--r-- 1 mssql root 0 Nov 6 20:13 test.txt
-
用户 mssql 没有对 /usr/src 的写入权限:
mssql@85e401ccc3f9:/usr/src/app$ touch ../test2.txt
touch: cannot touch '../test2.txt': Permission denied
对帖子中Dockerfile的评论:
似乎我们试图将应用程序复制到mssql 容器中。我假设这样做是为了在 mssql 容器中启动所述应用程序。虽然这是可能的(通过一些配置),但我强烈建议不要使用这种方法。我们可以改为定义两个容器(一个用于数据库,一个用于应用程序),例如通过docker-compose file。