Please enable Javascript to view the contents

流水线构建时,凭证作用域问题

 ·  ☕ 2 分钟

在 client 中已经看到 Docker CLI 在给 Docker Daemon 发生构建上下文时,通过设置 X-Registry-Config 传递凭证,但在最近的构建反馈中,还是会出现一些无法解释的现象,本篇主要是进行一些基础的测试,以便于更好排查问题。

1. 宿主机 Docker 下构建

Docker Daemon 以 root 用户权限启动。

  • 未登录任何账户
1
2
3
4
su ansible
echo "FROM harbor.chenshaowen.com/private/test:v1" | sudo docker build - -t harbor.chenshaowen.com/private/test:v2 --pull

unauthorized

凭证已被清空。

  • ansible 用户登录,root 用户不登录

此时需要注意,不能使用 sudo docker login 登录,而是应该直接将凭证放在 /home/ansible/.docker/config.json 中。

1
2
3
4
su ansible
echo "FROM harbor.chenshaowen.com/private/test:v1" | sudo docker build - -t harbor.chenshaowen.com/private/test:v2 --pull

unauthorized
1
2
3
4
su ansible
echo "FROM harbor.chenshaowen.com/private/test:v1" | sudo docker build - -t harbor.chenshaowen.com/private/test:v2 --push

unauthorized
  • ansible 用户不登录,root 用户登录
1
2
3
4
su ansible
echo "FROM harbor.chenshaowen.com/private/test:v1" | sudo docker build - -t harbor.chenshaowen.com/private/test:v2 --pull

OK

使用 sudo 构建时,当前用户配置的凭证不会生效,而是使用 sudo 用户的凭证。

2. Docker out of Docker 下构建

为了模拟构建环境,在宿主机上以 root 用户权限,启动一个 Docker 容器,用来进行测试。

1
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker:19.03 sh
  • 容器不登录,宿主机不登录
1
2
3
echo "FROM harbor.chenshaowen.com/private/test:v1" | docker build - -t harbor.chenshaowen.com/private/test:v2 --pull

unauthorized

凭证已被清空。

  • 容器登录,宿主机不登录
1
2
3
echo "FROM harbor.chenshaowen.com/private/test:v1" | docker build - -t harbor.chenshaowen.com/private/test:v2 --pull

OK
1
2
3
docker push harbor.chenshaowen.com/private/test:v2

OK
  • 容器不登录,宿主机登录
1
2
3
echo "FROM harbor.chenshaowen.com/private/test:v1" | docker build - -t harbor.chenshaowen.com/private/test:v2 --pull

unauthorized
1
2
3
docker push harbor.chenshaowen.com/private/test:v2

unauthorized
  • 都登录,但容器权限不够,主机权限够
1
2
3
echo "FROM harbor.chenshaowen.com/private/test:v1" | docker build - -t harbor.chenshaowen.com/private/test:v2 --pull

unauthorized
1
2
3
docker push harbor.chenshaowen.com/private/test:v2

unauthorized

在 Docker out of Docker 模式下,构建的凭证与宿主机无关,而是使用的容器中提供的凭证。

3. Kubernetes 下执行流水线任务

  • 提供 imagePullSecrets,Docker 不配置凭证
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cat <<EOF | kubectl apply -f -
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: a2
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: demo
    template:
      metadata:
        labels:
          app: demo
      spec:
        containers:
        - name: demo
          command: ['sh', '-c', 'echo "Hello, wwww.chenshaowen.com !" && sleep 3600']
          image: harbor.chenshaowen.com/private/test:v1
          imagePullPolicy: Always
        imagePullSecrets:
        - name: pull-harbor-secret
EOF
1
OK
  • 不提供 imagePullSecrets,Docker 配置凭证
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
cat <<EOF | kubectl apply -f -
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: a2
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: demo
    template:
      metadata:
        labels:
          app: demo
      spec:
        containers:
        - name: demo
          command: ['sh', '-c', 'echo "Hello, wwww.chenshaowen.com !" && sleep 3600']
          image: harbor.chenshaowen.com/private/test:v1
          imagePullPolicy: Always
EOF
1
unauthorized

Kubernetes Pod 镜像拉取也与 Docker 凭证配置没有关系。

4. 总结

本篇的测试并没有带来奇怪的知识,只是为了验证理解是否正确,结论如下:

  • 使用 sudo 构建时,当前用户配置的凭证不会生效,而是使用 sudo 用户的凭证
  • 在 Docker out of Docker 模式下,构建的凭证与宿主机无关,而是使用容器中提供的凭证
  • Kubernetes Pod 拉取镜像也不会使用宿主机上配置的凭证,如果你认为有使用,可能是镜像已经在宿主机上,并且拉取模式是 IfNotPresent

微信公众号
作者
微信公众号