【问题标题】:How to install sudo and nano command in MySql docker image如何在 MySql docker 镜像中安装 sudo 和 nano 命令
【发布时间】:2020-06-16 15:44:38
【问题描述】:

我正在尝试将 Django 应用程序与 MySql docker 容器连接起来。我正在使用最新版本的 MySql 即 MySql 8.0 来构建容器。我能够成功构建 MySql 容器,但我无法使用 Django 的默认 MySql 连接器连接它。当我运行docker-compose up 命令时,我得到了下面提到的错误。

django.db.utils.OperationalError: (1045, 'Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory')

我开始寻找解决方案,并了解到 MySql 在其默认身份验证插件中发布了一项重大更改,大多数 MySql 连接器都不支持该插件。

要解决此问题,我必须在 MySql 容器的 my.cnf 文件中将 default-authentication-plugin 设置为 mysql_native_password

我使用命令docker exec -it <conatiner id> /bin/bash 登录到容器,并且还能够在容器内找到my.cnf 文件。

要编辑my.cnf 文件,我必须使用nano 命令,如下所述。

nano my.cnf

但不幸的是,MySql Container 中没有安装nano 命令。要安装nano,我需要在容器中安装sudo

我尝试使用下面提到的命令安装sudo,但没有成功。

apt-get install sudo

错误-

Reading package lists... Done
Building dependency tree       
Reading state information... Done

解决此问题的可能解决方案是什么。

【问题讨论】:

    标签: mysql django docker


    【解决方案1】:

    问题不在于 sudo,因为您已经拥有安装 pacakegs 的权限。 您应该在安装新软件包之前更新软件包管理器以更新软件包存储库:

    RUN apt-get update
    RUN apt-get install nano
    

    【讨论】:

      【解决方案2】:

      一般来说,您不应尝试直接编辑容器中的文件。一旦容器停止并删除,这些更改就会丢失;这种情况非常常见,因为许多 Docker 选项只能在启动时设置,而更新容器中软件的标准方法是使用更新的映像重新创建它。在您的情况下,您也无法实时编辑主容器进程在启动时需要的配置文件,因为在您能够编辑时它已经读取了配置文件。

      正确的做法是在容器启动时注入修改后的配置文件。如果您还没有,请从镜像中获取默认配置文件

      docker run --rm mysql:8 cat /etc/mysql/my.cnf > my.cnf
      

      并使用您选择的文本编辑器直接在您的主机上对其进行编辑。启动容器时,注入修改后的文件

      docker run -v $PWD/my.cnf:/etc/mysql/my.cnf ... mysql:8
      

      或者,在 Docker Compose 中,

      volumes:
        - ./my.cnf:/etc/mysql/my.cnf
      

      Docker Hub mysql image documentation 有更多关于如何设置的建议;请参阅那里的“使用自定义 MySQL 配置文件”。

      虽然docker exec 是一个非常有用的调试工具,但它不应该成为您核心工作流程的一部分,我建议在这种情况下尽量避免使用它。 (使用绑定挂载方法,您可以将修改后的配置文件添加到您的源代码控制系统,并像往常一样盲目地docker-compose up,而无需知道此细节;docker exec 方法您必须记住并每次手动重复启动容器堆栈。)

      另外请注意,您在 Docker 中根本不需要 sudo。您可以运行某些内容的每个上下文(Dockerfiles、docker rundocker exec)都有某种方式可以显式指定用户 ID,因此您可以docker exec -u root ...sudo 通常依赖于用户有密码和交互式提示之类的东西,这对于管理真正的 Linux 主机很有效,但与典型的 Docker 环境不匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-19
        • 2021-11-04
        • 1970-01-01
        • 2023-01-23
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多