8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

与非 root 用户和 Docker 卷的权限相关的问题

askiiart.net 2月前

97 0

我正在使用 Docker 设置隔离的开发环境。因此,我配置了 dockerfile 来创建非 root 用户。(使用官方 Ubuntu 映像作为基础)我创建了一个用于文件管理的卷...

我正在使用 Docker 设置隔离的开发环境。因此我配置了 dockerfile 来创建非 root 用户。(使用官方 Ubuntu 镜像作为基础)

我创建了一个用于文件管理的卷,但是出现了权限问题。

为此审查了几种解决方案。:

  1. chmod 777 -R volume(这个方法比较笨,但是很有效)
  2. 与主机上的用户匹配相同的PID/GID(我认为这种方法很好用)

我想应用解决方案2,但问题如下。

  1. 主机上的用户是 1000:1000(UID:GID)。
  2. 来宾上的用户是 1001:1001(UID:GID)。
  3. 在客户机中,1000:1000 已被名为 \'ubuntu\' 的用户使用。

但是,为了使用 Docker 而修改外部环境似乎不太可取。因此,我决定不创建 1001:1001 的用户。

名为“ubuntu”的用户是一个已经创建的账户,如下所示。

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:3f85b7caad41a95462cf5b787d8a04604c8262cdcdf9a472b8c52ef83375fe15
Status: Image is up to date for ubuntu:latest
docker.io/library/ubuntu:latest

What's Next?
  1. Sign in to your Docker account → docker login
  2. View a summary of image vulnerabilities and recommendations → docker scout quickview ubuntu

$ docker run --rm ubuntu cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash <-- ??

我想知道的是:

  1. 用户“ubuntu”存在的目的是什么?
  2. 我可以使用“ubuntu”或者用其他账户代替它吗?
  3. 如果 \'ubuntu\' 是用于特殊用途,我想创建一个 GID 来访问卷并使用 umask。如果有更好的解决方案,请分享。

我正在寻找一种灵活、通用且不受外部环境影响的方法来解决这个问题。

帖子版权声明 1、本帖标题:与非 root 用户和 Docker 卷的权限相关的问题
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由askiiart.net在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • (1)在Container中,UID 1000和Host中的UID 1000拥有同样的权限,可以授权UID 1000访问同一个目录。UID 1000的用户名对应的是ubuntu(container)还是demouser(HOST),都无所谓。 (2)如果你只是希望Container对应的volume Folder能够被Host User(UID 1000)直接访问,而Container中又有一个UID 1000的User,那么你可以直接用这个用户账号,不需要做其他的调整。

  • @life888888 我理解如果用户名和uid相同,则不存在权限问题。但是在官方的Ubuntu镜像中,已经存在一个与主机用户具有相同PID的用户,我担心将PID匹配到1000,因为我不知道它存在的目的是什么。

  • 刚刚接触 Unity,想制作一款 3D 迷你视频游戏。我在网上找到了一款可以发射物体的游戏,你能解释一下在 Unity 上让代码运行的步骤吗?{ pu...

    刚接触 Unity,想制作一款 3D 迷你视频游戏。我在网上找到了一款可以发射物体的游戏,你能解释一下在 Unity 上让代码运行的步骤吗?

    {
        public GameObject ball;
        public Transform positionBall;  
    int totalMoney = 0;
    public TMP_Text =moneyText;
    
     
        void Start()
        {
            _gameManager = FindObjectOfType<GameManager>();
        }
    

    理论上这是用来从 Unity 获取游戏对象,我需要连接什么东西吗?

     void Update()
    
        {
     MeshRenderer meshLine= line.GetComponentInChildren<MeshRenderer>();
                meshLine.material.color=Random.ColorHSV(0.27f, 0.41f,1f, 1f, 0.5f, 1f);
    
            if (Input.GetKeyDown(KeyCode.Space))
            {
                GameObject newBall=Instantiate(ball, positionBall.position, positionBall.rotation);
     
                Rigidbody rb= newBall.GetComponent<Rigidbody>(); 
    
    
                rb.AddForce(positionBall.transform.forward*20, ForceMode.Impulse);
    
                Destroy(newBall, 3);              
    }
    

    理论上,这是用来生成球并在 Unity 上射击的,我必须连接什么东西吗?

    for (int i = 0; i < 10; i++)
    
      {
        Vector3 posizione = new Vector3(Random.Range(-10f, 10f), 1, Random.Range(-10f, 10f));
        Instantiate(money, position, Quaternion.identity);
      }
    
        }
       private void OnCollisionEnter(Collision collision)
        {
            if(collision.gameObject.tag=="Player") 
            {
                Destroy(collision.gameObject);   
            }
            Destroy(gameObject);
        }
       public void AddMoney()
        {
            TotalMoney++;
            Debug.Log(totalMoney);
    moneyText.text=totalMoney.ToString()
    }
    }
    
    
    
  • 我正在尝试导入 PySpin 以在 Ubuntu 24.04 系统上使用 FLIR 的相机我已采取的步骤:我已经从 FLIR 网站安装了 Spinnaker 我已经下载了 FLIR 的 Python 库我有

    我正在尝试导入 PySpin 以与 Ubuntu 24.04 系统上的 FLIR 相机配合使用

    我采取的步骤:我从 FLIR 网站安装了 Spinnaker,下载了 FLIR 的 Python 库,安装了正确的 Python 版本(要求为 3.10),3.12 随 24.04 一起安装,安装了最新版本的 FFMPEG,安装了最新版本的 libswscale-dev

    最初尝试运行时 python3.10 -c 'imp或t PySpin' ,我收到各种错误,例如 ImportError:libswscale.so.5 not found or ImportError:libavutil.so.56 not found

    为了修复这个错误,我尝试了

    sudo find /lib -iname libswscale*
    cd /lib/x86_64-linux-gnu
    sudo ln -sv libswscale.so.7 libswscale.so.5 
    

    这些错误已经消失,不确定我做了什么是否修复了它。但是,现在当我尝试运行 PySpin 时,出现了错误:

    ImportError: /lib/x86_64-linux-gnu/libswscale.so.5: version `LIBSWSCALE_5' not found (required by /opt/spinnaker/lib/libSpinVideo.so.4)
    
    

    有人能给我一些解决这个问题的指导吗?我需要下载缺少的软件包吗?我需要将这些库降级到以前的版本才能与 Spinnaker 的要求兼容吗?谢谢!

  • 创建 c# 脚本后,您可以将其拖放到空的游戏对象上(通过在左侧的检查器中单击鼠标右键,然后单击“创建”>“空”来创建)。

    执行此操作后,您应该能够将脚本视为游戏对象上的组件。您还可以在其中找到公共变量,如 ball、positionBall 和 moneyText。

    首先是球变量。它的类型是“游戏对象”。要填充该变量,首先要在编辑器中创建一个球。为此,右键单击检查器,然后单击创建 > 3d > 球体。然后在右侧,您会看到组件选项卡。在那里单击“添加组件”以添加 Rigidbody3D。这对于为您的球启用物理特性至关重要。

    完成后,将对象从检查器拖到底部的文件选项卡中。您已经创建了一个预制件,可以说是一个可重复使用的游戏对象。然后,您可以将其拖到脚本的变量槽中,您可以在放置脚本的对象右侧看到该变量槽。

    positionBall 变量属于 Transform 类型。这意味着位置、旋转和缩放。您可以通过创建另一个空 GameObject(如上所述)来填充它,只需将其拖入变量槽即可。这将是球的“生成点”。

    moneyText 变量的类型为 TMP_Text(text mesh pro,一种高级文本渲染系统或其他)只需单击 create>ui>Text mesh pro text,创建后将其拖入变量槽即可。

    现在您已经分配了所有变量:)

    现在您可以创建其他游戏对象并为它们赋予标签 Player,您可以在编辑器的右上角创建和分配该标签。

    我希望这有帮助 :)

  • @Oliver 是的,最后我恢复到了 Ubuntu 22.04,没有出现任何问题。我猜软件还没有更新以兼容 24.04。如果您需要任何帮助,请告诉我!

  • 当我创建一个小部件时,移动对我来说不起作用,我给它前一个窗口(而不是父窗口)的位置,但它仍然不想接受我在 Ubuntu 上的 Qt 中需要的位置,即使

    当我创建一个小部件时,移动对我来说不起作用,我给它前一个窗口(而不是父窗口)的位置,但它仍然不想接受我在 Ubuntu 上的 Qt 中需要的位置,尽管在 Windows 上一切正常

    代码:

    if(query.next()){ // проверка результата запроса
            QRect currentGeometry = this->geometry();
            QWidget *loggetInWindow = createAccountWindow(userType, currentGeometry);
            if(loggetInWindow){
                loggetInWindow->show();
                loggetInWindow->move(this->x(), this->y());
            }
        }
        else{
            QMessageBox::warning(this, "Ошибка входа", "Неверный логин или пароль.");
        }
    

    我尝试交换 show 和 move(我不知道哪个才是正确的)但什么都没改变

    补充代码,LoginWindow 是程序启动时立即打开的第一个初始窗口,loggetInWindow 这是单击按钮后打开的第二个窗口

        #include "ui_loginwindow.h"
        #include "registrationwindow.h"
        #include "loginwindow.h"
        #include "adminwindow.h"
        #include "clientwindow.h"
        #include "workerwindow.h"
        #include <QPropertyAnimation>
        #include <QtSql/QSqlDatabase> // для подключения к базе данных
        #include <QtSql/QSqlQuery> // для выполения запросов к базе данных
        #include <QMessageBox>
    
        LoginWindow::LoginWindow(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::LoginWindow)
    {
    
        ui->setupUi(this);
    
        QComboBox *comboBox = ui->comboBox;
    
        comboBox->addItem("Клиент");
        comboBox->addItem("Администратор");
        comboBox->addItem("Работник");
    }
    
    LoginWindow::~LoginWindow()
    {
        delete ui;
    }
    
    void LoginWindow::on_pushButton_login_clicked() // кнопка вход
    {
        QString userType = ui->comboBox->currentText();
        QString username = ui->lineEdit_username->text();
        QString password = ui->lineEdit_password->text();
    
        {
            QSqlDatabase db;
            if(QSqlDatabase::contains("loginConnection")){
                db = QSqlDatabase::database("loginConnection");
                if(!db.open()){
                    qDebug() << "Failed open database LoginWindow\n";
                    return;
                }
            }
            else{
                db = QSqlDatabase::addDatabase("QMYSQL", "loginConnection");
                db.setHostName("localhost");
                db.setUserName("zxctatar");
                db.setDatabaseName("zxctatar");
                if(!db.open()){
                    qDebug() << "Failed open database LoginWindow\n";
                    return;
                }
            }
    
            if(ui->lineEdit_username->text().length() == 0){
                QMessageBox::warning(this,"LoginWindow","Введите логин");
                return;
            }
    
            if(ui->lineEdit_password->text().length() == 0){
                QMessageBox::warning(this,"Пароль", "Введите пароль");
                return;
            }
    
            QSqlQuery query(db);
            if(userType == "Клиент"){
                query.prepare("SELECT * FROM Клиент WHERE Логин = :login AND Пароль = :password");
            }
            else if(userType == "Администратор"){
                query.prepare("SELECT * FROM Администратор WHERE StrComp(Логин, :login, 0) = 0 AND StrComp(Пароль, :password, 0) = 0");
            }
            else if(userType == "Работник"){
                query.prepare("SELECT * FROM Работник WHERE StrComp(Логин, :login, 0) = 0 AND StrComp(Пароль, :password, 0) = 0");
            }
            else{
                qDebug() << "Unknown user type\n";
                db.close();
                return;
            }
            query.bindValue(":login", username);
            query.bindValue(":password", password);
    
            if (!query.exec()){
                qDebug() << "Failed query\n";
                db.close();
                return;
            }
    
            if(query.next()){ // проверка результата запроса
                QRect currentGeometry = this->geometry();
                QWidget *loggetInWindow = createAccountWindow(userType, currentGeometry);
                if(loggetInWindow){
                    loggetInWindow->show();
                    loggetInWindow->move(this->x(), this->y());
                }
            }
            else{
                QMessageBox::warning(this, "Ошибка входа", "Неверный логин или пароль.");
            }
    
            db.close();
        }
        QSqlDatabase::removeDatabase("loginConnection");
    }
    
    QWidget* LoginWindow::createAccountWindow(const QString& userType, const QRect& geometry){ // проверка какое окно создать
        QWidget *loggedInWindow = nullptr;
    
        if(userType == "Клиент"){
            loggedInWindow = new ClientWindow(ui->lineEdit_username->text());
            loggedInWindow->setAttribute(Qt::WA_DeleteOnClose);
        }
        else if(userType == "Администратор"){
            loggedInWindow = new AdminWindow();
            loggedInWindow->setAttribute(Qt::WA_DeleteOnClose);
        }
        else if(userType == "Работник"){
            loggedInWindow = new WorkerWindow(ui->lineEdit_username->text());
            loggedInWindow->setAttribute(Qt::WA_DeleteOnClose);
        }
    
        if(loggedInWindow){
            loggedInWindow->setGeometry(geometry);
            loggedInWindow->setWindowOpacity(0.0);
            loggedInWindow->show();
        }
    
        return loggedInWindow;
    }
    
    void LoginWindow::on_pushButton_registration_clicked(){
        RegistrationWindow* regWindow = new RegistrationWindow(this);
        regWindow->setAttribute(Qt::WA_DeleteOnClose);
    
        regWindow->show();
        connect(regWindow, &RegistrationWindow::windowClosed, this, [=](){
            delete regWindow;
        });
    }
    

    最小可重复示例

        #include "mainwindow.h"
    
    #include <QScreen>
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
    
        QScreen *primaryScreen = QGuiApplication::primaryScreen();
        QRect availableGeometry = primaryScreen->availableGeometry();
    
        int x = (availableGeometry.width() - w.width()) / 2;
        int y = (availableGeometry.height() - w.height()) / 2;
    
        w.move(x,y);
    
        w.show();
        return a.exec();
    }
    
  • 我有一个初始窗口,单击按钮后,应该创建一个新窗口,该新窗口不是第一个窗口的子窗口,并且出现在屏幕上第一个窗口所在的同一位置 loggetInWindow->move(this->x(), this->y());

  • 我在上传我的应用程序时收到来自谷歌的安全问题,并从这里的线程中得到了一些解决方案:WebView:如何避免在实施 onReceivedSslErrorb 时收到来自 Google Play 的安全警报...

    Error from google

    我在上传我的应用程序时收到来自谷歌的安全问题,我从这里的线程中得到了一些解决方案: WebView:如何避免在实施 onReceivedSslError 时收到来自 Google Play 的安全警报

    但就我而言,我正在 Unity Engine 中开发我的 Android 应用程序。我怀疑该解决方案是否适合我//。\

    评论 onReceivedSslError 能解决我的问题吗?或者还有其他更好的解决方案吗?

    Is this gonna work?

  • 好的,但是您遇到的错误与 unity 完全无关 - 也不是 unityscript...... 它几年前就消失了。

  • 请将 \'linux\' 标签替换为您使用的实际窗口系统(可能是 Wayland 或 X11)。如果代码在 Windows 上运行良好,则可能是其他系统缺少 Qt,这也可能已记录在案。

返回
作者最近主题: