AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 772227
Accepted
storm
storm
Asked: 2016-04-23 05:09:26 +0800 CST2016-04-23 05:09:26 +0800 CST 2016-04-23 05:09:26 +0800 CST

chmod 在 Docker 中无法正常工作

  • 772

我正在为我的Symfony应用程序构建 Docker 映像,我需要授予 apache 服务器写入缓存和日志文件夹的权限

#Dockerfile
FROM php:7-apache

RUN apt-get update \
&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite

COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html

RUN find /var/www/html/ -type d -exec chmod 755 {} \; 
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

当我使用构建此映像docker build -t myname/symfony_apps:latest .并使用docker run -p 8080:80 myname/symfony_apps:latest. Apache 日志被权限拒绝错误淹没,我检查过的奇怪的事情ls -a和权限都很好。当我从容器的 bash 运行 chmod 时,apache 权限问题消失了,应用程序运行良好

情况

从 dockerfile 运行 chmod 命令:权限已更改,但 apache 仍然抱怨权限被拒绝。 在容器内使用 bash 运行 chmod 相同的命令:权限已更改,我的应用程序正在运行

任何想法,我是否遗漏了什么,也许我应该在 Dockerfile 的某个地方添加 root 用户?

permissions chmod docker
  • 5 5 个回答
  • 142796 Views

5 个回答

  • Voted
  1. Best Answer
    mixel
    2017-01-06T14:16:38+08:002017-01-06T14:16:38+08:00

    我遇到了同样的问题,如果在一层中创建目录内容并且在另一层中更改了它的权限,那么在 docker 或 overlay2 中似乎存在一些错误。

    作为一种解决方法,您可以将源复制到临时目录:

    COPY . /src
    

    然后将其移至/var/www/html并设置权限(在一个RUN命令中):

    RUN rm -rf /var/www/html && mv /src /var/www/html &&\
        find /var/www/html/ -type d -exec chmod 755 {} \; &&\
        find /var/www/html/ -type f -exec chmod 644 {} \; &&\
        chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs
    

    我还创建了GitHub 问题。

    • 24
  2. secavfr
    2019-03-28T14:49:15+08:002019-03-28T14:49:15+08:00

    尝试添加:

    USER root
    

    它对我有用。

    • 14
  3. Thad Guidry
    2018-03-09T10:07:15+08:002018-03-09T10:07:15+08:00

    Docker 中 RUN 的默认 shell 是 /bin/sh ,这就是权限设置不正确实际上有问题的地方。

    但是您可以更改为只使用 /bin/bash 来轻松修复,注意目录列表之前和之后

    Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'
    ---> Running in dc57ae77aa67
    
    drwxr-xr-x. 3 root root      103 Mar  8 17:56 .
    drwxr-xr-x. 1 root root       46 Mar  8 17:57 ..
    drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
    -rw-r--r--. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
    -rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar
    
    drwxr-xr-x. 1 root root       42 Mar  8 17:56 .
    drwxr-xr-x. 1 root root       61 Mar  8 17:57 ..
    drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
    -rwxr-xr-x. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
    -rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar
    ---> 8b5de6e348d3
    
    • 10
  4. BMitch
    2018-11-20T06:10:45+08:002018-11-20T06:10:45+08:00

    这个问题很可能是VOLUME上游 Dockerfile 中定义的结果。在 Dockerfile 中定义卷后,您可以使用COPYorADD命令直接将文件添加到映像中。但是,RUN一行将:

    • 使用从 dockerfile 的当前点开始的图像定义创建一个临时容器
      • 该临时容器将安装一个匿名卷作为您或在 Dockerfile 中指定的父映像
      • 匿名卷将从图像的内容初始化
    • 您的命令将在容器内运行
      • 如果您在此RUN命令期间列出目录,您将看到您的更改已应用,但这些更改已应用于卷
    • 当您的运行命令完成时,docker 将捕获对容器的更改
      • docker diff如果您不删除临时容器,则可以通过 a 看到这些更改(您可以运行构建以--rm=false保留它们)
      • 这些更改将不包括匿名卷内容,因为它们不存在于临时容器文件系统中,卷是独立的

    由于这种行为,您可以选择:

    1. 您可以将文件复制到其他目录并更改那里的权限
    2. 您可以修复主机上的权限,以便直接使用这些权限复制它们
    3. 您可以从映像中删除卷,获取上游映像以删除其卷定义,或者您可以在没有卷定义的情况下重建您自己的上游映像副本,并以此为基础创建映像

    请注意,在当前的 php 图像中,该卷似乎已被删除,这意味着我们实际上有选项 3。

    • 7
  5. Salathiel Genèse
    2018-11-20T03:24:59+08:002018-11-20T03:24:59+08:00

    我刚刚做了以下实验:

    FROM alpine
    
    LABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"
    RUN apk add --no-cache inotify-tools
    CMD [ "./script.sh" ]
    WORKDIR /opt/app/
    COPY src/ /opt/app/
    RUN chmod a+x *.sh
    

    而且效果很好。

    然而

    当我通过 docker-compose 卷覆盖该可执行文件时,该execute权限就像回滚一样 - 从技术上讲覆盖了原始文件权限。

    开发模式的修复只是chmod a+x yourfile从主机,它将在组合卷安装时继承。

    • 1

相关问题

  • 如何在 Exchange 2007 中设置资源邮箱日历的忙/闲权限?

  • 共享文件夹中某些文件的访问被拒绝错误

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • 如何授予用户安装 Windows 服务的能力?

  • 限制用户向电子邮件地址发送电子邮件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve