docker 工作区中未添加文件

Files not getting added in docker workspace

我有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>

WORKDIR 行之前尝试此操作:

RUN mkdir /code

首先,不要忘记 ADD <src>... <dest> can invalidate the cache for all following instructions from the Dockerfile if the contents of <src> have changed. See "Best practices" and use 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 returns.

还有:

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

OP Legendary Hunter confirms 文件在那里。

问题来自 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 形式,每个参数在其自己的双引号中),并保留 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