bash - Dockerfile mkdir 权限被拒绝
问题描述
我正在尝试使用以下方法构建图像:
docker build -t db-demo .
但我明白了
RUN mkdir -p /usr/src/app: #5 0.512 mkdir: cannot create directory '/usr/src/app': Permission denied
Dockerfile
FROM mcr.microsoft.com/mssql/server
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN chmod +x /usr/src/app/run-initialization.sh
ENV SA_PASSWORD bpassword
ENV ACCEPT_EULA Y
ENV MSSQL_PID Express
EXPOSE 1433
CMD /bin/bash ./entrypoint.sh
操作系统是 Windows。如何解决这个问题?
解决方案
如果我们mssql
使用交互式 shell 启动容器:
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
对 directory 的写访问权限/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
文件。
推荐阅读
- docker - 如何在 docker build 中将多个环境变量加载到构建映像中?
- c# - 为什么当我松开手指时此触摸屏事件不起作用?
- reactjs - 如何将 POST api 与此有效负载集成?
- pandas - 如何在 Pandas 中按相似行进行映射?
- php - Laravel 5.8:一般错误:1005 无法创建表
- angular - 在 Angular 应用程序中渲染 doc、xlsx、ppt 文档
- scala - 使用喷雾时连接尝试失败
- javascript - javascript函数,不会返回值?
- python - TensorFlow Adam 优化器返回奇怪的损失
- javascript - 如果返回值(selectedPatient.age),如何隐藏或显示文本(岁)?反应