GVKun编程网logo

我如何 Docker COPY 作为非 root 用户?(docker copy on write)

3

本文的目的是介绍我如何DockerCOPY作为非root用户?的详细情况,特别关注dockercopyonwrite的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解我

本文的目的是介绍我如何 Docker COPY 作为非 root 用户?的详细情况,特别关注docker copy on write的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解我如何 Docker COPY 作为非 root 用户?的机会,同时也不会遗漏关于167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、AzerothCore Docker,在“ docker-compose up”、docker error:/root/.docker/config.json: is a directory、Docker Rootless 在非特权模式下运行 Docker的知识。

本文目录一览:

我如何 Docker COPY 作为非 root 用户?(docker copy on write)

我如何 Docker COPY 作为非 root 用户?(docker copy on write)

在构建 Docker 映像时,如何COPY将文件放入映像中,以使生成的文件归 root 以外的用户所有?

答案1

小编典典

对于 v17.09.0-ce 和更新版本

将可选标志--chown=<user>:<group>ADDorCOPY命令一起使用。

例如

COPY --chown=<user>:<group> <hostPath> <containerPath>

--chown 标志的文档现在位于主要的Dockerfile
参考页面上。

问题 34263已合并,在v17.09.0-ce
版本中可用。


对于早于 v17.09.0-ce 的版本

Docker 不支持COPY作为 root 以外的用户。你需要在chown/命令 之后chmod文件。 __COPY

示例 Dockerfile:

from centos:6RUN groupadd -r myuser && adduser -r -g myuser myuserUSER myuser#Install code, configure application, etc...USER rootCOPY run-my-app.sh /usr/local/bin/run-my-app.shRUN chown myuser:myuser /usr/local/bin/run-my-app.sh && \    chmod 744 /usr/local/bin/run-my-app.shUSER myuserENTRYPOINT ["/usr/local/bin/run-my-app.sh"]

在 v17.09.0-ce 之前,该COPY命令的 Dockerfile 参考说:

所有新文件和目录都使用 0 的 UID 和 GID 创建。


历史 此功能
已通过多个GitHub问题进行跟踪:6119、9943、13600、27303、28499、问题30110

问题 34263是实现可选标志功能的问题,问题
467更新了文档。

167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

docker构建nginx容器系列问题


background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑

1.nginx服务器根目录问题

docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同

eg:

run一个niginx容器

<span>//80端口被占用,so...</span>
$ sudo docker run <span>-it</span><span>-p</span><span>800</span>:<span>800</span> nginx
$ sudo docker ps 

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                   NAMES
<span>1801</span>a32aab54        nginx               <span>"nginx -g ''daemon off"</span><span>2</span> minutes ago       Up <span>2</span> minutes        <span>80</span>/tcp, <span>443</span>/tcp, <span>0.0</span><span>.0</span><span>.0</span>:<span>800</span><span>-&gt;</span><span>800</span>/tcp   berserk_kare
登录后复制

进入容器内部

<span>$ </span>sudo docker exec -it <span>1801</span>a32aab54 /bin/bash
root<span>@1801a32aab54</span><span>:/</span><span># </span>
登录后复制

查看nginx目录

<span># cd /etc/nginx/</span>
conf<span>.d</span>/         koi-utf         mime<span>.types</span>      nginx<span>.conf</span>      uwsgi_params    
fastcgi_params  koi-win         modules/        scgi_params     win-utf  
登录后复制

可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled

继续查看nginx配置

<span># cat /conf.d/default.conf</span><span>server</span> {
    listen       <span>80</span>;
    server_name  localhost;

    <span>#charset koi8-r;</span><span>#access_log  /var/log/nginx/log/host.access.log  main;</span>    location / {
        root   /usr/share/nginx/html;
        <span>index</span><span>index</span>.html <span>index</span>.htm;
    }

    <span>#error_page  404              /404.html;</span><span># redirect server error pages to the static page /50x.html</span><span>#</span>
    error_page   <span>500</span><span>502</span><span>503</span><span>504</span>  /<span>50</span>x.html;
    location = /<span>50</span>x.html {
        root   /usr/share/nginx/html;
    }
    <span>#...省略php-fpm配置,好长..</span>
}
登录后复制

根目录配置: root /usr/share/nginx/html;

测试

<span># cd /usr/share/nginx/html</span><span># touch index.html</span><span># echo "test nginx in docker" &gt;index.html</span>
登录后复制

php-fpm配置相关

'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了167 docker docker构建nginx容器系列问题,包括了docker,nginx方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

AzerothCore Docker,在“ docker-compose up”

AzerothCore Docker,在“ docker-compose up”

正如@ locus313所说,命令“ docker-compose up -d”就是答案。

docker error:/root/.docker/config.json: is a directory

docker error:/root/.docker/config.json: is a directory

问题:

本地没有taskworker镜像,docker从远端拉取,但是拉取时需要读取config.json配置,解析配置时,发现config.json是个目录,错误信息如下:

taskworker_1 | 2018-04-11T08:41:04.688875905Z 
docker: Error response from daemon: taskworker:latest not found: does not exist or no pull access.
taskworker_1 | 2018-04-11T08:41:04.519870517Z 
WARNING: Error loading config file:/root/.docker/config.json - read /root/.docker/config.json: is a directory
taskworker_1 | 2018-04-11T08:41:04.524016048Z
Unable to find image ''taskworker:latest'' locally

原因分析:

配置文件不正确。

解决方案:

删除/root/.docker/config.json目录(docker会自动重建该文件)。

为避免不正确的docker cli导致再创建一个config.json目录,需要在安装完成docker后,通过docker login命令正确设置注册表和账户信息

 

Docker Rootless 在非特权模式下运行 Docker

Docker Rootless 在非特权模式下运行 Docker

Docker Rootless 基本概念

Rootless 模式允许以非 root 用户身份运行 Docker 守护进程(dockerd)和容器,以缓解 Docker 守护进程和容器运行时中潜在的漏洞。Rootless 模式是在 Docker v19.03 版本作为实验性功能引入的,在 Docker v20.10 版本 GA。

Rootless 模式目前对 Cgroups 资源控制,Apparmor 安全配置,Overlay 网络,存储驱动等还有一定的限制,暂时还不能完全取代 “Rootful” Docker。关于 Docker Rootless 的详细信息参见 Docker 官方文档 Run the Docker daemon as a non-root user (Rootless mode)

Rootless 模式利用 user namespaces 将容器中的 root 用户和 Docker 守护进程(dockerd)用户映射到宿主机的非特权用户范围内。Docker 此前已经提供了 --userns-remap 标志支持了相关能力,提升了容器的安全隔离性。Rootless 模式在此之上,让 Docker 守护进程也运行在重映射的用户名空间中。

实践验证

环境准备

本文使用 Centos 7.5 操作系统的虚拟机进行实验。

[root@demo ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

创建用户

useradd rootless
echo 123456 | passwd rootless --stdin

安装依赖

Rootless 模式可以在没有 root 权限的情况下运行 Docker 守护进程和容器, 但是需要安装 newuidmapnewgidmap 工具,以便在用户命名空间下创建从属(subordinate)用户和组的映射(remapping)。通过以下命令安装 newuidmapnewgidmap 工具。

cat <<EOF | sudo sh -x
curl -o /etc/yum.repos.d/vbatts-shadow-utils-newxidmap-epel-7.repo https://copr.fedorainfracloud.org/coprs/vbatts/shadow-utils-newxidmap/repo/epel-7/vbatts-shadow-utils-newxidmap-epel-7.repo
yum install -y shadow-utils46-newxidmap
cat <<EOT >/etc/sysctl.conf
user.max_user_namespaces = 28633
EOT
sysctl --system
EOF

UID/GID 映射配置

从属用户和组的映射由两个配置文件来控制,分别是 /etc/subuid/etc/subgid。使用以下命令为 rootless 用户设置 65536 个从属用户和组的映射。

echo "rootless:100000:65536" | tee /etc/subuid
echo "rootless:100000:65536" | tee /etc/subgid

对于 subuid,这一行记录的含义为: 用户 rootless,在当前的 user namespace 中具有 65536 个从属用户,用户 ID 为 100000-165535,在一个子 user namespace 中,这些从属用户被映射成 ID 为 0-65535 的用户。subgid 的含义和 subuid 相同。

比如说用户 rootless 在宿主机上只是一个具有普通权限的用户。我们可以把他的一个从属 ID (比如 100000 )分配给容器所属的 user namespace,并把 ID 100000 映射到该 user namespace 中的 uid 0。此时即便容器中的进程具有 root 权限,但也仅仅是在容器所在的 user namespace 中,一旦到了宿主机中,顶多也就有 rootless 用户的权限而已。

安装 Rootless Docker

切换到 rootless 用户。

su - rootless 

执行以下命令安装 Rootless Docker。

curl -fsSL https://get.docker.com/rootless | sh

安装成功后显示如下内容。

将以下内容添加到 ~/.bashrc 文件中,添加完以后使用 source ~/.bashrc 命令使环境变量生效。

export XDG_RUNTIME_DIR=/home/rootless/.docker/run
export PATH=/home/rootless/bin:$PATH
export DOCKER_HOST=unix:///home/rootless/.docker/run/docker.sock

启动 Docker 守护进程

使用以下命令启动 Docker 守护进程。

dockerd-rootless.sh

运行容器

使用以下命令启动一个 nginx 容器,并将 80 端口映射到宿主机的 8080 端口。

docker run -d -p 8080:80 nginx

查看容器。

[rootless@demo ~]$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
f3b204c97a84   nginx     "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   bold_stonebraker

访问容器。

[rootless@demo ~]$ curl http://localhost:8080

# 返回结果 Nginx 欢迎界面
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

参考资料

  • 容器安全拾遗 - Rootless Container初探
  • Run the Docker daemon as a non-root user (Rootless mode)
  • Experimenting with Rootless Docker
  • 浅谈Docker的安全性支持(下篇)
  • Docker v20.10 核心功能介绍和实践
  • shadow-utils-newxidmap
  • Hardening Docker Daemon with Rootless Mode
  • Linux Namespace : User
  • 理解 docker 容器中的 uid 和 gid
  • 隔离 docker 容器中的用户

欢迎关注

关于我如何 Docker COPY 作为非 root 用户?docker copy on write的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、AzerothCore Docker,在“ docker-compose up”、docker error:/root/.docker/config.json: is a directory、Docker Rootless 在非特权模式下运行 Docker等相关知识的信息别忘了在本站进行查找喔。

本文标签: