文件装载为目录,而不是docker中docker中的文件(dind)

文件装载为目录,而不是docker中docker中的文件(dind),docker,kubernetes,dockerfile,go-cd,Docker,Kubernetes,Dockerfile,Go Cd,当运行此命令时,docker run--rm-v$(pwd)/api_tests.conf:/usr/config/api_tests.conf--name-api automation local.artifactory.swg devops.com/api automation文件将作为容器中的目录而不是文件装载 我讨论了堆栈溢出和其他一些类似的问题,但无法得到正确的解决方案 我已经在本地mac笔记本电脑中测试了相同的代码,这里的文件作为文件从本地机器装载到容器中,但在本地我没有docker

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

我讨论了堆栈溢出和其他一些类似的问题,但无法得到正确的解决方案

我已经在本地mac笔记本电脑中测试了相同的代码,这里的文件作为文件从本地机器装载到容器中,但在本地我没有docker中的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-in-docker(docker-in-docker)中执行的
docker-run
命令,结果客户端在不同的主机上生成docker容器,并且正在创建的文件(
api_-tests.conf
)在不同的主机上不存在。 由于此文件(
api_tests.conf
)正在容器中作为空目录装入

在docker环境中,在docker中装载文件有哪些不同的解决方案?
我们是否可以共享我们创建的文件(
api_tests.conf
),该文件用于托管docker容器生成的位置?

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

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

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

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


希望这有帮助。

为什么您要在docker中使用docker,而不是将主机的docker套接字安装在第一个docker容器中,以便透明地使用它?@wolmi这是Devops团队/架构师在我们的组织中完成的设置,我们只需要在此环境中运行容器。我将尝试与devops团队就docker套接字进行检查。