如果在 docker 构建期间添加了该目录,如何修复拒绝访问该目录的权限?
How to fix denied permission to access a directory if that directory was added during docker build?
我使用以下 Dockerfile
扩展 docker 图像:
FROM solr:6.6
COPY --chown=solr:solr ./services-core/search/A12Core /A12Core/
请注意 solr:6.6
有一个 USER solr
语句。
当 运行 从该 Dockerfile 构建的容器时,我在尝试访问 /A12Core
下的文件或目录时获得权限被拒绝:
$ docker run -it 2f3c58f093e6 /bin/bash
solr@c091f0cd9127:/opt/solr$ cd /A12Core
solr@c091f0cd9127:/A12Core$ cd conf
bash: cd: conf: Permission denied
solr@c091f0cd9127:/A12Core$ ls -l
total 8
drw-r--r-- 3 solr solr 4096 Aug 31 14:21 conf
-rw-r--r-- 1 solr solr 158 Jun 28 14:25 core.properties
solr@c091f0cd9127:/A12Core$ whoami
solr
solr@c091f0cd9127:/A12Core$
我需要做什么才能获得访问 /A12Core
目录中的字段和文件夹的权限?
请注意,我是 运行 docker 构建自 windows 7。我的 docker 版本是 18.03.0-ce
。
我在这里有另一个答案,这是错误的(但仍然解决了你的问题:),但现在我在你的 Dockerfile 中看到了错字。我们来看看这一行。
COPY --chown=solr:solr ./services-core/search/A12Core /A12Core/
COPY
命令检查容器中的目标路径是否存在。如果没有,它会在复制之前创建它。
- 从
./services-core/search
中取出 A12Core
。
- 然后检查路径
/A12Core
是否存在。
- 显然,事实并非如此。因此,该命令使用
root:root
. 权限创建它
- 最后,它将
A12Core
的内容复制到新创建的A12Core
。
最后你拥有 /A12Core
中的所有内容,但它属于 root
,你无法访问它。
由于 solr
docker 图片已经设置 USER solr
,接下来的方法是
RUN mkdir /A12Core
COPY ./services-core/search/A12Core /A12Core
The USER
instruction sets the user name ... the user group ... for any RUN
, CMD
and ENTRYPOINT
instructions that follow it in the Dockerfile
.
您的目录没有执行权限:
drw-r--r-- 3 solr solr 4096 Aug 31 14:21 conf
否则,您无法根据 Linux 文件系统权限 cd 进入目录。您可以使用 chmod 在主机中修复该问题:
chmod +x conf
如果您在 Dockerfile 中执行此命令(使用 RUN
行),它将导致任何修改的文件被复制到新层,因此如果您递归地 运行,它可以使您的图像大小加倍,因此建议尽可能在您的构建主机上修复它。
我使用以下 Dockerfile
扩展 docker 图像:
FROM solr:6.6
COPY --chown=solr:solr ./services-core/search/A12Core /A12Core/
请注意 solr:6.6
有一个 USER solr
语句。
当 运行 从该 Dockerfile 构建的容器时,我在尝试访问 /A12Core
下的文件或目录时获得权限被拒绝:
$ docker run -it 2f3c58f093e6 /bin/bash
solr@c091f0cd9127:/opt/solr$ cd /A12Core
solr@c091f0cd9127:/A12Core$ cd conf
bash: cd: conf: Permission denied
solr@c091f0cd9127:/A12Core$ ls -l
total 8
drw-r--r-- 3 solr solr 4096 Aug 31 14:21 conf
-rw-r--r-- 1 solr solr 158 Jun 28 14:25 core.properties
solr@c091f0cd9127:/A12Core$ whoami
solr
solr@c091f0cd9127:/A12Core$
我需要做什么才能获得访问 /A12Core
目录中的字段和文件夹的权限?
请注意,我是 运行 docker 构建自 windows 7。我的 docker 版本是 18.03.0-ce
。
我在这里有另一个答案,这是错误的(但仍然解决了你的问题:),但现在我在你的 Dockerfile 中看到了错字。我们来看看这一行。
COPY --chown=solr:solr ./services-core/search/A12Core /A12Core/
COPY
命令检查容器中的目标路径是否存在。如果没有,它会在复制之前创建它。
- 从
./services-core/search
中取出A12Core
。 - 然后检查路径
/A12Core
是否存在。 - 显然,事实并非如此。因此,该命令使用
root:root
. 权限创建它
- 最后,它将
A12Core
的内容复制到新创建的A12Core
。
最后你拥有 /A12Core
中的所有内容,但它属于 root
,你无法访问它。
由于 solr
docker 图片已经设置 USER solr
,接下来的方法是
RUN mkdir /A12Core
COPY ./services-core/search/A12Core /A12Core
The
USER
instruction sets the user name ... the user group ... for anyRUN
,CMD
andENTRYPOINT
instructions that follow it in theDockerfile
.
您的目录没有执行权限:
drw-r--r-- 3 solr solr 4096 Aug 31 14:21 conf
否则,您无法根据 Linux 文件系统权限 cd 进入目录。您可以使用 chmod 在主机中修复该问题:
chmod +x conf
如果您在 Dockerfile 中执行此命令(使用 RUN
行),它将导致任何修改的文件被复制到新层,因此如果您递归地 运行,它可以使您的图像大小加倍,因此建议尽可能在您的构建主机上修复它。