如果在 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命令检查容器中的目标路径是否存在。如果没有,它会在复制之前创建它。

  1. ./services-core/search 中取出 A12Core
  2. 然后检查路径 /A12Core 是否存在。
  3. 显然,事实并非如此。因此,该命令使用 root:root.
  4. 权限创建它
  5. 最后,它将A12Core的内容复制到新创建的A12Core

最后你拥有 /A12Core 中的所有内容,但它属于 root,你无法访问它。

由于 solr docker 图片已经设置 USER solr,接下来的方法是

RUN mkdir /A12Core
COPY ./services-core/search/A12Core /A12Core

作为the docs say

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 行),它将导致任何修改的文件被复制到新层,因此如果您递归地 运行,它可以使您的图像大小加倍,因此建议尽可能在您的构建主机上修复它。