将本地目录装入Docker容器

我想用Docker做一个项目,用Python做一些数据处理。 假设我的代码位于一个名为code的目录下(包含多个用于分析不同步骤的python文件),并将数据存储在目录data 。 一个解决scheme就是像这样添加代码和数据:

 # 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.pycode运行其中的一个文件。 但是我在这里遇到的问题是我需要重新运行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来构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 – 撰写甚至要走的路(或者我可以达到我只想用普通的Dockerfile)?

这是docker-compose运行文档

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

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

在你的情况下,docker撰写不需要。 您可以使用该命令

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

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

Docker与args组成避免CMD
所以你必须添加python命令:

 docker-compose run myproject python pythonFile1.py 

说明

docker-compose运行SERVICE COMMAND

其中COMMAND不使用你的CMD在Dockerfile中定义。
你可以在不使用CMD的情况下创build你的Dockerfile,或者在docker run下使用它。

当你尝试这个命令时可能会更容易理解:

 docker-compose run myproject ls . 

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

Personnaly,我创build了一个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