簡體   English   中英

Docker容器中的用戶和文件權限配置(docker-compose版本3)

[英]User and file permission configuration in Docker containers (docker-compose version 3)

碼頭工人 ,它的容器

“...默認情況下,非常安全;特別是如果您負責將容器內的進程作為非特權用戶(即非root用戶)運行”

結果,我試圖:

  1. 使用能夠正確處理用戶執行的官方圖像
  2. 避免在生產中安裝主機卷,而是使用COPY

當我COPY代碼和配置文件到我的集裝箱量,所有的目錄和文件的創建” ......一個UID和0"的GID(根所有權),如文檔中說明這里

問題:如果文件和目錄由root擁有但是運行進程由非root用戶擁有,如www-data ,是否還存在安全風險? 例如,使用php-fpm

root@7bf71145c18c:/var/www/html# ls -l
total 1220
-rw-rw-r-- 1 root root    5931 May 10 12:28 index.php
drwxrwxr-x 3 root root    4096 May 10 12:28 logs
-rw-rw-r-- 1 root root      28 May 10 12:28 robots.txt

root@7bf71145c18c:/var/www/html# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 14:14 ?        00:00:00 php-fpm: master process (/usr/lo
www-data     5     1  0 14:14 ?        00:00:00 php-fpm: pool www
www-data     6     1  0 14:14 ?        00:00:00 php-fpm: pool www
root         7     0  0 14:19 ?        00:00:00 bash
root        12     7  0 14:19 ?        00:00:00 ps -ef

如果是這樣,我想知道如何(和在哪里)正確chownchmod我的文件。 從我的研究來看,如果你使用的是docker-compose,這似乎不太直白,我就是這樣 - 我正在使用docker-compose YAML文件(版本3)和特定於容器的Dockerfiles。 看來,當我chown在容器的Dockerfile結束,所做的更改不會生效-可能是因為體積(這是在泊塢窗,compose.yml定義)是繼創建。 以下是兩種配置的一些片段:

泊塢窗,compose.yml:

version: '3'
services:
  fpm:
    build: ./fpm
    container_name: "fpm"
    volumes:
      - data_volume:/var/www/html
    ports:
      - "9000"
    restart: always
volumes:
  data_volume:

./fpm Dockerfile:

FROM php:7-fpm
RUN mkdir -p /var/www/html/
COPY . /var/www/html/
RUN find /var -exec chown www-data:www-data {} \;
RUN find /var -type d -exec chmod 755 {} \;
RUN find /var -type f -exec chmod 644 {} \;

使用不同的docker-compose版本,很難對圍繞此主題的各種Web文章,錯誤修復和功能請求進行排序。 我希望在這里獲得一些明確的方向/答案,面向docker-compose第3版。

問題:如果文件和目錄由root擁有但是運行進程由非root用戶擁有,如www-data,是否還存在安全風險?

並不是的。 您可能只需要確保php-fpm具有對這些文件的讀取權限。

您正在將/var/www/html的內容復制到映像中,並在構建時設置所有權/權限(Dockerfile)。 還行吧。 這是創建圖像的常用用例。

但是,你的docker-compose.yml坐騎data_volume到正在運行的容器,替換/var/www/html從圖像。 因此,無論您在該目錄中擁有什么,都將被隱藏。 您將看到已安裝卷的內容。

您可能希望選擇持久化容器數據所需的策略。 在構建時/var/www/html在大多數情況下可能都可以。 但是,如果您的應用程序將數據寫入該目錄中的某個位置,那么您可以考慮更改該路徑。 當容器被銷毀時,寫入outisde已安裝卷的任何數據都將丟失。 因此,請確保yoru app寫入從docker-compose.yml作為卷掛載的目錄。

docker中的命名卷初始化為其掛載點處圖像的內容。 之后,除非卷完全為空,否則永遠不會再次運行該初始化步驟以避免數據丟失。

因此,當您第一次創建指向/var/www/html data_volume時,它獲得了該目錄的副本,包括文件權限。 但除非您刪除或清空data_volume ,否則您對data_volume任何更改都只會更新映像,而卷將使用卷的內容覆蓋該目錄。

如果您不需要data_volume的內容,可以使用data_volume docker-compose down -v來刪除容器卷。 然后,當您再次運行docker-compose up -d時,將使用具有新權限的文件創建卷。

如果確實需要保留data_volume的內容,則可以裝入卷並在卷本身上運行命令:

docker run -it --rm -v $(basename $(pwd))_data_volume:/var/www/html busybox

以上假設您與docker-compose.yml位於同一文件夾中,並且該目錄均為小寫字符。 否則,將$(basename $(pwd))_data_volume替換$(basename $(pwd))_data_volume docker volume ls顯示的卷名。 從上面的容器中,您可以運行find命令來更新所有權和權限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM