-1

我正在尝试使用 dockerfile 构建 docker 映像,我的目的是在运行“docker run”命令时将文件复制到特定文件夹中!

这是我的 dockerfile 代码:

    FROM openjdk:7

    MAINTAINER MyPerson

    WORKDIR /usr/src/myapp

    ENTRYPOINT ["cp"]

    CMD ["/usr/src/myapp"]

    CMD ls /usr/src/myapp

在没有任何错误的情况下构建我的图像后(使用 docker build 命令),我尝试运行我的新图像:

    docker run myjavaimage MainClass.java

我得到了这个错误:** cp:'MainClass.java'之后缺少目标文件操作数**

我该如何解决这个问题?谢谢

4

3 回答 3

1

两件事情。

  1. 你已经用过CMD两次了。

CMD只能使用一次,将其视为您的 docker 映像的用途。每次运行容器时,CMD如果您想要多个命令,它将始终执行,您应该使用RUN,然后最后,使用CMD

FROM openjdk:
MAINTAINER MyPerson
WORKDIR /usr/src/
ENTRYPOINT ["cp"]
RUN /usr/src/myapp
RUN ls /usr/src/myapp
  1. 将东西复制到图像中有一个简单的命令COPY,其语法是COPY <from-here> <to-here>

好像你想跑步myjavaimage,所以你要做的是

COPY /path/to/myjavaimage /myjavaimage
CMD myjavaimage MainClass.java

在您看到箭头的地方,我刚刚编写了虚拟代码。用正确的代码替换它。

此外,您的 Dockerfile 创建不正确。

ENTRYPOINT -> 不确定你为什么要做“cp”,但它是一个实际的入口点。可以指向项目的根目录或将要运行的应用程序。不明白您为什么要这样做,ls /usr/src/myapp但如果您确实想这样做,请使用RUN而不是CMD

最后,调试 docker 容器的最佳方式是交互模式。这意味着 ssh 进入你的容器,环顾四周,运行代码,看看有什么问题。

运行这个:docker run -it <image-name> /bin/bash然后查看内部,这通常是查看导致问题的最佳方法。

于 2019-11-12T12:09:32.420 回答
1

我想你想要这个 Dockerfile:

FROM openjdk:7
WORKDIR /usr/src/myapp
COPY MainClass.java .
RUN javac MainClass.java
ENV CLASSPATH=/usr/src/myapp
CMD java MainClass

当您创建docker build此映像时,它会将COPY您的 Java 源文件从本地目录放入映像中,对其进行编译,并设置一些元数据,告诉 JVM 在哪里可以找到生成的.class文件。然后,当您启动容器时,它将运行您在其中打包的单个应用程序。

使用 Maven 或 Gradle 等更高级别的构建工具将多个文件编译成一个.jar文件是很常见的。在运行构建之前,请确保COPY您需要的所有源文件。.jar在 Java 中,在 Docker 之外构建文件似乎很常见,COPY而且不需要 JDK,这也是一个合理的路径。

在您显示的 Dockerfile 中,DockerENTRYPOINT和组合CMD成一个命令,并将该命令作为容器的单个主进程运行。如果您在命令中提供某种命令,则会docker run覆盖CMD但不会覆盖ENTRYPOINT. 你只得到一个ENTRYPOINT和一个CMD,Dockerfile 中的最后一个获胜。因此,您正在尝试运行容器进程,例如

# What's in the Dockerfile
cp /bin/sh -c "ls /usr/src/myapp"

# Via your docker run command
cp MainClass.java

正如@QuintenScheppermans 在他们的回答中建议的那样,您可以使用一个docker run -v选项在运行时注入文件,但这将在类似命令RUN javac已经发生之后发生。您并不真正想要一个工作流,每次您docker run使用容器时都会重新构建整个应用程序。docker build在此期间或之前构建映像。

于 2019-11-12T11:37:08.793 回答
0

这个 stackoverflow 页面完美地回答了你的问题。

COPY foo.txt /data/foo.txt
# where foo.txt is the relative path on host
# and /data/foo.txt is the absolute path in the image

如果在运行命令时需要挂载文件:

docker run --name=foo -d -v ~/foo.txt:/data/foo.txt -p 80:80 image_name
于 2019-11-12T09:22:39.087 回答