2

我有码头文件

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>
4

2 回答 2

1

首先,不要忘记,如果 Dockerfile 的内容已更改ADD <src>... <dest>,这会使 Dockerfile 中的所有后续指令的缓存无效。<src>请参阅“最佳实践”并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 传奇猎人评论中确认文件在那里。

问题来自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
于 2016-02-17T13:46:08.203 回答
0

在行前试试这个WORKDIR

RUN mkdir /code
于 2016-02-17T13:29:47.677 回答