chmod không hoạt động chính xác trong Docker


18

Tôi đang xây dựng hình ảnh Docker cho Symfonyứng dụng của mình và tôi cần cấp phép cho máy chủ apache để ghi vào thư mục bộ đệm và nhật ký

#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

Khi tôi xây dựng hình ảnh này với docker build -t myname/symfony_apps:latest .và chạy container với docker run -p 8080:80 myname/symfony_apps:latest. Nhật ký Apache bị ngập bởi lỗi từ chối cấp phép, điều lạ mà tôi đã kiểm tra ls -avà quyền là ổn. và khi tôi chạy chmod từ bash của người dùng, các vấn đề về quyền apache không còn nữa và ứng dụng hoạt động tốt

Tình huống

Chạy các lệnh chmod từ dockerfile: quyền được thay đổi nhưng apache vẫn phàn nàn về quyền bị từ chối. Chạy các lệnh tương tự chmod với bash bên trong container: quyền được thay đổi và ứng dụng của tôi đang chạy

Bất cứ ý tưởng nào, tôi có thiếu thứ gì không, có lẽ tôi nên thêm người dùng root ở đâu đó trong Dockerfile?


Sẽ rất hữu ích khi thấy lệnh docker của bạn chạy hình ảnh được xây dựng.
Mike

Tôi đang thấy một khoảng trống trong lệnh cuối cùng của bạn (Tôi đang ở trên điện thoại của mình, vì vậy tôi không thể chắc chắn). Vì vấn đề cấp phép dường như xảy ra với thư mục nhật ký, hãy thay đổi dòng cuối cùng thành: `` `RUN chmod -R 777 / var / www / html / app / cache / var / www / html / app / log` ``
Mike

1
Được rồi .. Tôi đã chỉnh sửa câu hỏi :)
cơn bão

không gian thừa đó là một lỗi đánh máy
cơn bão

Tôi không thể tái tạo vấn đề của bạn. Nếu tôi sử dụng dockerfile của bạn và thiết lập một số tệp giả cục bộ, quyền là chính xác và mọi thứ chỉ hoạt động. Tôi có thể khởi động một container và truy cập nội dung thông qua trình duyệt web. Bạn có thể cập nhật câu hỏi của bạn để bao gồm các thông báo lỗi cụ thể? Bạn có chắc chắn cấu hình Apache ( apache2.conf) của bạn không gây ra sự cố không? Các lỗi sẽ biến mất nếu bạn không cài đặt apache2.conf?
larsks

Câu trả lời:


15

Tôi đã có cùng một vấn đề và dường như có một số lỗi trong docker hoặc overlay2 nếu nội dung thư mục được tạo trong một lớp và quyền của nó bị thay đổi trong lớp khác.

Như một giải pháp thay thế, bạn có thể sao chép nguồn vào thư mục tạm thời:

COPY . /src

Và sau đó di chuyển nó đến /var/www/htmlvà thiết lập quyền (trong một RUNlệnh):

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

Ngoài ra tôi đã tạo ra vấn đề GitHub .


Tôi sẽ đào sâu vào mã nguồn cũ của mình vào tối nay để xem tôi đã giải quyết vấn đề này như thế nào, sau đó tôi nhớ rằng thủ thuật thư mục tmp .. hy vọng điều này không làm bạn mất nhiều thời gian để giải quyết XD
cơn bão

7

Shell mặc định của RUN trong Docker là / bin / sh và đây là nơi các quyền không được đặt chính xác thực sự có vấn đề.

Nhưng bạn có thể thay đổi thành chỉ sử dụng / bin / bash để dễ dàng sửa chữa, thông báo trước và sau khi liệt kê thư mục

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
Tại sao là /bin/bash -c 'chmod +x file'làm việc và không /bin/sh -c 'chmod +x file'?
bão

giải pháp của bạn tốt hơn nó làm việc cho tôi cảm ơn .
user1427944

Ngoài ra, sử dụng bộ công cụ mới sẽ giúp ích trong một số lĩnh vực bao gồm cả khu vực này. Hãy thử một lần. docs.docker.com/develop/develop-images/build_enhancements
Thad Guidry

5

Hãy thử thêm:

USER root

Nó làm việc cho tôi.


Đây phải là câu trả lời được chấp nhận.
Vladimir Kornea

2
Nếu bạn chuyển sang root, có lẽ bạn nên chuyển trở lại người dùng trước khi bạn hoàn thành hoặc bạn đang giảm tính bảo mật và khả năng tương thích của container. Một số triển khai Kubernetes theo mặc định sẽ không chạy một container như root.
flickerfly

2

Vấn đề này có thể là kết quả của một VOLUMEđịnh nghĩa bên trong Dockerfile ngược dòng. Khi một ổ đĩa được xác định trong Dockerfile, bạn có thể thêm các tệp bằng lệnh a COPYhoặc ADDtrực tiếp vào hình ảnh. Tuy nhiên, một RUNdòng sẽ:

  • Tạo một bộ chứa tạm thời bằng cách sử dụng định nghĩa hình ảnh như điểm hiện tại của dockerfile
    • Container tạm thời đó sẽ có một khối lượng ẩn danh được gắn kết khi bạn hoặc hình ảnh cha được chỉ định bên trong Dockerfile
    • Âm lượng ẩn danh sẽ được khởi tạo từ nội dung của hình ảnh
  • Lệnh của bạn sẽ chạy bên trong container
    • Nếu bạn liệt kê thư mục trong RUNlệnh này , bạn sẽ thấy các thay đổi của mình được áp dụng, nhưng những thay đổi đó đã được áp dụng cho ổ đĩa
  • Khi lệnh chạy của bạn hoàn thành, docker sẽ nắm bắt các thay đổi đối với vùng chứa
    • Những thay đổi này có thể được nhìn thấy docker diffnếu bạn không xóa các thùng chứa tạm thời (bạn có thể chạy bản dựng --rm=falseđể duy trì chúng)
    • Những thay đổi này sẽ không bao gồm nội dung khối lượng ẩn danh vì chúng không tồn tại bên trong hệ thống tệp chứa tạm thời, các khối lượng riêng biệt

Vì hành vi này, bạn có các tùy chọn để:

  1. bạn có thể sao chép các tập tin của mình vào một thư mục khác và thay đổi các quyền ở đó
  2. bạn có thể sửa các quyền trên máy chủ của mình để chúng được sao chép trực tiếp với các quyền đó
  3. bạn có thể xóa âm lượng khỏi hình ảnh của mình, lấy hình ảnh ngược dòng để xóa định nghĩa âm lượng của chúng hoặc bạn có thể xây dựng lại bản sao của hình ảnh ngược dòng mà không cần định nghĩa âm lượng và loại bỏ hình ảnh của bạn khỏi đó

Lưu ý rằng bên trong các hình ảnh php hiện tại, có vẻ như âm lượng đã bị xóa, điều đó có nghĩa là chúng tôi thực sự có tùy chọn 3.


0

Tôi vừa thực hiện một thí nghiệm với những điều sau đây:

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

Và nó chỉ hoạt động tuyệt vời.

Tuy nhiên

Khi tôi ghi đè tập tin thực thi đó thông qua các tập hợp soạn thảo docker, executequyền đó chỉ đơn giản giống như cuộn lại - về mặt kỹ thuật áp đảo cho quyền tập tin gốc.

Việc sửa lỗi cho chế độ dev chỉ đơn giản là chmod a+x yourfiletừ máy chủ lưu trữ, điều này sẽ được kế thừa khi soạn phần lắp âm lượng.


1
Toàn bộ mục tiêu của âm lượng là gắn các tệp từ một nơi khác ngoài hình ảnh, vì vậy nếu bạn sửa hình ảnh của mình và gắn âm lượng lên trên đó, theo thiết kế, bạn sẽ không thấy hình ảnh của mình thay đổi. Tùy thuộc vào lý do tại sao bạn có âm lượng, câu trả lời có thể đơn giản là không có âm lượng.
BMitch

BMitch , tôi hoàn toàn đồng ý về tác động của việc tăng âm lượng ghi đè fs container từ hình ảnh dựng docker, nhưng ... Trong quá trình phát triển, bạn chắc chắn không muốn xây dựng lại / khởi động lại container của mình để kiểm tra từng thay đổi của bạn làm Trong kịch bản thứ hai này, bạn có muốn gắn kết một khối lượng ghi đè fs hình ảnh được xây dựng docker. Và tôi đã đối mặt với vấn đề tương tự trước khi hạ cánh ở đây. Tôi đã không bị kết án bởi một trong hai câu trả lời giải thích và kiểm tra từng câu hỏi. Chỉ sau đó tôi mới hiểu chuyện gì đang xảy ra và đăng những quan sát của mình ...
Salathiel Genèse

... Và tôi nghi ngờ kịch bản tôi trải qua cũng giống như kịch bản của người hỏi câu hỏi.
Salathiel Genèse

OP chỉ ra rằng họ đã thấy vấn đề chỉ bằng một docker runlệnh và không có khối lượng gắn ngoài.
BMitch

Oups - Tôi đã bỏ qua khía cạnh đó ... Câu trả lời đúng cho tiêu đề câu hỏi đúng, nhưng không phải là kịch bản được mô tả. Sau đó tôi có thể đề cập rằng tôi không thể tái tạo vấn đề được đề cập ở trên.
Salathiel Genèse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.