
# 使用Dockerfile制作镜像失败
使用步骤"制作镜像并推送到SWR"或"执行Docker命令"制作镜像时，docker build阶段可能会制作镜像失败，可参考各场景对应解决方案处理：
- [COPY或者ADD指令找不到文件]
- [制作镜像时拉取基础镜像失败]
- [执行命令失败]
- [拉取DockerHub镜像超时或失败]
 
 #### COPY或者ADD指令找不到文件
**问题现象**
构建任务中有"制作镜像并推送SWR"或"执行Docker命令"构建步骤，执行任务时日志报如下异常信息：
```
ADD failed: stat /var/lib/docker/tmp/docker-builder154037010/temp: no such file or directory
[ERROR][制作镜像并推送到SWR仓库]：错误信息：DEV.CB.0210043，制作Docker镜像失败。
```
```
COPY failed: stat /var/lib/docker/tmp/docker-builder076130522/test.txt: no such file or directory
```
**原因分析**
ADD指令的源文件为"./temp"，而当前工作目录下没有temp文件。
**处理方法**
假设当前目录的结构如下：
```
+ target
   - temp
- Dockerfile
```
target目录下有temp文件，而Dockerfile文件和target同级。
- **方法一**：将ADD指令的源文件改为"./target/temp"。
- **方法二** ：target目录作为工作目录，将"制作镜像并推送到SWR仓库"构建步骤的工作目录改为"target"，Dockerfile路径改为"../Dockerfile"。
  ![](https://support.huaweicloud.com/codeci_faq/zh-cn_image_0000001910910442.png)
  
 
 #### 制作镜像时拉取基础镜像失败
使用Dockerfile制作镜像时，如果指定的基础镜像参数有误，会导致镜像拉取失败，主要包括以下两个场景：
- **指定的镜像不存在或无权限**
  - 错误日志
    ```
    pull access denied for java1, repository does not exist or may require 'docker login'
    ```
    
  
  - 分析处理 镜像仓库中找不到指定的镜像或当前用户对该镜像没有pull权限时，会出现该错误。
    此例的Dockerfile中，*FROM java1:8ull-jdk-alpine*命令指定的镜像"java1"无法在镜像仓库中找到，故出现此错误，请核对并修正镜像名后重试即可。
    
   
- **指定的镜像标签不存在**
  - 错误日志
    ```
    manifest for java:8ull-jdk-alpine not found
    ```
    
  
  - 分析处理 镜像仓库中存在指定镜像，但不存在镜像的对应版本/标签时会出现"manifest not found"错误。此例的Dockerfile中，*FROM java:8ull-jdk-alpine*命令指定了镜像"java:8ull-jdk-alpine"，镜像仓库中存在"java"镜像，但没有对应的版本/标签"8ull-jdk-alpine"，故出现此错误，请核对并修正镜像版本后重试即可。
    
   
 
 #### 执行命令失败
**问题现象**
使用Dockerfile制作镜像时，在执行docker build阶段报如下错：
```
exec user process caused "exec format error"
```
**原因分析**
此问题出现的原因一般有两个：
- 制作镜像的基础镜像和执行机不匹配，如：镜像为arm的，但是执行机是x86的。
- Dockerfile文件内容从其他地方复制过来时出现问题。
**处理方法**
1. 先确认镜像和执行机是否匹配，如果镜像是x86的镜像，就只能用x86的执行机。
2. 重新执行构建，查看是否成功，如果不成功，手动输入Dockerfile后再重新执行。
 
 #### 拉取DockerHub镜像超时或失败
**问题现象**
- 现象一
  错误日志如下：
  ```
  Error response from daemon: Get https://registry.docker-cn.com/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  ```
  

- 现象二 错误日志如下：
  ```
  toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit
  ```
  
**原因分析**
- 现象一：dockerHub网络不稳定导致拉取镜像超时或失败。
- 现象二：dockerHub的频率限制导致拉取镜像失败。
**处理方法**
- **方法一** ：将dockerHub的镜像迁移到SWR上，再拉取镜像
  1. 将需要使用的dockerHub镜像下载到本地。
  
  2. 登录[容器镜像服务](https://console.huaweicloud.com/swr/)，在总览页面，单击右上角"上传镜像"或快速入门区域的"上传自有镜像"。
  
  3. 在上传页面选择组织和需要上传的镜像。
  
  4. 还可以通过客户端上传，选择"我的镜像 "，单击右上角的"客户端上传"，根据弹出的页面提示进行操作。
  
  5. 镜像上传成功后，需要将镜像设置成公开，在"我的镜像"页面，找到刚刚上传的镜像，单击镜像名称，然后单击右上方"编辑"，在编辑页面中将镜像设置成公开。
  
  6. 最后替换dockerfile中FROM的基础镜像地址并重新执行构建任务，镜像地址格式一般为swr.cn-south-1.myxxcloud.com/{组织名称}/{镜像名称}:{版本名称}，具体内容可以从下载指令中截取。
   

- **方法二** ：通过配置SWR镜像加速器地址解决
  ![](https://support.huaweicloud.com/codeci_faq/public_sys-resources/note_3.0-zh-cn.png)
  该方法只适用于现象一：dockerHub网络不稳定导致拉取镜像超时或失败。
  1. 登录[华为云SWR](https://console.huaweicloud.com/swr/)。
  
  2. 选择"镜像资源 \> 镜像中心 \> 镜像加速器"，复制加速器地址。
  
  3. 替换dockerfile中FROM的基础镜像地址后重新执行构建任务。如：原先基础镜像地址为*library/node:8.16-slim* ，加速器地址为*https://a786190f76fb41679546b24d8d08d8b8.mirror.swr.myxxcloud.com，* 则将镜像地址替换为：
     ```
     a786190f76fb41679546b24d8d08d8b8.mirror.swr.myxxcloud.com/library/node:8.16-slim
     ```
     
   
 
