Table Of Contents

骑驴找蚂蚁

全干工程师

docker-image

Docker 导出与导入本地镜像

随着🧱对hub.docker.com封禁,自由使用docker镜像也越来越难了。最近一个项目使用了java 21由于服务环境是java 8于是就打算使用docker部署下服务。由于服务器没有自由过🧱的能力,只能是在本地制作docker镜像将其导出,然后在服务器上导入,在这期间也遇到了一些问题。

制作Dockerfile

构建本地镜像肯定需要制作一个Dockerfile文件,关于该文件的使用介绍看可以可看该文章。以我项目的Dockerfile为例:

# Dockerfile
# 启用多级构建,先构建`maven`镜像打包编译代码
FROM maven:3.9 as build  
WORKDIR /app  
ADD pom.xml .  
# 缓存mvn 包
RUN mvn verify --fail-never  
ADD . .  
RUN mvn clean package -Dmaven.test.skip=true  

# 构建代码运行环境
FROM openjdk:21  
WORKDIR /app  
ENV MYSQL_USER="root"  
ENV MYSQL_PWD="123456"  
ENV MYSQL_HOST="127.0.0.1"  
ENV MYSQL_PORT=3306  
VOLUME /app/logs  
EXPOSE 8080  
# 将程序包从上个阶段复制到当前构建  
COPY --from=build /app/target/passport-0.0.1-SNAPSHOT.jar /app/passport-0.0.1-SNAPSHOT.jar  
ENTRYPOINT ["java", "-Dloader.main=com.zhanqi.network.passport.PassportApplication", "-jar","passport-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

构建运行镜像

进入Dockerfile文件目录:

[$] docker build --tag zq:passport

通过上面的构建命令后再运行:

[$] docker run --name zq_passport  --env MYSQL_USER=dev --env MYSQL_PWD=dev123456 --env MYSQL_HOST=dev.mysql.host -v /Users/meshell/zq_passport:/app/logs --rm  -p 8080:8080 zq:passport

导出导入镜像

只有将镜像运行之后才可以导出镜像:

# 导出镜像
[$] docker export zq_passport  > zq_passport.tar

这需要注意docker export导出是只是将镜像的文件系统这些打包导出,环境变量、卷、命令这些都会丢失。

将镜像导出之后需要在将文件上传到服务器,然后再服务执行导入:

# 导入镜像
[$] docker import zq_passport.tar

导入镜像之后,再次执行下镜像

# 显示导入后的镜像列表,直接导入是没有tag的.
[$] docker image ls
# 为导入的镜像设置一个tag
[$] docker image tag 导入的镜像ID zq:passport
# 再次以相同的运行命令执行镜像
[$] docker run --name zq_passport  --env MYSQL_USER=dev --env MYSQL_PWD=dev123456 --env MYSQL_HOST=dev.mysql.host -v /Users/meshell/zq_passport:/app/logs --rm  -p 8080:8080 zq:passport

再执行后得到一个错误:

docker: Error response from daemon: No command specified.
See 'docker run --help'.

这就是上面刚刚上面说得在导出镜像是会丢失CMDENTRYPOINT等等信息导致镜像没有了命令入口点,需要重新导入指定入口点这些信息。

docker import --change 'ENTRYPOINT ["java", "-Dloader.main=com.zhanqi.network.passport.PassportApplication", "-jar","passport-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]' --change 'ENV MYSQL_USER="root"' zq_passport.tar

再导入后可以通过镜像信息命令查看Config段镜像的ENVCMDEntrypoint等配置信息:

[$] docker image inspect 镜像ID

推荐阅读

  1. https://docs.docker.com/reference/cli/docker/image/import/
  2. https://docs.docker.com/reference/cli/docker/container/export/
  3. https://docs.docker.com/reference/cli/docker/container/run/
  4. https://docs.docker.com/reference/dockerfile/

留言