我想将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实现我想要的东西)?
答案 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 .
因为你可以使用你想要的任何命令,例如ls
,ping
,python
......
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