Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将本地文件系统复制到Docker容器中_Docker_Docker Compose - Fatal编程技术网

如何将本地文件系统复制到Docker容器中

如何将本地文件系统复制到Docker容器中,docker,docker-compose,Docker,Docker Compose,我有一个本地项目目录结构,如: config test docker-compose.yaml DockerFile pip-requirements.txt src app app.py 我正在尝试使用Docker启动一个容器来运行app.py。概念上很简单,但事实证明这非常困难。我将Docker文件保存在一个单独的子文件夹中,因为我计划拥有大量不同的环境,并且我不想用几十个文件(如Dockerfile.1,Do

我有一个本地项目目录结构,如:

config
    test
        docker-compose.yaml
        DockerFile
        pip-requirements.txt
src
    app
        app.py
我正在尝试使用Docker启动一个容器来运行app.py。概念上很简单,但事实证明这非常困难。我将Docker文件保存在一个单独的子文件夹中,因为我计划拥有大量不同的环境,并且我不想用几十个文件(如
Dockerfile.1
Dockerfile.2
等)将我的顶级文件夹弄乱

我的docker-compose.yaml看起来像:

version: '3'
services:
    worker:
        image: myname:mytag
        build:
            context: .
            dockerfile: ./Dockerfile
        volumes:
            -  ./src/app:/usr/local/myproject/src/app
FROM python:2.7

# Set the working directory.
WORKDIR /usr/local/myproject/src/app

# Copy the current directory contents into the container.
COPY src/app /usr/local/myproject/src/app
COPY pip-requirements.txt pip-requirements.txt

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r pip-requirements.txt

# Define environment variable
ENV PYTHONUNBUFFERED 1

CMD ["./app.py"]
我的Dockerfile看起来像:

version: '3'
services:
    worker:
        image: myname:mytag
        build:
            context: .
            dockerfile: ./Dockerfile
        volumes:
            -  ./src/app:/usr/local/myproject/src/app
FROM python:2.7

# Set the working directory.
WORKDIR /usr/local/myproject/src/app

# Copy the current directory contents into the container.
COPY src/app /usr/local/myproject/src/app
COPY pip-requirements.txt pip-requirements.txt

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r pip-requirements.txt

# Define environment variable
ENV PYTHONUNBUFFERED 1

CMD ["./app.py"]
如果从项目的顶级目录运行:

docker-compose -f config/test/docker-compose.yaml up
它成功构建映像,但尝试运行映像时失败,错误为:

ERROR: for worker  Cannot start service worker: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"./app.py\": stat ./app.py: no such file or directory": unknown
如果我使用以下工具检查映像的文件系统:

docker run --rm -it --entrypoint=/bin/bash myname:mytag

它正确地将我转储到
/usr/local/myproject/src/app
中。但是,此目录为空,说明了运行时错误。为什么这是空的?
COPY
语句和
volumes
不应该用我的应用程序代码填充图像吗?

首先,在构建阶段包含内容,然后使用docker compose在上面覆盖一个目录,从而对数据集进行破坏。让我们首先讨论Dockerfile(图像)和Docker compose(运行时)之间的区别

通常,您会使用dockerfile中的
COPY
指令将本地目录的组件复制到映像中,使其不可变。在大多数应用程序部署中,这意味着我们将整个应用程序捆绑到目录中并准备运行。这意味着它不是动态的(意味着您对代码所做的更改在容器中是不可见的),而是安全性方面的优势

Docker compose是一个运行时规范,意思是“一旦我有了一个映像,我希望以编程方式定义它的运行方式”。通过在这里定义一个卷,您的意思是“我希望本地目录(从撰写文件的角度)
/src/app
覆盖到
/usr/local/myproject/src/app

因此,你在图像中构建的任何东西都不重要。你在图像的顶部添加了另一层,它将覆盖图像中构建的内容

这也可能与您已经指定了Workdir,然后在CMD中指定了./reference有关。值得尝试一下,就像
CMD[“app.py”]

如果你

  • 构建映像:
    docker Build-t“test”。
  • 手动运行映像:
    “docker运行--rm-it测试”

  • 手动运行它,我会得到相同的错误。删除“/”没有什么区别,因为文件不存在于任何地方。COPY/volume语句实际上被忽略,并且没有应用程序代码被复制到容器中。