关于Java:如何将文件从其他位置复制到Docker映像中

How to copy files from other location into Docker image

我正在尝试将文件从其他位置(在Windows也从共享驱动器的D驱动器中)复制到我的图像中。
但这给了我错误。

Step 5/8 : ADD ${APP_PATH}/${ARTIFACT}-${VERSION} /opt/tomcat/webapps/${ARTIFACT}-${VERSION}
ADD failed: stat /var/lib/docker/tmp/docker-builder990684261/d:/Application_Build/spring-tournament-portal-0.0.1-SNAPSHOT: no such file or directory

场景:

我正在尝试借助docker进行测试,构建,发布阶段循环。
因此,我的多阶段docker文件的第一个版本看起来像这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM maven as build
WORKDIR /usr/local
RUN mkdir app
COPY . /usr/local/app/spring-tournament-portal/
WORKDIR /usr/local/app/spring-tournament-portal
RUN mvn -e package

FROM
tomcat
ENV PORT 8080
ENV VERSION 0.0.1-SNAPSHOT
ENV ARTIFACT spring-tournament-portal
ENV JPDA_ADDRESS 8000
ENV JPDA_TRANSPORT dt_socket
COPY --from=build /usr/local/app/${ARTIFACT}/target/${ARTIFACT}-${VERSION}  /usr/local/tomcat/webapps/${ARTIFACT}-${VERSION}
WORKDIR /usr/local/tomcat/bin
CMD ["catalina.sh jpda run"]
EXPOSE ${PORT}

但是在每个构建中,maven都会获取其依赖项。因此,这花费了太多时间。
所以我提出了另一种方法。我创建了两个docker文件(一个用于构建,另一个用于发布)。

在这里,构建docker文件的作用是将所有源代码仅复制到映像中。这样,当我创建容器时,我可以轻松地为Maven依赖关系创建卷以避免重新下载:-

1
2
3
4
5
6
7
8
9
10
11
12
FROM indiver/tournament-base
RUN apt-get update && \\
        apt-get install -y \\
        -o APT::Install-Recommend=false -o APT::Install-Suggests=false \\
        maven

WORKDIR /usr/local
COPY . /spring-tournament-portal/
WORKDIR /spring-tournament-portal
COPY ./docker/dev/entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["sh","/usr/local/bin/entrypoint.sh"]
RUN ["chmod","+x","/usr/local/bin/entrypoint.sh"]

这是entrypoint.sh文件

1
2
3
#!/bin/bash
echo"$@" Phase is executing.....
mvn  clean"$@"

当我在docker-compose.xml的帮助下构建docker文件后运行映像时。我为依赖文件夹设置了音量。

这是docker compose.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version:"2"

services:
 test-service:
  build:
   context: ../../
   dockerfile: ./docker/dev/Dockerfile
  container_name:"test-service"
  command: 'test'
  volumes:
   - .m2:/root/.m2
 build-service:
  build:
   context: ../../
   dockerfile: ./docker/dev/Dockerfile
  container_name:"build-service"
  command: 'package'
  env_file:
    - ./EnvironmentConstant.env
  volumes:
   - .m2:/root/.m2
 database-service:
  container_name:"database-service"
  env_file:
    - ./EnvironmentConstant.env
  image: mysql
  ports:
   -"3306:3306"
  volumes:  
   - ./dev-mysql:/var/lib/mysql
  networks:
   -  app-network

networks:
 app-network:
  driver: bridge

因此不需要再次重新下载.m2卷中的依赖项。

之后,我需要创建具有由maven准备的构建内容的发行映像。但是构建服务的容器已经停止。所以我需要使用docker cp命令来获取准备好的版本。

1
docker cp build-service:/spring-tournament-portal/target/spring-tournament-portal-0.0.1-SNAPSHOT D:/Application_Build

现在我希望将Application_Build文件夹中的版本复制到我的发布映像中。
所以我发布的docker文件看起来像

1
2
3
4
5
6
7
8
9
FROM indiver/tournament-release

ENV APP_PATH=d:/Application_Build
ENV ARTIFACT=spring-tournament-portal
ENV VERSION=0.0.1-SNAPSHOT
ADD ${APP_PATH}/${ARTIFACT}-${VERSION} /opt/tomcat/webapps/${ARTIFACT}-${VERSION}
WORKDIR /opt/tomcat/bin
ENTRYPOINT ["catalina.sh","jpda","run"]
EXPOSE ${PORT}

但是正如我上面提到的,它给了我错误

1
Step 5/8 : ADD ${APP_PATH}/${ARTIFACT}-${VERSION} /opt/tomcat/webapps/${ARTIFACT}-${VERSION} ADD failed: stat /var/lib/docker/tmp/docker-builder990684261/d:/Application_Build/spring-tournament-portal-0.0.1-SNAPSHOT: no such file or directory.

我试图通过COPY和ADD命令进行复制。但是没有任何效果。我怎样才能做到这一点。

如果可以借助其他相对容易的流程来实现。也会有帮助。


所以我也面临着类似的问题。
您可以尝试使用下面列出的命令,并用路径替换方括号:

" docker cp / [您的源目录] [ContainerId]:/ [目标路径]"


总体而言,您的方法对我来说似乎太复杂了,这是一种非常非微服务的处理方式。

我建议您将依赖项复制到正在创建的二进制文件中,以创建一个自包含的胖(超级)jar,您可以将其复制到docker映像中,就像spring boot那样。

您为不同的环境使用单独的docker文件的方法也是有问题的,并且可能导致生产中出现意外情况。


Dockerfile参考说明:

ADD obeys the following rules:

The path must be inside the context of the build.
...