Dockerfile 中的 COPY 和 ADD 命令无法正常工作

6
我们有一个 Dockerfile,内容如下:
FROM bitnami/tomcat

EXPOSE 8080
EXPOSE 8009

ADD values.war /opt/bitnami/tomcat/data/

除了values.war文件似乎从未被添加,我们...
docker exec -it values /bin/bash

请检查/opt/bitnami/tomcat/data/目录,确保war文件未被复制。

然而我们尝试了以下操作,当我们连接到Docker容器时发现该文件已被复制。

FROM bitnami/tomcat

EXPOSE 8080
EXPOSE 8009

RUN mkdir -p /var/app
ADD values.war /var/app

因此,我们认为问题出在目录上,因此我们尝试了以下操作。
FROM bitnami/tomcat

EXPOSE 8080
EXPOSE 8009

RUN ls -l /opt/bitnami/tomcat/data/

这产生了输出

ls: cannot access /opt/bitnami/tomcat/data/: No such file or directory

在构建镜像时

我们认为问题是因为FROM镜像bitnami/tomcat将该目录用作卷或类似物。这可能是原始的bitnami/tomcat图像中的代码,尽管我们不确定。

https://github.com/bitnami/bitnami-docker-tomcat/blob/master/9.0/Dockerfile

有关如何将文件添加到tomcat目录的任何想法吗?

3个回答

4

我是来自Bitnami的Sameer。

确实存在问题,是由于Dockerfile中定义的VOLUME导致的。我们认识到这是我们Dockerfile中的一个缺陷,并正在努力修复我们所有Dockerfile中的此问题。


3
这是在Dockerfile中定义卷的缺点之一,也是为什么我不建议在其中定义它们的原因。在构建过程中尝试修改卷中的文件时,docker的行为是未定义的,可能取决于您的docker版本或其他外部变量,因此为了可移植性,最好不要这样做。
由于您正在使用来自另一方的镜像,我建议向他们提出问题以删除该行(可以指向我的博客文章进行说明)。在此之前,您可以从github上查看其构建文件并更改Dockerfile以构建自己版本的基础镜像。
供参考,这里是从docker文档中定义Dockerfile中的卷的注释之一(快速说三次)。

在 Dockerfile 中更改卷的容量: 如果任何构建步骤在声明卷后更改卷内的数据,则这些更改将被丢弃。


好的,这与我们想的大致相同,尽管我们不知道具体情况。此外,您是否知道是否有任何可能在不分叉和更改构建文件的情况下解决此问题的方法(尽管似乎不太可能)? - MilindaD
我不知道其他的解决方法,除了直接将目录作为卷来管理,而不是尝试在构建脚本中更改文件。 - BMitch

2

我想告诉您,Bitnami Docker镜像不再在Dockerfile中声明VOLUME,这使得我们的用户更容易扩展和定制docker镜像。希望您会发现这个改变有帮助。

如果您有任何进一步的问题,请加入我们的社区:http://slack.oss.bitnami.com/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接