将本地目录挂载到Docker Container

时间:2017-08-01 14:10:27

标签: python docker docker-compose dockerfile

我想将Docker用于我用Python进行数据处理的项目。假设我的代码位于名为code的目录(由分析的不同步骤的多个python文件组成)和我的数据在目录data中。一种解决方案是添加代码和数据,如下所示:

# Dockerfile
FROM debian:stable-slim
RUN apt-get update && apt-get install -y python-pip
ADD code /code
ADD data /data
WORKDIR /code
CMD python

然后我可以使用docker run -i someName pythonFile1.py运行code中的一个文件。但我在这里遇到的问题是每次更改代码或数据时都需要重新运行docker build .

所以我尝试使用docker-compose将这两个目录包含在卷中:

#docker-compose.yml
version: '2'
services:
    myProject:
        build: .
        volumes:
            - ./code:/code
            - ./data:/data
# Dockerfile
FROM debian:stable-slim
RUN apt-get update && apt-get install -y python-pip
WORKDIR /code
CMD python

现在我可以运行docker-compose build来构建它,然后我想我可以做docker-compose run myProject pythonFile1.py,但后来我收到以下错误:

ERROR: Cannot start service tools: oci runtime error: container_linux.go:262: starting container process caused "exec: \"pythonFile1.py\": executable file not found in $PATH"

我做错了什么? docker-compose甚至是构成的方式(或者我可以用普通的Dockerfile实现我想要的东西)?

2 个答案:

答案 0 :(得分:2)

使用args的Docker-compose避免使用CMD
所以你必须添加python命令:

docker-compose run myproject python pythonFile1.py

解释

  

docker-compose运行SERVICE COMMAND

COMMAND在您的Dockerfile中不使用您的CMD定义 您可以在不使用CMD的情况下创建Dockerfile,也可以将其与docker run一起使用。

尝试此命令时,可能更容易理解:

docker-compose run myproject ls .  

因为你可以使用你想要的任何命令,例如lspingpython ......

Personnaly,我创建了一个python-cli.sh看起来像:

docker run \
       --rm \
       -it \
       --privileged \
       -v $(pwd):/home/dev/app \
       -w /home/dev/app \
       python:3 \
       python "$@"

然后我与ln -S ./python-cli.sh /usr/local/bin/d-python建立联系。
 我使用命令d-python作为普通的python命令:d-python myFile.py

答案 1 :(得分:1)

这是docker-compose运行文档

run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]

pythonFile1.py被解释为一个命令,因此在运行时,docker正试图在容器内执行pythonFile1.py命令。

在您的情况下不需要docker-compose。您可以使用命令

docker run -i someName -v /absolutePath/code:/code -v /absolute/data:/data pythonFile1.py

注意主机上的路径必须是绝对路径 https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume