2 回答

TA貢獻1963條經驗 獲得超6個贊
這是 docker 和 docker compose 如何在 docker 容器中解析參數的解決方案:
蟒蛇腳本
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name", help="Name of person to greet")
args = parser.parse_args()
print(f"Hello there, {args.name}!")
使用自定義 dockerfile(對于這種情況似乎是最直接的):
FROM python:3.8
COPY main.py .
ENTRYPOINT ["./main.py"]
然后構建并運行容器化的 cli:
# Should make the script executable to invoke directly
$ chmod +x main.py
$ docker build -t dockerized-cli .
$ docker run -it --rm dockerized-cli -h
usage: main.py [-h] name
positional arguments:
name Name of person to greet
optional arguments:
-h, --help show this help message and exit
$ docker run -it --rm dockerized-cli Jeff
Hello there, Jeff!
僅使用 docker-compose(原始問題)
version: "3"
services:
app:
image: python:3.8
volumes:
- .:/opt/app
entrypoint: ["/opt/app/main.py"]
然后運行,
$ docker-compose run app Jeff
Hello there, Jeff!
如果您需要使用 ubuntu:18.04 圖像,但仍然無法從中構建您自己的圖像(在入口點之外安裝 python),那么您需要做您已經擁有的事情,即首先創建一個入口點腳本安裝 python 然后調用你的腳本。需要注意的是,現在您的入口點是入口點腳本本身,而不是您的 python CLI,因此您需要將任何參數從 shell 腳本傳播到您的 python 腳本。下面是一個如何操作的簡單示例 - 注意 bash 變量“$@”:
entrypoint.sh
#!/bin/bash
# install python here...
python print_args.py $@
print_args.py
import sys
print(sys.argv)

TA貢獻1788條經驗 獲得超4個贊
我找到的唯一解決方案如下:您可以通過 ARG 關鍵字將啟動參數(在構建時傳遞參數更容易)從 docker-compose 傳遞到 Dockerfile。這里的問題是 ARG 有一個非常奇怪的范圍,所以 ENTRYPOINT 看不到定義的 ARG,但可以看到 ENV。所以你必須將 ARG 復制到 ENV。
ingest_data.py
#!/usr/bin/env python
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Ingest CSV data to Postgres')
parser.add_argument('--host', required=True, help='host for postgres')
parser.add_argument('--port', required=True, help='port for postgres')
parser.add_argument('--db', required=True, help='database name for postgres')
parser.add_argument('--table_name', required=True, help='name of the table where we will write the results to')
args = parser.parse_args()
在 Dockerfile 中。注意:要將參數傳遞給 ENTRYPOINT,您應該以 shell 形式運行它,而不是以 exec 形式運行它!:
FROM python:3.9.1
RUN pip install pandas sqlalchemy psycopg2 pyarrow
WORKDIR /app
COPY ingest_data.py ingest_data.py
ARG host
ARG port
ARG db
ARG table_name
ENV host=${host} port=${port} db=${db} table_name=${table_name}
RUN echo "Host: ${host}, Port: ${port}, DB: $db"
ENTRYPOINT python ingest_data.py -host=$host --port=$port --db=$db --table_name=$table_name
在 docker-compose.yaml
version: "3"
services:
app:
build:
context: .
args:
- host=pgdatabase
- port=5432
- db=ny_taxi
- table_name=yellow_taxi_trips_n
最后運行它,
$ docker-compose up -d
添加回答
舉報