【问题标题】:Docker build and docker-compose build with user namespace mapping带有用户命名空间映射的 Docker 构建和 docker-compose 构建
【发布时间】:2020-03-02 22:25:54
【问题描述】:

我已经在 docker 中启用了用户命名空间映射并使用 docker build 构建了一个图像,但是当我使用 docker-compose 来构建图像时,它会失败并显示以下消息。可能是什么原因?

db@vagrant:~/docker$ docker-compose up --build

Building db
Step 1/3 : FROM alpine:latest
 ---> e7d92cdc71fe
Step 2/3 : WORKDIR /app
 ---> Using cache
 ---> 1491149423a1
Step 3/3 : COPY 1.txt .
ERROR: Service 'db' failed to build: failed to copy files: failed to copy file: Container ID 65536 cannot be mapped to a host ID

我的用户 ID 是由一些设置脚本生成的,导致 UID 的值大于 65535。

db@vagrant:~/docker$ id
uid=65536(db) gid=1000(db) groups=1000(db),27(sudo),998(docker)

Docker configuration for namespace mapping

db@vagrant:~/docker$ cat /etc/docker/daemon.json
{
  "userns-remap": "db"
}

db@vagrant:~/docker$ cat /etc/subuid /etc/subgid
db:100000:65536
db:100000:65536

Dockerfile 内容(1.txt 为空文件)

db@vagrant:~/docker$ cat Dockerfile
FROM alpine:latest
WORKDIR /app
COPY 1.txt .

docker-compose.yml 文件内容

db@vagrant:~/docker$ cat docker-compose.yml
version: "2"
services:
   db:
     build:
       context: .
       dockerfile: Dockerfile
     image: sirishkumar/test

docker build 命令的输出

db@vagrant:~/docker$ docker build -t sirishkumar/test .
Sending build context to Docker daemon  3.584kB
Step 1/3 : FROM alpine:latest
latest: Pulling from library/alpine
c9b1b535fdd9: Pull complete
Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
Status: Downloaded newer image for alpine:latest
 ---> e7d92cdc71fe
Step 2/3 : WORKDIR /app
 ---> Running in 55f092b96268
Removing intermediate container 55f092b96268
 ---> 8af079e6a478
Step 3/3 : COPY 1.txt .
 ---> b3c14a691102
Successfully built b3c14a691102
Successfully tagged sirishkumar/test:latest

docker-compose 的输出

db@vagrant:~/docker$ docker-compose up --build
Creating network "docker_default" with the default driver
Building db
Step 1/3 : FROM alpine:latest
latest: Pulling from library/alpine
c9b1b535fdd9: Pull complete
Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
Status: Downloaded newer image for alpine:latest
 ---> e7d92cdc71fe
Step 2/3 : WORKDIR /app
 ---> Running in fe39955aed1a
Removing intermediate container fe39955aed1a
 ---> fb23b8888f4a
Step 3/3 : COPY 1.txt .
ERROR: Service 'db' failed to build: failed to copy files: failed to copy file: Container ID 65536 cannot be mapped to a host ID

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    您有 65,536 个用户 ID 可以映射到您的 docker 用户命名空间:

    db@vagrant:~/docker$ cat /etc/subuid /etc/subgid
    db:100000:65536
    db:100000:65536
    

    然后您告诉 docker 将文件复制到该范围之外的 ID 拥有的容器中(用户 ID 从 0 开始):

    db@vagrant:~/docker$ id
    uid=65536(db) gid=1000(db) groups=1000(db),27(sudo),998(docker)
    

    您需要将主机上的用户ID设置在主机用户ID范围内(小于65536)。

    【讨论】:

    • 我也有同样的理解,但是为什么 docker build 有效,而 docker-compose up --build 无效?
    • @Poorna 里面有很多变量,包括版本、buildkit,并且默认情况下每个都隐含地经历不同的工作流程,所以我不能肯定地说。
    • 好的,UID 是由我公司的脚本生成的,值始终高于 50000000。这是否意味着我无法使用这些 UID 在 docker 中启用用户命名空间?我尝试将 /etc/subuid 范围设置为大于 50000000 的值而不是默认值 65536,它可以工作,但我不确定这是否会导致其他问题。
    • @Poorna 听起来像是一个坏掉的脚本。
    • 这是故意的,也不是有效的 UID?
    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 2016-10-08
    • 2019-04-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多