Python 将本地目录装入Docker容器

Python 将本地目录装入Docker容器,python,docker,docker-compose,dockerfile,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 W

我想在一个项目中使用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
现在我可以运行
docker compose build
来构建它,然后我想我可以运行
docker compose运行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是一个不错的选择吗(或者我可以用一个简单的docker文件实现我想要的吗?

以下是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
注意:主机上的路径必须是绝对路径
这是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
注意:主机上的路径必须是绝对路径
Docker使用args avoid CMD编写 因此,您必须添加python命令:

docker-compose run myproject python pythonFile1.py

解释

docker编写运行服务命令

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

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

docker-compose run myproject ls .  
因为你可以使用任何你想要的命令,比如
ls
ping
python

我创建了一个
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
Docker compose with args avoid CMD
因此,您必须添加python命令:

docker-compose run myproject python pythonFile1.py

解释

docker编写运行服务命令

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

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

docker-compose run myproject ls .  
因为你可以使用任何你想要的命令,比如
ls
ping
python

我创建了一个
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