【问题标题】:Docker compose mapping local directory to dockerfile volumeDocker 撰写将本地目录映射到 dockerfile 卷
【发布时间】:2018-12-06 10:57:34
【问题描述】:

我正在使用 Apache / MySql Docker-compose 设置,这一切都很好。然而问题来了,因为这是用于本地开发,Web 容器指向一个本地文件夹,我需要 Apache 拥有该文件夹的权限。

使用

RUN mkdir /www \
&& chown -R apache:apache /www

VOLUME ["/www"]

如果我自己运行 Apache dockerfile 或者如果我在 docker-compose 中运行它而不指定卷,则很好。但这意味着我不能将该卷指向本地目录,在这种情况下,“www”存在于容器内,但不映射到主机。如果我在 docker-compose 文件中指定一个卷,那么它会按预期映射,但不允许我 CHOWN 文件夹/文件(即使我执行到容器中)

以下是概念证明,我在 Windows 10 / Docker Desktop Community Version 2.0.0.0-win81 (29211) 上运行

编辑(评论暴露端口,从 docker-compose 构建 dockerfile 并将端口从 81 更改为 80)

编辑(我已经更新了以下文件,见底部,我将这些留给后代)

docker-compose.yml

version: '3.2'
services:
  web:
    restart: always
    build:
      context: .
    ports:
      - 80:80
    volumes: 
    - ./:/www

Dockerfile

FROM centos:centos6 as stage1

RUN yum -y update && yum clean all \
    && yum --setopt=tsflags=nodocs install -y yum-utils \
    httpd \
    php

FROM stage1 as stage2
RUN mkdir /www \
    && chown -R apache:apache /www 

#VOLUME ["/www"]

#EXPOSE 80
ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]

更新的概念证明文件

Docker-compose.yml

version: '3.2'
services:
  web:
    build:
      context: .
    ports:
      - 80:80
    volumes: 
    - ./:/www

Dockerfile

FROM centos:centos6

RUN yum -y update && yum clean all \
    && yum --setopt=tsflags=nodocs install -y yum-utils \
    httpd \
    php

COPY ./entrypoint.sh /

ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

#!/bin/bash
set -e #exit straight away if there's an issue

chown -R apache:apache /www

# Apache
/usr/sbin/httpd -D FOREGROUND

【问题讨论】:

  • 为什么要定义两次 www 卷?
  • 另外 mkdir www 没有任何意义,因为那是一个卷,所以它只会被覆盖。您想要对卷目录进行的任何更改都应该在 docker-compose 完成卷之后从入口点完成
  • 您还将端口 80 暴露到 80 并映射 81:80,这令人困惑,我猜您不想这样做,这是一个错误。如果您确实想这样做,尽管您应该同时从 compose.yml 文件中进行,而不是从 yml 中进行一项,在 dockerfile 中进行一项
  • 另一件事,您在 yml 文件中定义了一个图像而不是构建,这至少可以说是奇怪的。您是从 docker 文件构建图像,然后使用 docker-compose 来处理该图像吗?对不起所有的cmets,我一直看到奇怪的东西
  • @GeorgeAppleton www 在构建文件中定义,因此我在 Apache 容器中的某个位置知道其名称。 81:80 只是一个本地配置更改(我在主机上的端口 80 上运行了一些东西)我想我应该更清楚地证明概念我将 dockerfile 构建为“poc”然后我将其用作图像码头工人撰写文件

标签: docker docker-compose dockerfile


【解决方案1】:

你正在使用

RUN mkdir /www \ && chown -R apache:apache /www

在 docker-compose 之前将本地 . 目录映射到 www

您需要创建一个文件 entrypoint.sh 或类似文件。给它一个shbang。在里面你应该运行chown -R apache:apache /www。您不需要 mkdir,因为它是由 docker compose volume config ./:/www 创建的。

在您的 entrypoint.sh 文件中的该命令之后,您应该添加您当前拥有的入口点 /usr/sbin/httpd -D FOREGROUND

那么最后你当然需要设置你的新入口点来使用entrypoint.sh文件ENTRYPOINT ["/entrypoint.sh"]

【讨论】:

  • 谢谢,这是有道理的,只需在将其标记为答案之前检查它即可解决问题
  • 试过 COPY ./entrypoint.sh / ENTRYPOINT ["/entrypoint.sh"] 和入口点为 #!/bin/bash set -e #exit straight away if there's an issue chown -R apache:apache /www /usr/sbin/httpd -D FOREGROUND 但是当我在 ls -l 中执行时仍然显示 www 为 root 拥有
  • 使用docker logs 命令检查您的chown 函数是否正常工作。还可以尝试从 exec bash cli 运行 entrypoint.sh 命令或从那里运行 chown 以查看是否可以调试问题。我假设set -e 不会抑制任何错误,我从未使用过它,所以除了我刚刚在手册页上阅读的内容外,我不知道它的用法。另请注意,您确定/www 是正确的目录吗? www 通常不在根 / 中找到。还值得检查 user:group apache:apache 是否存在并且是您的图像使用的。通常是 www-data:www-data。
  • 我以为我说过但我已经/已经尝试过 exec 并且我(之前和现在)得到了相同的结果。 www 只是我真正设置的网络服务器的根(它可以是任何东西,但我有配置文件可以做到这一点)。 cat /etc/passwd 给了我以下 ... apache:x:48:48:Apache:/var/www:/sbin/nologin cat etc/group 给了我 ... apache:x:48: docker logs 什么也没给我(不是字面意思,但它只是显示“httpd:无法可靠地确定服务器的完全限定域名,...”跨度>
  • 那是因为您的 dockerfile 本身不使用映射卷,它只会创建一个常规目录并对其进行 chowned。充分利用 docker-compose 你可以chown其他目录吗?
【解决方案2】:

Docker for Windows 使用 CIFS/Samba 网络文件共享将主机文件绑定到运行 docker 的 Linux VM 中。这总是作为root:root 完成的,因此所有绑定挂载文件/目录在从容器内部看到时总是会显示。这是known limitation of the way docker shares these files between the OS's

解决方法:

  1. 在许多情况下,这不是问题。主机文件共享到世界可读的容器中,因此在容器中运行本地应用程序开发是可以的。对于缓存文件、用户上传等,只需确保将它们写入到不是主机绑定挂载的容器路径中,这样它们就可以留在您可以控制权限的 Linux 中。
  2. 如果需要,仅用于开发,如果应用程序需要写入权限来托管 OS 文件,请以 root 身份在容器中运行该应用程序。您可以在运行时覆盖它:例如docker run -u rootuser:rootdocker-compose.yml
  3. 为了处理数据库文件,不要绑定挂载它们,而是使用命名卷将文件保存在 Linux VM 中。您始终可以使用 docker cp 将文件复制到卷中或从卷中复制出来以进行快速备份。

【讨论】:

  • 谢谢,我认为对于我的特定用例,我将不得不使用 1、3 和或哭泣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2023-02-19
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多