在docker compose中创建基于客户端目录路径的卷



我想在我的docker容器中使用本地文件夹例如数据集。此外,我有一个python请求模块,其中客户端发送到API服务器的目录路径。我想在docker compose中使用这个路径作为卷,以便在docker容器中使用它。

如何将此路径发送到docker compose。API请求是:

def train():
url = 'http://127.0.0.1:8000/train'  # server url
data = {'label': ['fire'],
'image_path': '/path/to/directory',
'label_path': '/path/to/directory',
'image_size': 640,
'validation_split': 0.2,
'save_dir': 'results/'}
r = requests.post(url, json=data)
print(r.text)

如何将本地路径'image_path''label_path'发送给docker compose并将其用作卷。我的docker组成:

version: "3.8"
services:
inference:
container_name: "inference"
build: "./backbone"
ports:
- '5000:5000'
volumes:
- ./backbone:/code
# - ./volumes/weights:/weights
command: "python3 app.py"
environment:
- PORT=5000
- MODEL_PATH=/code/weights/best.pt
ipc: host
shm_size: 1024M
train:
container_name: "train"
build: "./train"
shm_size: '2gb'
command: "python3 main_train.py"
environment:
- RESPONSE_URL=http://127.0.0.1:8000/response
- LOGGER_URL=http://127.0.0.1:8000/logger
- PORT=8000
- IS_LOGGER_ON=False
ports:
- '8000:8000'
volumes:
- ./train:/code
ipc: host

您需要进行一些更改才能使此工作成功。

在服务器代码中,您需要而不是接受完整路径。这样做有许多安全问题(您可以检索应用程序代码吗?数据库凭证文件?系统文件(如/etc/passwd?)。相反,将其设置为具有可配置的数据路径,并且只接受该路径内的文件。
DATA_PATH = os.environ.get('DATA_PATH', 'data') # default relative to current directory
def handle(data):
if '/' in data['image_file']:
raise InvalidInputError()
image_path = os.path.join(DATA_PATH, data['image_file'])
...

当你在Docker镜像中设置它时,你可以为这个数据路径指定一个固定的路径。在容器文件系统根目录的子目录中使用一个简单的路径就可以了。

# train/Dockerfile
FROM python
...
ENV DATA_DIR=/data        # set this variable only because the application wants it
RUN mkdir -p "$DATA_DIR"  # create an empty directory by default
CMD ["./main_train.py"]

现在,当您在Compose中启动它时,您知道了保存data目录的(固定的)容器端路径,因此您可以在那里挂载内容。

services:
train:
build: ./train
ports:
- '8000:8000'
volumes:
- ./dataset_3:/data
通常情况下,映像中的文件系统布局、注入数据或配置的路径以及容器内服务使用的端口等细节都是映像的固定属性。因此,指定"数据将始终在/data"是安全的。然后把它当做挂载点;你不需要在Docker设置的任何地方将它指定为变量。同样,您不需要在Compose设置中设置$PORT环境变量,因为容器端口号通常是映像的固定属性。

相关内容

最新更新