【问题标题】:Access docker volume files from different container running .Net core从运行 .Net 核心的不同容器访问 docker 卷文件
【发布时间】:2020-01-17 11:20:09
【问题描述】:

我有一个运行许多容器的 docker compose,包括一个带有 .Net 核心代码的容器和一个 dd-agent 容器。

我注意到 dd-agent 容器使用了一个卷,我需要使用在另一个容器中运行的代码访问该卷中的文件。

我试过用:

var path = System.Reflection.Assembly.GetExecutingAssembly().Location;
var root = Path.GetPathRoot(path);
var files = Directory.GetFiles(root, "*.log", SearchOption.AllDirectories);

但文件列表不包含我在运行时可以在卷中看到的文件:

docker run --rm -i -v=myvolume:/tmp/myvolume busybox find /tmp/myvolume

关于如何获取卷文件的任何想法?

Docker 撰写:

version: "3.7"
volumes:
  logs:
services:
  localstack:
    image: localstack/localstack
    container_name: localstack
    environment:
      - SERVICES=s3,dynamodb
      - AWS_DEFAULT_REGION=eu-west-1
      - HOSTNAME_EXTERNAL=localstack
      - HOSTNAME=localstack
      - AWS_ACCESS_KEY_ID=test
      - AWS_SECRET_ACCESS_KEY=test
    ports:
      - "4572:4572"
      - "4569:4569"
  aws-cli:
    container_name: aws-cli
    image: mesosphere/aws-cli
    volumes:
      - ./../script:/script
    environment:
      - AWS_DEFAULT_REGION=eu-west-1
      - AWS_SECRET_ACCESS_KEY=test
      - AWS_ACCESS_KEY_ID=test
    entrypoint: /script/aws.sh
    depends_on:
      - localstack
  dd-agent:
    container_name: dd-agent
    image: datadog/agent:latest
    ports:
      - "8126:8126"
    environment:
      - DD_APM_ENV=test
      - DD_API_KEY={}
      - DD_PROCESS_AGENT_ENABLED=true
      - DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true
      - DD_APM_ENABLED=true
      - DD_APM_NON_LOCAL_TRAFFIC=true
      - DD_LOG_LEVEL=info
      - DD_HOSTNAME=datadoghq
    volumes:
      - logs:/var/log/datadog
  myapi:
    container_name: myapi
    restart: unless-stopped
    build:
      target: final
      args:
        RELEASETYPE: "Debug"
      context: ./../
      dockerfile: path/Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - DD_AGENT_HOST=dd-agent
      - DD_ENV=test
      - DD_LOGS_INJECTION=true
      - DD_SERVICE_NAME=test
      - DD_TRACE_AGENT_PORT=8126
      - DD_TRACE_AGENT_URL=http://dd-agent:8126
      - DD_TRACE_DEBUG=true
      - DD_TRACE_ENABLED=true
      - DD_TRACE_LOG_PATH=/var/log/datadog/dotnet-profiler.log
      - FLUENTD_PORT=24224
      - FLUENTD_RETRIES=3
    volumes:
      - logs:/var/log/datadog
      - type: bind
        source: ../src
        target: /src/src
    ports:
      - 1990:80
    depends_on:
      - aws-cli

【问题讨论】:

  • 您需要将相同的卷挂载到两个容器中。如果您尝试通过直接的 docker run 命令执行操作,请注意 Compose 会重命名卷和网络等内容,因此您需要使用类似 docker volume ls 的命令来查找实际的卷名。

标签: c# docker .net-core


【解决方案1】:

我认为您不能从另一个容器访问一个容器的文件。即使使用docker cp,您也只能将文件从容器复制到主机。也不允许从容器复制到容器。我建议为您要访问的文件安装一个公共卷。这样您就可以使用主机中的挂载文件夹作为中介来访问它们

service:
    
    service1:
        volumes:
            - ./temp_on_host:/path-to-the-directory-you-want-to-access-through-code
    
   service2:
        volumes:
           - ./temp_on_host:/any_path_in_the_container_which_your_code_can_access

现在你的service2中的代码可以间接访问service1中指定目录下的文件

【讨论】:

  • 当使用共享卷时,dd-agent 容器仍然将文件写入它创建的随机卷,我可以共享吗?
  • 是的,只需在主机上挂载一些公共卷并连接各自容器中的两个目录。不确定是否是最好的方法,但它是一种方法。
  • 发布您的 docker-compose 以了解更多详情
  • 我已经发布了我的 docker-compose,我看到日志卷由 2 个容器共享和链接,但它是空的,并且 dd-agent 正在使用不同的自动创建卷
  • 这里的日志是什么?尝试在日志中创建一个文件,看看它是否反映在容器的映射目录中。告诉我这是否有效。我认为您应该提供类似 ./logs 或 ../logs 之类的路径
猜你喜欢
  • 2017-07-10
  • 2020-11-21
  • 2019-12-18
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 2017-12-29
相关资源
最近更新 更多