【问题标题】:Error while docker image build with below dockerfile使用以下 dockerfile 构建 docker 映像时出错
【发布时间】:2020-10-17 19:01:51
【问题描述】:

Dockerfile

FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG DEPENDENCY=target/dependency
COPY ./target/dependency/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]

错误

    Sending build context to Docker daemon  36.83MB
Step 1/8 : FROM openjdk:8-jdk-alpine
 ---> a3562aa0b991
Step 2/8 : RUN addgroup -S spring && adduser -S spring -G spring
 ---> Using cache
 ---> e9748d9baac5
Step 3/8 : USER spring:spring
 ---> Using cache
 ---> 25b83c6d3e7a
Step 4/8 : ARG DEPENDENCY=target/dependency
 ---> Using cache
 ---> 24f648b8f9ef
Step 5/8 : COPY ./target/dependency/BOOT-INF/lib /app/lib
COPY failed: stat /var/lib/docker/tmp/docker-builder226394005/target/dependency/BOOT-INF/lib: no such file or directory

1)。 ARG DEPENDENCY=target/dependency -> 这不起作用,这就是为什么我没有对 Dockerfile 中的其他 COPY 行进行相同的更改

2)。我有一个创建为 target/dependency/BOOT-INF/lib 的目录,它仍然包含所有依赖项,它错误地说:没有这样的文件或目录。

请提供一些解决方案并提供有关 Dockerfile 的正确解释。非常欢迎任何有关使用 Postgres DB 对 Springboot 应用程序进行 Dockerizing 的建议。

更新的 Dockerfile:

FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
RUN adduser spring root
COPY . /home/app
WORKDIR /home/app
RUN chmod -R 775 /home/app
RUN mkdir -p /home/app/lib 
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /home/app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]

更新错误:

   Sending build context to Docker daemon  36.83MB
Step 1/12 : FROM openjdk:8-jdk-alpine
 ---> a3562aa0b991
Step 2/12 : RUN addgroup -S spring && adduser -S spring -G spring
 ---> Using cache
 ---> e9748d9baac5
Step 3/12 : RUN adduser spring root
 ---> Using cache
 ---> 444285d4e8d1
Step 4/12 : COPY . /home/app
 ---> 0bf717362f3e
Step 5/12 : WORKDIR /home/app
 ---> Running in 9f967425a899
Removing intermediate container 9f967425a899
 ---> bcb4e22f9faa
Step 6/12 : RUN chmod -R 775 /home/app
 ---> Running in 3110a9dd9059
Removing intermediate container 3110a9dd9059
 ---> c9ad2d9f411d
Step 7/12 : RUN mkdir -p /home/app/lib
 ---> Running in 48a172151d8b
Removing intermediate container 48a172151d8b
 ---> 11dbe4b4e21f
Step 8/12 : ARG DEPENDENCY=target/dependency
 ---> Running in 31a21dfd103f
Removing intermediate container 31a21dfd103f
 ---> ac340462402c
Step 9/12 : COPY ${DEPENDENCY}/BOOT-INF/lib /home/app/lib
COPY failed: stat /var/lib/docker/tmp/docker-builder273428680/target/dependency/BOOT-INF/lib: no such file or directory

【问题讨论】:

  • 如何构建 docker 镜像?该文件是否存在于 Dockerfile 的根目录中?或者更好的添加目录结构
  • 看起来目录路径无效或者您正在从不同的上下文构建 docker 映像,如果 Dockerfile and target/dependency 位于同一路径/目录上,则 docker build -t image . 应该复制文件/
  • 谢谢 Adiii。我的 Dockerfile 在目标文件夹中作为 target/Dockerfile 并且依赖项也在目标文件夹中作为 target/dependency/BOOT-INF/lib
  • 如果 Dockerfile 在目标文件夹中,那么复制命令应该是 copy dependency/BOOT-INF/lin /home/app/
  • 谢谢你,Adiii。它成功了。如果我从目标文件夹发出构建命令,则构建成功。 --build-arg DEPENDENCY=/依赖工作。

标签: spring-boot docker dockerfile


【解决方案1】:

您的容器中的/app 文件夹是否已存在?如果没有,只需创建一个,然后再将文件复制到它。

【讨论】:

  • 感谢您的关注。我试图创建一个文件夹,但错误仍然相同。我已上传更新的 Dockerfile,但出现错误。
  • 需要到我的笔记本电脑上带上完全正常工作的 Dokerfile 来为您提供适当的帮助。如果没有人提出解决方案,我会带来更新。
  • 是的,正在等待更多有线索的答案。谢谢你,安德烈。
【解决方案2】:

正如评论中所讨论的,copy 命令基于构建上下文工作,所以这就是构建作为目标在构建上下文之外的原因。

如果 Dockerfile 在目标文件夹中,那么复制命令应该是

copy dependency/BOOT-INF/lin /home/app/

【讨论】:

    【解决方案3】:

    其实问题原因并没有那么复杂:

    COPY ./target/dependency/BOOT-INF/lib /app/lib
    

    复制失败:统计 /var/lib/docker/tmp/docker-builder226394005/target/dependency/BOOT-INF/lib: 没有这样的文件或目录

    这是什么意思?
    如果这些目录有效地存在于您的主机上,则意味着target 目录不是构建上下文的直接子目录。
    the build context 是什么?

    docker build 命令从一个 Dockerfile 和一个 “语境”。构建的上下文是位于 指定的 PATH 或 URL。构建过程可以引用任何文件 在上下文中。例如,您的构建可以使用 COPY 指令 在上下文中引用文件。

    当你执行:docker build -t myTag .时,上下文就是当前目录。
    所以只需将构建上下文调整为目标目录的父目录,它应该是正确的。
    例如布局:

    - docker
          - Dockerfile
    - src
    - target
    

    您应该将上下文作为基本目录并以这种方式设置 DockerFile 路径:

    docker build -t myTag -f docker/Dockerfile . 
    

    【讨论】:

      猜你喜欢
      • 2018-04-23
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多