這是我的 Dockerfile。
FROM python:3.8.12-slim-bullseye as prod-env
RUN apt-get update && apt-get install unzip vim -y
COPY requirements.txt /app
RUN pip install -r requirements.txt
USER nobody:nogroup
這就是docker-compose.yml 的樣子。
api_server:
build:
context: .
target: prod-env
image: company/server
volumes:
- ./shared/model_server/models:/models
- ./static/images:/images
ports:
- 8200:8200
command: gunicorn -b 0.0.0.0:8200 --threads "8" --log-level info --reload "server:gunicorn_app(command='start', project='app_server')"
我想在共享目錄上添加讀取、寫入和執行權限。
并且還需要以 root 身份運行其他幾個命令。
因此,每次構建映像后,我都必須使用 root 執行此命令。
docker exec -it -u root api_server_1 bash -c "python copy_stuffs.py; chmod -R a rwx models; chmod -R a rwx /images"
現在,我希望docker-compose執行這些行。
但是正如您所看到的,docker -compose中的用戶必須nobody是Dockerfile指定的用戶。那么如何在 docker-compose 檔案中執行 root 命令呢?
我一直在想的選項:從 Dockerfile安裝sudo命令并使用sudo
有沒有更好的辦法?
uj5u.com熱心網友回復:
在docker-compose.yml使用相同的影像和卷??創建另一個服務。
使用user: root:root, command: your_command_to_run_as_root,覆寫此新服務的用戶并添加依賴項以在啟動常規作業容器之前運行此新服務。
api_server:
build:
context: .
target: prod-env
image: company/server
volumes:
- ./shared/model_server/models:/models
- ./static/images:/images
ports:
- 8200:8200
command: gunicorn -b 0.0.0.0:8200 --threads "8" --log-level info --reload "server:gunicorn_app(command='start', project='app_server')"
# This make sure that startup order is correct and api_server_decorator service is starting first
depends_on:
- api_server_decorator
api_server_decorator:
build:
context: .
target: prod-env
image: company/server
volumes:
- ./shared/model_server/models:/models
- ./static/images:/images
# No ports needed - it is only decorator
# Overriding USER with root:root
user: "root:root"
# Overriding command
command: python copy_stuffs.py; chmod -R a rwx models; chmod -R a rwx /images
還有其他可能性,例如通過洗掉 USER 限制來更改 Dockerfile,然后您可以使用入口點腳本以 root 身份執行您想要的特權用戶并運行su - nobody或更好exec gosu地保留 PID=1 和正確的信號處理。
uj5u.com熱心網友回復:
在我看來,賦予容器根權限的方法非常危險。例如,如果您想洗掉容器寫入的檔案,您還需要主機上的 root 權限。如果您想允許容器訪問主機檔案系統上的檔案,只需使用適當的用戶運行容器即可。
api_server:
user: my_docker_user:my_docker_group
然后讓主機擁有該組的權利
sudo chown -R my_docker_user:my_docker_group models
uj5u.com熱心網友回復:
您應該將所有需要的內容構建到鏡像本身中,特別是如果您有這種用例,偶爾需要運行一個行程來更新它(您不是在嘗試使用像 Docker 這樣的隔離工具來模擬本地開發環境) . 在你的 Dockerfile 中,將COPY這些目錄放入鏡像
COPY shared/model_server/models /models
COPY static/images /images
不要使這些目錄可寫,也不要使目錄中的單個檔案可執行。目錄通常是模式 0755 和檔案模式 0644,由 root 擁有,這很好。
在 Compose 設定中,也不要將主機內容掛載到這些目錄上。你應該有:
services:
api_server:
build: . # use the same image in all environments
image: company/server
ports:
- 8200:8200
# no volumes:, do not override the image's command:
現在,當您想要更新檔案時,您可以重建映像(無需中斷正在運行的應用程式,無需docker exec,也無需備用用戶)
docker-compose build api_server
然后做一個相對快速的重啟,在更新的鏡像上運行一個新的容器
docker-compose up -d
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/361829.html
標籤:码头工人 docker-compose 文件
