【问题标题】:How to retain exported file in docker image如何在 docker 镜像中保留导出的文件
【发布时间】:2020-11-09 02:58:50
【问题描述】:

我正在 docker 中迁移一个 java 独立的 maven 项目。到目前为止,我们为这个 maven 项目创建了一个 jar 文件,它使用 public static void main 方法运行。

java -cp app.jar com.xxx.ExportManager db.properties

完成此代码后,它会在当前目录中导出一个文件。

Dockerfile

FROM centos:7

RUN yum install -y \
   java-1.8.0-openjdk \
   java-1.8.0-openjdk-devel

ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk/

ENV echo $JAVA_HOME

RUN  java -version

ARG JAR_FILE=target/manager.jar
ARG JAR_LIB_FILE=target/lib/

WORKDIR /opt/manager/app/

COPY ${JAR_FILE} app.jar

COPY conf/db.properties /opt/manager/app/db.properties

ADD ${JAR_LIB_FILE} lib/

ENTRYPOINT ["java","-jar","app.jar"]

命令:

  • 建筑图片:docker build -t pc .
  • 运行main方法:docker run -t pc /opt/manager/app/db.properties

运行后,它会将图像中的文件(我确定因为我已经通过记录器检查过)导出到 /opt/manager/app/。但是当我使用命令查看图像的内容时

docker run -it --entrypoint sh pc 
cd /opt/manager/app

该目录没有导出文件,但它包含所有其他项目文件。

如何在图片中保留导出的文件?

PS:我是docker新手,如有错误请见谅。

【问题讨论】:

    标签: java docker maven dockerfile


    【解决方案1】:

    docker run -it --entrypoint sh pc 实际上是启动一个新容器,而不是在一个正在运行的容器中启动一个 shell。因此,您正在查看一个尚未完成导出的新容器(因为您覆盖了入口点)。

    要在正在运行的容器中启动 shell 并将您的标准输入/标准输出附加到它,您需要 exec 而不是 run,例如:

    docker exec -it pc bash
    

    但是在您的特定情况下,您可能无论如何都无法启动 shell,因为一旦导出完成,容器就会停止。查看此answer 以检查已停止容器的文件系统。

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 2022-07-20
      • 2020-01-20
      • 1970-01-01
      • 2021-12-21
      • 2022-10-15
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多