Docker拉去目标镜像
docker pull redis:6.2.5
如果出现拉去过程超时,或者连接失败。
添加镜像加速器,以阿里云为例,阿里云目前推广提供镜像加速器,需要登录。
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
生成的加速器地址,后面有教学如果使用加速器。
以windows为例
在Docker daemon加入(每个人地址不一样)
"registry-mirrors": [
"https://jhtiz.mirror.aliyuncs.com"
]
创建Dockerfile
先在本地创建Dockerfile文件
编辑Dockerfile文件
FROM redis:6.2.5
USER root
RUN groupadd -g 1001 bigdata && useradd -m -u 1001 -g bigdata bigdata
RUN chown -R 1001:1001 /opt/* && chown -R 1001:1001 /tmp /mnt
USER 1001
生成新镜像
docker build -t my-redis:0.0.1 d:/mydockerfiles
记得修改目录权限时,不能照抄,如下:
这里没有 /opt/* 文件或目录
这里要根据具体镜像内容和文件权限来
运行新镜像
查看镜像
docker images
运行新镜像id
-i: 交互式操作。
-t: 终端。
docker run -it 5a6ec30c0ef4
或者
docker run -d 5a6ec30c0ef4
出现无权限
应用生成日志没有权限 permission denied
或者
Unable to create directory required for Rundeck repository. Please ensure the file: /home/rund/repository exists and that Rundeck has write access to the directory.
需要在Dockerfile中先调整目录权限、先创建目录
...
RUN groupadd -g 1001 bigdata && useradd -m -u 1001 -g bigdata bigdata &&
#创建目录
RUN mkdir -p /home/rund/repository
# 在切换用户之前调整日志目录权限
RUN mkdir -p /app/logs && chown -R bigdata:bigdata /app/logs
...
# 切换到非root用户
USER 1001
如果您希望更通用地解决权限问题,确保用户1001(或任何指定用户)对容器内所有需要访问的目录和文件都有适当的权限,可以采取以下策略:
使用通配符:
如果有多个目录或文件需要赋予权限,可以使用通配符来匹配一系列路径。例如,如果您需要对所有位于/home/rund/下的目录和文件进行权限设置,可以这样做:
Dockerfile
RUN chown -R 1001:1001 /home/rund/*
注意,这种方式不会递归地处理新创建的目录或文件。如果需要递归处理,您可能需要明确列出每个主要目录。
递归赋权:
对于需要递归处理的目录,确保使用-R标志。如果您知道容器启动过程中可能会动态创建某些目录或文件,可以预见到这些位置,并提前设置好权限。例如,如果除了/home/rundeck/外,还有其他几个目录需要赋权,可以逐一处理:
Dockerfile
RUN chown -R 1001:1001 /home/rund \
&& chown -R 1001:1001 /var/log/myapp \
&& chown -R 1001:1001 /etc/myapp/conf.d
创建和赋权结合:
如之前提到的,在创建目录的同时进行权限设置,确保新创建的目录直接归指定用户所有:
Dockerfile
RUN mkdir -p /path/to/new/dir && chown -R 1001:1001 /path/to/new/dir
使用setgid位:
对于某些需要用户组内成员共同协作的目录,可以设置setgid位,这样任何用户在该目录下创建的文件都会继承该目录的组所有权。这可以通过chmod g+s实现:
Dockerfile
RUN chmod -R g+s /home/rund/shared
使用临时的root命令执行脚本:
如果有复杂的权限设置逻辑,可以编写一个脚本,该脚本执行所有的权限设置逻辑,然后在Dockerfile中使用USER root执行这个脚本,最后再切换回非root用户。这样可以保持Dockerfile的清晰度和可维护性。
记住,虽然赋予非root用户足够的权限很重要,但也应当遵循最小权限原则,只给予执行任务所需的最小权限,以增强容器的安全性。
把新镜像推送到阿里云
先登录
docker login --username=153351 registry.cn-hangzhou.aliyuncs.com
推送
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/imaniy/bigdata:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/imaniy/bigdata:[镜像版本号]