docker镜像制作并上传
一、 Linux 版从 dockerfile 制作 Docker 镜像
制作linux版的docker镜像需要一些准备工作,然后编写对应的dockerfile, 执行dockerfile 、推送镜像到服务端
1. 准备工作
1.1 准备好可访问外网的虚拟机,并安docker等软件
1 |
|
1.2 登录docker
1 |
|
1.3 拉取依赖的基础镜像
1 |
|
1.4. 部署andriod编译依赖的gradle工具
通过 https://gradle.org/releases/ 下载4.10.1版二进制包
1 |
|
1.5. 部署 andriod 编译依赖的NDK工具
NDK的安装是通过 sdkmanager 来安装的,而 sdkmanager 包含在 commandlinetools 包中的,Android Studio 包含了commandlinetools工具,因为不需要图形化界面所以在Command line tools only
标题下只下载linux版的 commandlinetools 就好了,不用下载完整的Android Studio
。
https://developer.android.com/studio#downloads
1.5.1 部署 commandlinetools 及其依赖
1 |
|
1.5.2 设置环境变量
因为 sdkmanager 的执行依赖部分环境变量,所以需要提前设置
vim ~/.bash_profile 添加以下内容:
1 |
|
官方文档中说不设置ANDROID_HOME也可以,为了减少不必要的麻烦,设置上也没问题
执行以下命令使环境变量生效
1 |
|
1.5.3 验证commandlinetools 部署
1 |
|
1.5.4 通过 sdkmanager 安装指定版本的NDK
sdkmanager的应用参考《官方文档》
常规用法如下:
1 |
|
执行以下命令安装需要的ndk20版
1 |
|
执行以下命令安装需要的cmake3.10.2版
1 |
|
1.6. 通过 gradle 编译mydns
此步骤目的主要是执行gradle 编译指令,由gradle自动获取编译mydns时需要的各种依赖工具,相关的依赖工具内容会存储在当前用户根目录的.gradle目录下,后面需要把这些依赖工具打到制作的docker镜像中
1.6.1 拉取 mydns 代码
此内容只适合与首次获取代码
1 |
|
1.6.2 通过 gradle 编译mydns及其依赖的子项目
1.6.2.1替换gradle编译时依赖的sdk.dir和ndk.dir目录
1 |
|
1.6.2.2 使用gradle 编译 acl
1 |
|
1.6.2.3 使用gradle 编译 mbedtls
1 |
|
1.6.2.4 使用gradle 编译 libdns
1 |
|
1.6.2.5 使用gradle 编译 libqnet
1 |
|
1.6.2.6 使用gradle 编译 mydns
1 |
|
1.7 拷贝gradle缓存目录到docker 镜像制作目录
因为计划将dockerfile中的COPY命令的context设置在/opt/soft/android目录下,便于生成镜像时拷贝相关目录文件
1 |
|
1.8 异常及解决方法
- 编译 libdns 时 解决方法
1
2
3
4
5
6
7
8
9
10
11
12> Task :libdns:lint FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':libdns:lint'.
> Could not resolve all artifacts for configuration ':libdns:debugAndroidTestRuntimeClasspath'.
> Could not download hamcrest-core.jar (org.hamcrest:hamcrest-core:1.3)
> Could not get resource 'https://jcenter.bintray.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar'.
> Could not HEAD 'https://jcenter.bintray.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar'.
> Read timed out1
2
3方法1 通过再次执行gradle build 有可能会下载成功
方法2 修改当前目录下的build.gradle 文件,使用阿里镜像 未验证此方法
参考 《[如何用gradle配置国内阿里云镜像源](https://blog.csdn.net/yizhuanlu9607/article/details/96971042)》
2 编写 dockerfile
vim /opt/soft/android/dockerfile 文件中的内容如下:
1 |
|
3 根据 dockerfile 创建镜像
- 创建本地镜像
1 |
|
- 根据新的本地镜像创建一个容器,并验证环境变量和目录的正确性
1
docker run --name test_mydns -it -v `pwd`:/root/workspace --privileged=true mydns_linux_base:1.0 /bin/bash
4 将创建的镜像推送到远端仓库中
4.1 创建标签并推送到远端仓库中
1 |
|
4.2 推送镜像查看
打开 以下网址查看是否有新推的 mydns_linux_base 镜像
http://qae.cloud.qqqqq.domain/registry/namespaces/?filter_text=undefined:edge-cloud
4.3 本地清理及使用获取远端仓库镜像
推送成功后可以将本地的 mydns_linux_base 进行删除
1 |
|
4.4 异常及解决方法
- push时权限错误 解决方法
1
2
3
4
5
6
7
8
9
10
11The push refers to repository [docker-registry.qqqqq.virtual/edge-cloud/mydns_linux_base]
1885a8d3b104: Preparing
7e0dbba8fe17: Preparing
6bb0d2c98d31: Preparing
fd846adc3060: Preparing
41c37881aa1c: Preparing
edfc6fdcb211: Preparing
ddd02f1907f4: Preparing
a51dabe2037e: Preparing
129b697f70e9: Preparing
error parsing HTTP 403 response body: invalid character 'T' looking for beginning of value: "The supplied authentication is not authorized to access this resource"1
2
3
4
5
6# 退出docker 当前登录用户,使用有权限的账号进行登录
docker logout docker-registry.qqqqq.virtual
# 从新登陆
docker login docker-registry.qqqqq.virtual
参考http://docker.gitlab.qqqqq.domain/readme/sample.html二、 Linux 版从 container 制作 Docker 镜像
使用以下命令可以从特定的container直接制作新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
如: docker commit mycontainer myimage:v1.0
三、Windows 版编译服务器设置
3.1 安装必要的依赖软件
安装vs2019、git、curl、7-Zip 到默认的c盘路径下
配置环境变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18INCLUDE变量内容
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\winrt
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\include
LIB变量内容
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\lib\x86
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x86
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86
PATH变量内容
C:\Users\cloudbase-init\curl\curl-7.76.1-win64-mingw\bin
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\bin\Hostx86\x86
C:\Program Files\Git\cmd
C:\Program Files\7-Zip生成本机的sshkey
因为在部署git的时候已经默认安装了ssh-keygen工具,所以直接在命令窗口执行ssh-keygen工具生成本机的ssh秘钥即可在mydns项目中添加本机的sshkey
将上一步生成的公钥添加到 mydns/settings/repository 下的Deploy Keys
中即可
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!