Docker에서 chmod가 올바르게 작동하지 않습니다 freetds-common freetds-bin unixodbc \ && docker-php-ext-install intl

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를 실행하면 아파치 권한 문제가 사라지고 앱이 잘 작동합니다.

그 상황

dockerfile에서 chmod 명령 실행 : 권한이 변경되었지만 Apache는 여전히 권한 거부에 대해 불평합니다.
컨테이너 내에서 bash를 사용하여 chmod와 동일한 명령 실행 : 권한이 변경되고 내 앱이 실행 중

어떤 아이디어, 내가 뭔가를 놓치고 있습니까, 어쩌면 Dockerfile 어딘가에 루트 사용자를 추가해야합니까?



답변

나는 같은 문제가 있었고 디렉토리 내용이 한 계층에서 생성되고 권한이 다른 계층에서 변경되면 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 문제를 만들었습니다 .


답변

Docker에서 RUN의 기본 쉘은 / 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

답변

추가해보십시오 :

USER root

그것은 나를 위해 일했다.


답변

이 문제는 VOLUME업스트림 Dockerfile 내부의 정의로 인해 발생했을 수 있습니다 . Dockerfile에 볼륨이 정의되어 있으면 COPY또는 ADD명령을 사용하여 이미지를 직접 파일에 추가 할 수 있습니다 . 그러나 한 RUN줄은 다음과 같습니다.

  • dockerfile의 현재 지점에서 이미지 정의를 사용하여 임시 컨테이너를 만듭니다.
    • 임시 컨테이너에는 익명 볼륨이 사용자 또는 Dockerfile 내에 지정된 상위 이미지로 마운트됩니다.
    • 익명의 볼륨은 이미지의 내용에서 초기화됩니다
  • 컨테이너 내에서 명령이 실행됩니다.
    • RUN명령 중에 디렉토리를 나열하면 변경 사항이 적용되었지만 해당 변경 사항이 볼륨에 적용되었음을 볼 수 있습니다
  • 실행 명령이 완료되면 docker는 컨테이너의 변경 사항을 캡처합니다
    • docker diff임시 컨테이너를 삭제하지 않은 경우 이러한 변경 사항을 볼 수 있습니다 (빌드를 실행하여 컨테이너를 --rm=false그대로 둘 수 있음).
    • 이러한 변경 사항은 익명 볼륨 컨텐츠가 임시 컨테이너 파일 시스템 내에 존재하지 않으므로 볼륨이 분리되므로 포함되지 않습니다.

이 동작으로 인해 다음과 같은 옵션이 있습니다.

  1. 파일을 다른 디렉토리에 복사하고 권한을 변경할 수 있습니다
  2. 호스트의 권한을 수정하여 해당 권한으로 직접 복사 할 수 있습니다.
  3. 이미지에서 볼륨을 제거하거나, 업스트림 이미지를 가져 와서 볼륨 정의를 제거하거나, 볼륨 정의없이 업스트림 이미지의 사본을 재구성하고 이미지를 기반으로 만들 수 있습니다

현재 PHP 이미지 내에서 볼륨이 제거 된 것처럼 보이므로 옵션 3을 효과적으로 사용할 수 있습니다.


답변

방금 다음을 실험했습니다.

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볼륨에서 작성되며 작성 볼륨 마운트시 상속됩니다.