当前位置: 首页 > 编程笔记 >

Docker创建容器时目录权限踩坑

司空俊雄
2023-03-14
本文向大家介绍Docker创建容器时目录权限踩坑,包括了Docker创建容器时目录权限踩坑的使用技巧和注意事项,需要的朋友参考一下

昨天写项目时需要用到Mysql的衍生版本percona, 就想用Doker来安装.结果踩了一晚上坑, 今早终于解决. 现记录在此.
这个坑原因是我对linux的目录权限问题不敏感导致的. 我的系统是ubuntu16.04, 运行 docker pull percona 拉取镜像时一切正常.


拉取完后,输入 docker images查看所有镜像, 显示正常:

然后我创建容器,命令为(执行时不要有换行):

docker create --name percona -v /data/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:lates 

这个命令的意思是我创建一个名为percona的容器, 然后把我本地的/data/mysql-data目录映射到docker容器中的/var/lib/mysql目录 并指定3306端口,然后设数据库root用户密码也为root,最后的percona:latest是指定我上面拉取的版本.

因为docker容器中的数据库只是一个镜像,可以理解为并不是真实存在的,映射到我本地目录的作用就是docker往/var/lib/mysql目录存储的数据都可以同步存储到我的本地/data/mysql-data目录. 这样保证了数据不丢失,而且方便我本地操作.

命令的参数不了解的可以看下官方文档或者随便搜个docker视频教程, 都有解释. 然后我开启此容器, docker start percona. 开启完后查询所有运行中的容器docker ps, 这时候出问题了:


为空,即没有查到运行中的容器... 然后我查了下所有的容器,包括运行的和没运行的的. docker ps -a, 显示如下:


原来是端口没有绑定成功, 所以没有运行!, 每次运行就自动exited

这时我查看了一下docker日志, 输入命令 docker logs 容器id, 显示如下:


注: 这里的71是我此容器的container_id的开头前两个数字, docker支持这种简化写法.

日志报错说我没有对容器中/var/lib/mysql目录下的创建和写权限.
现在找到这个问题原因了, 可是搜了一晚上都没有解决, 不得不说网上的一些不负责任的水贴是真的坑!
终于在早上找了解决办法:
即检查我本地目录的所有者和docker容器中的/var/lib/mysql目录的所有者是否为同一个用户.

docker run -ti --rm --entrypoint="/bin/bash" percona -c "whoami && id"

此命令的作用是查看容器的所有者, 显示为:


然后输入(不能换行):

docker run -ti --rm -v /data/mysql-data:/var/lib/mysql --entrypoint="/bin/bash" percona -c "ls -la /var/lib/mysql"

此命令的作用是查看映射本地数据卷时, 此目录的拥有者


原因就出在这里, 这就是为什么mysql用户访问docker中的目录时, 会报权限错误! 因为 本地映射目录的主人是root用户, 而docker容器中/var/lib/mysql目录的主人是mysql用户,uid为999!
然后解决方法就是, 把当前目录的拥有者赋值给uid 999即mysql用户, 再重新启动容器

问题解决了! 浪费了一晚上时间, 不得不说, linux的权限控制知识还要加深!

到此这篇关于Docker创建容器时目录权限踩坑的文章就介绍到这了,更多相关Docker创建容器目录权限内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问题内容: 在将非root用户添加到sudoers组的映像构建过程中,无法创建文件夹。这是我的Dockerfile: 我得到错误: 问题答案: Docker容器内的文件系统就像Docker容器外的文件系统一样工作:如果要创建文件或目录,则需要适当的权限。在这种情况下,您尝试以非root用户身份创建(因为该指令更改了用于运行其后所有命令的UID)。那是行不通的,因为它拥有并具有mode 。 请尝试:

  • 创建目录权限 如果你想创建一个目录并授予777权限,你需要怎么做?查看Go的API文档我们可以这样写。 源文件为mkdir.go。 package main import ( "fmt" "os" ) func main() { err := os.MkdirAll("/tmp/gotest/", 0777) if err != nil { panic(er

  • 我的Dockerfile配置: 报错信息: 我已经尝试过以下几种方法: Dockerfile配置中添加RUN chmod -R 777 /yice Dockerfile配置添加 USER root,它会报: 找不Chrome,然后因为ghcr.io/puppeteer/puppeteer:latest镜像切换的用户名为pptruser,所以我手动在代码里给puppeteer配置executable

  • 我正在尝试使用AWS ECS在docker容器中运行boto3 python脚本。我的脚本需要访问SQS(获取 为了让docker容器在我的本地机器上运行,我能够使用以下docker run命令将我的aws凭据传递到docker容器中。 <代码>docker run-v ~/。aws:/root/。aws 最近ECS宣布: 亚马逊ECS现在支持任务的IAM角色。为任务指定IAM角色时,其容器可以使

  • 问题内容: 我只是试图处理一个上传的文件,并将其写入一个工作目录中,该目录的名称是系统时间戳。问题是我想创建具有完全许可权的目录(777),但我做不到!使用以下代码段,创建的目录具有755权限。 有人可以帮助我吗?非常感谢。 问题答案: 根据python的官方文档,在某些系统上可以忽略该函数的mode参数,而在不忽略该函数的系统上,当前umask值会被屏蔽掉。 无论哪种方式,您都可以使用函数将模式

  • php it的函数“is_writable”返回false,然后显示具有下一个权限的目录755所有者和根组。为了使它运行,我把chown放在www-data-r/var/www/myweb。这样做是可行的,但我将所有者从root更改为apache(www.data)。我问题是这种形式解决它的正确与否。我在做一个大洞保安还是正确的?