django - 使用 exec (shell) 运行 Docker 后以非 root 身份运行命令
问题描述
我有一个使用 Docker(在 Ubuntu 中)和 MySQL 作为数据库的 Django 项目,一切正常。我只是好奇:
而不是像这样运行长命令:
docker-compose run backend python manage.py startapp myapp
# 'backend' is the name of service in docker-compose file
我喜欢像这样打开外壳:
docker-compose run backend sh
然后运行我的命令:
python manage.py startapp myapp
但在这种情况下,它将由 root 创建,所以我不能从外部修改/保存,(需要权限)
我解决了这个问题:
sudo chown -R $USER:$USER .
但是我很好奇是否还有其他方法,以便我可以以非 root 身份运行 exec 并从内部修改我的文件,而不是每次都更改所有者。
码头工人撰写:
version: '3.9'
services:
backend:
build: .
volumes:
- .:/backend
ports:
- 8000:8000
depends_on:
- db
db:
image: mysql:latest
environment:
MYSQL_DATABASE: 'pass'
MYSQL_ROOT_PASSWORD: 'pass'
volumes:
- ./data/mysql/db:/var/lib/mysql
Dockerfile:
FROM python:3.9
ENV PYTHONUNBUFFERED 1
WORKDIR /backend
COPY requirements.txt backend/requirements.txt
RUN pip install -r backend/requirements.txt
COPY . /backend
CMD python manage.py runserver 0.0.0.0:8000
解决方案
我找到了答案,只需在 dockerfile (后端目录)末尾使用这些行在 docker 文件中添加一个用户:
RUN adduser myuser
USER myuser
如果使用 Django rest 框架和 React,请在 dockerfile(前端目录)的 enf 中添加这一行
USER node
我发现,所有的官方 Node.js 镜像都在上游镜像中添加了一个 Linux 用户,称为 node。
现在可以在没有权限限制的情况下从外部或内部修改同一个文件
推荐阅读
- amazon-web-services - 尝试写入 SNS 时 Lambda 超时,如何在 Terraform 中解决此问题?
- tableau-api - 如何将相同的筛选器添加到 Tableau Server 中的多个数据源?
- c++ - 显示存储在文件中的所有数据显示额外数据,在 C++ 文件处理中使用循环
- android - 获取 EditText 最大文本区域
- .net - 在拖放系统的图片框和标签之间建立链接
- c++ - 在加载的 PowerPC 上使用 LibUnwind 引发 C++ 异常会设置随机浮点异常陷阱
- c# - 匿名托管的 DynamicMethods 程序集:无法将类型“string”隐式转换为“int”
- python - 从下到上减少 lambda 打印
- node.js - 无法使用 Dockerfile 安装 Nodejs
- flutter - 颤动:BLoC Builder 未更新,尽管我在调试器中看到新的/不同的状态