当运行此命令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文件将作为目录挂载到容器中,而不是作为文件。
我检查了Single file volume mounted as directory in 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"我有如下的build.sh文件,
#!/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现在我们从gocd环境中调用build.sh文件。看起来像在docker- in - docker (dind)中执行的docker run命令,因此客户端在不同的主机上生成docker容器,并且正在创建的文件(api_tests.conf)在该不同的主机上不存在。由于此文件(api_tests.conf)在容器中作为空目录挂载。
在docker- in -docker环境中挂载文件有哪些不同的解决方案?我们是否可以共享我们创建的文件(api_tests.conf)来托管docker容器的派生位置?
发布于 2019-09-10 20:28:53
我认为您遇到的问题很可能是因为使用了dind,尽管值得指出的是,如果您将docker socket也挂载到另一个容器中,也会出现此问题。
这是因为当您请求docker守护进程挂载目录时,您实际上是docker客户端(cli)挂载文件/目录本身,它只是将一个请求传递给docker守护进程以从其本地文件系统挂载此位置。这就是问题所在,因为如果您使用dind或共享docker.socket,通常情况下,这不是您认为的位置,因此从守护进程的角度来看,文件/目录不存在。
因此,在您的示例中,$(pwd)可能会被展开到某个众所周知的/现有目录路径,然后docker守护进程将挂载此目录部分,因为该文件不存在。这至少是我的猜测,因为我以前在其他设置中使用dind/docker.socket共享时也看到过类似的行为。
一种疯狂的解决方案是在启动时将所需的文件绑定挂载到dind容器中,然后可以尝试将这些文件从dind容器中绑定挂载到任何后续容器中。但是请记住,由于不稳定和潜在的数据丢失,dind文档中对这种文件系统的使用提出了警告,因此要加以警告。
希望这能有所帮助。
https://stackoverflow.com/questions/57867130
复制相似问题