在 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
|
凭证已被清空。
此时需要注意,不能使用 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
|
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
|
- 不提供 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
|
Kubernetes Pod 镜像拉取也与 Docker 凭证配置没有关系。
4. 总结
本篇的测试并没有带来奇怪的知识,只是为了验证理解是否正确,结论如下:
- 使用 sudo 构建时,当前用户配置的凭证不会生效,而是使用 sudo 用户的凭证
- 在 Docker out of Docker 模式下,构建的凭证与宿主机无关,而是使用容器中提供的凭证
- Kubernetes Pod 拉取镜像也不会使用宿主机上配置的凭证,如果你认为有使用,可能是镜像已经在宿主机上,并且拉取模式是 IfNotPresent