gpt4 book ai didi

java - 如何将其他位置的文件复制到 Docker 镜像中

转载 作者:行者123 更新时间:2023-12-02 02:13:07 25 4
gpt4 key购买 nike

我正在尝试将文件从其他位置(在 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 文件的第一个版本看起来像这样

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 依赖项创建卷以避免重新下载:-

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文件

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

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

这是 docker compose.xml

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命令来获取我准备好的构建。

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

现在我希望 Application_Build 文件夹中的构建应该复制到我的发布镜像中。所以我的发布 docker 文件看起来像

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}

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

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 命令进行复制。但没有任何作用。我怎样才能实现这个目标。

如果可以借助其他相对简单的流程来实现这一点。这也会有帮助。

最佳答案

Dockerfile 引用说:

ADD obeys the following rules:

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

关于java - 如何将其他位置的文件复制到 Docker 镜像中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49676902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com