将本地目录装入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.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
来构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 .
因为你可以使用任何你想要的命令,比如ls
, ping
, python
…
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