Docker에서 chmod가 올바르게 작동하지 않습니다


19

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 명령을 보는 것이 도움이됩니다.
Mike

마지막 명령에 여분의 공간이 보입니다 (전화를 받고 있으므로 확실하지 않습니다). 권한 문제는 로그 디렉토리와 것 같다 때, 마지막 라인 변경 :```RUN을 chmod를 -R 777의 / var / www / html / 응용 프로그램 / 캐시의 / var / www / html / 응용 프로그램 / 로그```
Mike

1
좋아 .. 나는 질문을 편집했다 :)
storm

여분의 공간은 오타였습니다.
폭풍

문제를 재현 할 수 없습니다. 도커 파일을 사용하고 일부 더미 파일을 로컬로 설정하면 권한이 정확하고 모든 것이 제대로 작동합니다. 컨테이너를 부팅하고 웹 브라우저를 통해 컨텐츠에 액세스 할 수 있습니다. 특정 오류 메시지를 포함하도록 질문을 업데이트 할 수 있습니까? Apache 구성 ( apache2.conf)으로 인해 문제가 발생하지 않았습니까? 설치하지 않으면 오류가 사라 apache2.conf집니까?
Larsks

답변:


15

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


오늘 밤에이 문제를 어떻게 해결했는지보기 위해 예전 소스 코드를 파헤 치려고했는데 tmp 디렉토리 트릭을 기억했습니다. XD를 해결하는 데 많은 시간이 걸리지 않았기를 바랍니다.
Storm

7

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

2
/bin/bash -c 'chmod +x file'작동하지 /bin/sh -c 'chmod +x file'않습니까?
스톰

당신은 더 나은 솔루션입니다. 그것은 나를 위해 일했다. 감사 .
user1427944

또한 새 빌드 킷을 사용하면이를 포함하여 여러 영역에서 도움이됩니다. 시도 해봐. docs.docker.com/develop/develop-images/build_enhancements
Thad Guidry

6

추가해보십시오 :

USER root

그것은 나를 위해 일했다.


이것이 정답입니다.
블라디미르 Kornea 19

2
루트로 전환하면 작업을 마치거나 컨테이너의 보안 및 호환성을 감소시킬 때 이전 사용자로 다시 전환해야합니다. 기본적으로 일부 Kubernetes 구현은 컨테이너를 루트로 실행하지 않습니다.
flickerfly

2

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

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

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

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

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


0

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

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
볼륨의 전체 목표는 이미지가 아닌 다른 곳에서 파일을 마운트하는 것이므로 이미지를 수정하고 그 위에 볼륨을 마운트하면 의도적으로 이미지가 변경되지 않습니다. 볼륨이있는 이유에 따라 대답은 단순히 볼륨이없는 것일 수 있습니다.
BMitch

BMitch , 도커 빌드 이미지에서 컨테이너 fs를 대체하는 마운트 볼륨의 효과에 대해 전적으로 동의하지만 개발 중에는 모든 변경 사항을 테스트하기 위해 컨테이너를 다시 빌드하거나 다시 시작하고 싶지 않습니다. 하다. 이 후자의 시나리오에서는 docker built image fs를 대체하는 볼륨을 마운트하려고합니다. 그리고 여기에 착륙하기 전에 같은 문제에 직면했습니다. 나는 대답 설명으로 유죄 판결을받지 못했고 각각을 테스트했습니다. 그때가 무슨 일인지 이해하고 내 의견을 게시했습니다 ...
Salathiel Genèse

... 내가 경험 한 시나리오가 질문을 한 사람의 시나리오와 같다고 생각합니다.
Salathiel Genèse

OP는 docker run명령 만으로 외부 볼륨을 마운트하지 않아도 문제가 발생했음을 표시했습니다 .
BMitch

웁스-나는 그 측면을 놓쳤다 ... 올바른 질문 제목에 대한 정답이지만 설명 된 시나리오는 아닙니다. 그런 다음 위에서 언급 한 문제를 재현 할 수 없다고 언급 할 수 있습니다.
Salathiel Genèse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.