繁体   English   中英

带有 docker-compose.yml 的 Dockerfile

[英]Dockerfile with docker-compose.yml

总的来说,我确实了解使用 Dockerfile 和 docker-compose.yml 背后的目的。 但是,我在同时使用两者时遇到了一些问题。 很可能,我只是没有正确指定所有位置。

我构建了一个将 config.ini 文件作为输入之一的应用程序(它应该与我的 app.py 代码位于同一目录中)。 我的目标是避免每次更改配置文件时都重新构建映像。 我知道我可以通过构建映像然后通过 docker-compose.yml 运行/重新启动容器来做到这一点。

下面是我的项目的结构:

my_local_dir_with_py_projects/
|__config.ini
|__docker-compose.yml
|__my_py_app/
   |__app.py
   |__requirements.txt
   |__Dockerfile

我的 Dockerfile 看起来像这样:

# syntax=docker/dockerfile:1

FROM python:3.10

WORKDIR app/

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

我的 docker-compose.yml 看起来像这样:

version: '2.4'
services:
  py_app:
    image: py_app:latest
    restart: always
    volumes:
      - "./config.ini:/Users/my_user/my_local_dir_with_py_projects/config.ini:z" 
    ports:
      - "5005:5000"
    command: python3 app.py

我已经通过docker build --tag py-app . /Users/my_user/my_local_dir_with_py_projects/py_app 然后我cd /Users/my_user/my_local_dir_with_py_projects/并通过 docker docker-compose -f docker-compose.yml up运行我的.yml文件。

谢谢您的帮助。

编辑:只是为了澄清这个问题。 我收到以下错误:

py_app_1  | Traceback (most recent call last):
py_app_1  |   File "/usr/local/lib/python3.10/configparser.py", line 790, in get
py_app_1  |     value = d[option]
File "/usr/local/lib/python3.10/collections/__init__.py", line 986, in __getitem__
py_app_1  |     return self.__missing__(key)            # support subclasses that define __missing__
py_app_1  |   File "/usr/local/lib/python3.10/collections/__init__.py", line 978, in __missing__
py_app_1  |     raise KeyError(key)
py_app_1  | KeyError: 'base_url'
...

我的 config.ini 文件的一部分:

[DEFAULT]
base_url = https://api.binance.com
klines_url = /api/v1/klines

我正在阅读:

import configparser 
config = configparser.ConfigParser()
config.read('config.ini')

在 Dockerfile 中,您将应用程序安装到/app中。 您的 Compose 设置将配置文件挂载到/Users/...目录中,但您的应用程序对此目录一无所知; 它在/app内运行,可能正在那里寻找config.ini文件。

所以在你docker-compose.yml文件中,这一行:

volumes:
  - ./config.ini:/app/config.ini
  #              ^^^^

需要匹配 Dockerfile 中的这一行:

WORKDIR /app
#       ^^^^

(正如我所展示的,在 Dockerfile 中使用绝对路径可能更清楚。在 Dockerfile 中放置CMD比依赖command:覆盖显示在docker-compose.yml文件中。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM