我正在尝试将文件从其他位置(在Windows中从D驱动器也是共享驱动器)复制到我的图像。 但它给了我错误。
步骤5/8:添加$ {APP_PATH} / $ {ARTIFACT} - $ {VERSION} / opt / tomcat / webapps / $ {ARTIFACT} - $ {VERSION} ADD失败:stat /var/lib/docker/tmp/docker-builder990684261/d:/Application_Build/spring-tournament-portal-0.0.1-SNAPSHOT:没有这样的文件或目录
情景:
我试图在docker的帮助下进行测试,构建,发布阶段循环。 所以我的Multistage 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命令进行复制。但没有任何工作。我怎样才能做到这一点。
如果可以通过其他相对容易的流程来实现这一点。它也会有所帮助。
答案 0 :(得分:1)
总体而言,您的方法对我来说似乎过于复杂,而且非常微观的服务方式。
我建议您将依赖项复制到您正在创建的二进制文件中,以创建一个自包含的胖(uber)jar,您可以将其复制到docker镜像,就像spring boot一样。
您为不同环境设置单独的docker文件的方法也存在问题,可能会导致生产中出现意外情况。
答案 1 :(得分:1)
所以我也遇到了类似的问题。 您可以尝试下面列出的命令,并用您的路径替换方括号:
“ docker cp / [您的源目录] [ContainerId]:/ [目标路径] ”
答案 2 :(得分:0)
Dockerfile引用说:
ADD遵守以下规则:
路径必须位于构建的上下文中 ...