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'.
这就是上面刚刚上面说得在导出镜像是会丢失CMD
、ENTRYPOINT
等等信息导致镜像没有了命令入口点,需要重新导入指定入口点这些信息。
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
段镜像的ENV
、CMD
、Entrypoint
等配置信息:
[$] docker image inspect 镜像ID