gpt4 book ai didi

java - 文件未添加到 docker 工作区

转载 作者:行者123 更新时间:2023-11-30 10:49:23 25 4
gpt4 key购买 nike

我有docker文件

FROM java:8
# Install maven
RUN apt-get update
RUN apt-get install -y maven


WORKDIR /code/

# Prepare by downloading dependencies
#ADD pom.xml /mmt/CouchBaseClient/CB-RestAPI/CacheService/pom.xml
#RUN ["mvn", "dependency:resolve"]
#RUN ["mvn", "verify"]
ADD cacheService-0.0.1-SNAPSHOT.jar /code/cacheService-0.0.1-SNAPSHOT.jar
ADD couchclient-0.0.1-SNAPSHOT.jar /code/couchclient-0.0.1-SNAPSHOT.jar

EXPOSE 4567
CMD ["/usr/lib/jvm/java-8-openjdk-amd64/bin/java", "-jar", "couchclient-0.0.1-SNAPSHOT.jar server cacheService.yml" ]

当我构建这个文件时,我得到以下输出

Sending build context to Docker daemon 35.46 MB
Step 1 : FROM java:8
---> 736600fd4ae5
Step 2 : RUN apt-get update
---> Using cache
---> a3466698c29d
Step 3 : RUN apt-get install -y maven
---> Using cache
---> d0fb8e77f89a
Step 4 : WORKDIR /code/
---> Using cache
---> 197735d2da02
Step 5 : ADD cacheService-0.0.1-SNAPSHOT.jar /code/cacheService-0.0.1-SNAPSHOT.jar
---> 9ba30f5a2144
Removing intermediate container bd3c072ebbc6
Step 6 : ADD couchclient-0.0.1-SNAPSHOT.jar /code/couchclient-0.0.1-SNAPSHOT.jar
---> ef59315ed7fe
Removing intermediate container 0da1a69bdb51
Step 7 : EXPOSE 4567
---> Running in a2b32799dd6c
---> 3fb2b534d7c5
Removing intermediate container a2b32799dd6c
Step 8 : CMD /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar couchclient-0.0.1-SNAPSHOT.jar server cacheService.yml
---> Running in efb44e2bcdb3
---> 56637dfacc0d
Removing intermediate container efb44e2bcdb3
Successfully built 56637dfacc0d

但是没有创建名为 code 的目录,因此即使没有编译错误也没有添加任何文件

@VonC 建议使用的方法

ENTRYPOINT ["/usr/lib/jvm/java-8-openjdk-amd64/bin/java", "-jar", "couchclient-0.0.1-SNAPSHOT.jar" ]

然后使用这个命令来运行镜像

docker run <image> -d <arguments>

最佳答案

首先,不要忘记 ADD <src>... <dest> 如果 <src> 的内容,可以使来自 Dockerfile 的所有后续指令的缓存无效已改变。请参阅“Best practices”并使用 COPY 而不是 ADD .

在这两种情况下(ADDCOPY),如果 <dest>不存在,它连同其路径中所有缺失的目录一起创建。
所以没有 mkdir必要的。

COPY cacheService-0.0.1-SNAPSHOT.jar /code/ 
COPY couchclient-0.0.1-SNAPSHOT.jar /code/

否则,文件 cacheService-0.0.1-SNAPSHOT.jar文件夹/code/cacheService-0.0.1-SNAPSHOT.jar/ !

最后,要确定文件在它们应该在的位置,打开 bash:

docker run --rm -it <yourImage> bash

或者,如果您有一个正在运行的容器:

docker exec -it <yourContainer> bash

然后检查什么ls /code返回。

还有:

docker run --rm -it --entrypoint /bin/sh <yourImage> -c "ls -alrt"

OP Legendary Hunter确认 in the comments文件在那里。

问题来自 CMD 这不是完整的 exec 形式。
每个参数都应该在自己的引号中:

CMD ["/usr/lib/jvm/java-8-openjdk-amd64/bin/java", "-jar", "couchclient-0.0.1-SNAPSHOT.jar", "server", "cacheService.yml" ]

如果最后的参数组合在一起,CMD尝试访问名为“couchclient-0.0.1-SNAPSHOT.jar server cacheService.yml”的 jar 文件,该文件显然不存在。
因此错误信息:

"Error: Unable to access jarfile couchclient-0.0.1-SNAPSHOT.jar server cacheService.yml"

而不是使用 CMD , 使用 ENTRYPOINT (使用相同的 exec 形式,每个 arg 在其自己的双引号中),并离开 CMD未定义。
这样,您将添加到 docker run 的参数命令将传递给 ENTRYPOINT (运行 java -jar ... )

因为“server”、“cacheService.yml”是要传递给正在运行的容器的两个参数:

ENTRYPOINT ["/usr/lib/jvm/java-8-openjdk-amd64/bin/java", "-jar", "couchclient-0.0.1-SNAPSHOT.jar" ]

构建然后:

docker run --rm -it <image> server cacheService.yml

一旦您知道它正在工作,就以分离模式启动它:

docker run -d <image> server cacheService.yml

关于java - 文件未添加到 docker 工作区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35457585/

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