Dockerfile 可以 COPY 文件到声明的卷中,但是 RUN 不能创建文件?

标签 docker dockerfile

我一直在经历一些关于音量的奇怪行为。我们有一个包含数据库的容器,并且预计会从包含数据的主机绑定(bind)挂载文件夹。我正在尝试创建一个附带测试数据的子容器,因为它仅用于测试。

这要求在构建步骤中,从主机复制一些数据,然后运行一些创建附加文件的脚本。然而,我注意到,当我查看正在运行的容器时,只存在复制的文件,而脚本创建的文件不存在。我已经将步骤归结为以下 docker 文件:

FROM ubuntu:xenial-20180112.1

VOLUME /test

COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt

请注意,当我 bash 进入正在运行的容器并执行
ls -l /test

我只得到'copydir'文件夹。但是,如果我在 dockerfile 中运行 ls,我会看到两个文件夹都存在。

这里发生了什么?

编辑:

对于其他上下文,以下打印出两个目录都存在:
FROM ubuntu:xenial-20180112.1

VOLUME /test

COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt && \
    ls -l /test

但以下仅表明存在copydir:
FROM ubuntu:xenial-20180112.1

VOLUME /test

COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt

RUN ls -l /test

最佳答案

我对此没有确切的解释,但是当您使用 Dockerfile 构建镜像时,它将使最轻的镜像成为可能。当您使用 RUN 时,您不会使数据持久化,但您只会执行一个操作,该操作会给出不会保留在图像中的结果。

请注意,apt-get 和 yum 命令使安装持续存在。这有点奇怪。

关于Dockerfile 可以 COPY 文件到声明的卷中,但是 RUN 不能创建文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50000216/

相关文章:

Docker Swarm 错误响应

java - 将 .jar 许可证文件添加到 Docker 镜像的类路径?

python - Docker群服务到服务调用

windows - Docker构建请求访问被拒绝,存储库不存在或可能需要

docker - 如何防止在Dockerfile的中间步骤中丢失RabbitMQ设置?

php - 在Docker中自动构建最新的PHP补丁版本?

sql-server - 如何将 .bacpac 导入 docker Sqlserver?

angularjs - docker compose 中的 Angular 不会重新加载更改

shell - 如何防止对我的 docker 容器的 root 访问

docker - 在docker中启动的Spring Boot应用程序无法访问环境变量