docker从一个容器复制文件到另一个容器?

时间:2016-08-20 10:15:37

标签: docker docker-compose dockerfile

这是我想要做的:

  1. docker-compose build
  2. docker-compose $ COMPOSE_ARGS运行--rm task1
  3. docker-compose $ COMPOSE_ARGS运行--rm task2
  4. docker-compose $ COMPOSE_ARGS运行--rm combine-both-task2
  5. docker-compose $ COMPOSE_ARGS run --rm selenium-test
  6. 还有一个看起来像这样的docker-compose.yml:

    task1:
      build: ./task1
      volumes_from:
        - task1_output
      command: ./task1.sh
    
    task1_output:
      image: alpine:3.3
      volumes:
        - /root/app/dist
      command: /bin/sh
    
    # essentially I want to copy task1 output into task2 because they each use different images and use different tech stacks... 
    task2:
      build: ../task2
      volumes_from:
        - task2_output
        - task1_output:ro
      command: /bin/bash -cx "mkdir -p task1 && cp -R /root/app/dist/* ."
    

    所以现在所有必需的文件都在task2容器中...如何启动Web服务器并在task2中公开包含内容的端口?

    我被困在这里......如何从我的combine-tasks / Dockerfile中的task2_output访问这些东西:

    combine-both-task2:
      build: ../combine-tasks
      volumes_from:
         - task2_output
    

2 个答案:

答案 0 :(得分:12)

在最新版本的docker中,named volumes replace data containers是在容器之间共享数据的简便方法。

docker volume create --name myshare
docker run -v myshare:/shared task1
docker run -v myshare:/shared -p 8080:8080 task2
...

这些命令将设置一个本地卷,-v myshare:/shared参数将使该共享可用作每个容器内的文件夹/shared

在撰写文件中表达:

version: '2'
services:
  task1:
    build: ./task1
  volumes:
    - 'myshare:/shared'

  task2:
    build: ./task2
  ports:
    - '8080:8080'
  volumes:
    - 'myshare:/shared'

volumes:
  myshare:
    driver: local 

为了测试这个,我做了一个小项目:

- docker-compose.yml (above)
- task1/Dockerfile
- task1/app.py
- task2/Dockerfile

我将节点的http服务器用作task2/Dockerfile

FROM node
RUN npm install -g http-server
WORKDIR /shared
CMD http-server

task1/Dockerfile使用python:alpine来显示两个不同的堆栈写作和阅读。

FROM python:alpine
WORKDIR /app
COPY . .
CMD python app.py

这里是task1/app.py

import time

count = 0
while True:
  fname = '/shared/{}.txt'.format(count)
  with open(fname, 'w') as f:
    f.write('content {}'.format(count))
    count = count + 1
  time.sleep(10)

获取这四个文件,然后通过docker compose up中的docker-compose.yml运行它们 - 然后访问$ DOCKER_HOST:8080以查看稳定更新的文件列表。

此外,我正在使用泊坞版1.12.0并撰写版本1.8.0,但这应该适用于几个版本。

请务必查看docker docs,了解我可能在这里错过的详细信息:
https://docs.docker.com/engine/tutorials/dockervolumes/

答案 1 :(得分:1)

对我来说,从文件复制或复制到容器的最佳方法是使用docker cp,例如: 如果要将schema.xml apacheNutch 容器复制到 solr 容器,则:

  1. docker cp apacheNutch:/root/nutch/conf/schema.xml /tmp/schema.xml 服务器/ solr / configsets / nutch /

  2. docker cp /tmp/schema.xml solr:/opt/solr-8.1.1/server/solr/configsets/nutch/conf