当前位置: 首页 > 知识库问答 >
问题:

文件在docker-in-docker(dind)中作为目录而不是文件挂载

柯栋
2023-03-14

运行此命令docker run--rm-v$(pwd)/api_tests.conf:/usr/config/api_tests.conf--name api-automation local.artifactory.swg-devops.com/api-automation时,api_tests.conf文件将作为目录而不是文件装入容器中。

我在Docker中通过单个文件卷挂载为目录,以及其他一些类似的堆栈溢出问题,但无法得到正确的解决方案。

我已经测试了相同的代码在本地mac笔记本电脑和这里的文件从本地机器挂载到容器作为一个文件,但在本地,我没有docker-in-docker设置。

我有Dockerfile如下所示。

FROM alpine:latest
MAINTAINER Basavaraj 
RUN apk add --no-cache python3 \
    && pip3 install --upgrade pip
WORKDIR /api-automation
COPY . /api-automation
RUN pip --no-cache-dir install .
ENTRYPOINT "some command"

#!/bin/bash
docker pull local.artifactory.swg-devops.com/api-automation

# creating file with name "api_tests.conf" by adding configuration data
echo "configuration data" > api_tests.conf

# it displays all the configuration data written to api_tests.conf
cat $(pwd)/api_tests.conf

docker run --rm -v $(pwd)/api_tests.conf:/usr/.aiops/config/api_tests.conf --name api-automation local.artifactory.swg-devops.com/api-automation

在docker-in-docker环境中挂载文件有哪些不同的解决方案?我们可以共享我们创建的用来承载docker容器的文件(api_tests.conf)吗?

共有1个答案

仇阳州
2023-03-14

我认为您遇到的问题很可能是因为使用了dind,尽管值得指出的是,如果您将docker套接字也挂载到另一个容器中,也会出现这个问题。

这是因为当您要求docker守护进程挂载一个目录时,您就是docker客户端(cli)实际上挂载了文件/目录本身,它只是向docker守护进程传递一个请求,从它的本地文件系统挂载这个位置。这就是问题所在,因为如果您使用dind或共享docker.socket,通常这并不是您认为的地方,因此从守护进程的角度来看,文件/目录并不存在。

因此,在您的示例中,$(pwd)可能被扩展到某个已知的/现有目录路径,然后docker守护进程将挂载这个目录部分,因为该文件不存在。这至少是我的猜测,因为我以前在其他设置中使用dind/docker.socket共享时看到过类似的行为。

一个疯狂的解决方案是在启动时将您想要的文件绑定到dind容器中,然后您可以尝试随后将这些文件从dind容器中绑定到任何后续容器中。但是,请记住,这正是dind文档中警告的那种文件系统用法,因为它不稳定和潜在的数据丢失,所以请注意。

希望这有帮助。

 类似资料:
  • 问题内容: Docker文档指出,可以将单个文件装载到Docker容器中: -v标志还可用于从主机挂载单个文件-而不是目录。 这会将您放入新容器中的bash外壳中,您将从主机获得bash历史记录,退出容器时,主机将具有在容器中键入命令的历史记录。 但是,当我尝试将文件挂载为目录时: 我的Dockerfile看起来像这样: Docker版本为1.9.1,内部版本为a34a1d5。 这是文档问题,还是

  • 通过前面小节的学习我们知道:使用Docker时,产生的数据默认是保存到容器的UnionFS的读写层中的。那么,我们不妨思考下这两个问题: 如果不启动容器却想访问数据该怎么办? 容器被销毁或损坏,数据也就消失了,这合理吗? 是的,我想我们的答案应该是一样的,容器和数据不应该被绑定在一起。为此,Docker 提供了两类数据管理的方式: 挂载宿主机目录或文件; 使用数据卷; 本节,我们将介绍如何将宿主机

  • 我正在设置一个使用docker compose的vscode dev容器。我需要初始化mongo中的副本集,该副本集使用需要bash脚本的第二个安装容器。 我的目录结构是: 然后,我将脚本目录装载到我的容器中: 通过检查该容器的输出,ls-la/scripts命令显示mongosetup。sh已经成为一个文件夹,所以我无法运行它。。。 我试着将文件和卷装载为“.scripts:/scripts”。

  • docker-compose.yml文件中配置redis 在/app/redis下生成了redis.conf目录而不是redis.conf文件,要怎么修改才能生成文件呢? 手动将redis.conf目录删除后改成文件后启动报错

  • -v标志还可以用于从主机装入单个文件(而不仅仅是目录)。 这将使您进入一个新容器中的bash shell,您将获得来自主机的bash历史记录,当您退出容器时,主机将获得在容器中键入的命令的历史记录。 Docker版本为1.9.1,版本为A34A1D5。 这是一个文件问题,是我这边的一个误解,还是有其他的事情发生了?

  • 问题内容: 我在Windows中使用Docker Toolbox,并尝试将Windows文件夹安装在docker-compose.yml文件中,如下所示: 我的目标是将Docker Toolbox已经创建的boot2docker VM映像安装到该映像,然后从该映像加载到其中的nginx容器。 不幸的是,它不起作用。我在boot2docker映像中找到一个文件夹sss,但是它没有指定我的Window