亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于ubuntu的docker容器中的python argparse

基于ubuntu的docker容器中的python argparse

泛舟湖上清波郎朗 2023-05-16 15:00:27
我正在努力尋找一種方法將參數傳遞給docker container基于ubuntu. 我正在與docker-compose.yml.請在下面找到示例!docker-compose.ymlversion: "3"services:   bcp:      image: ubuntu:18.04      restart: always      tty: true      entrypoint: ["/bin/bash", "/ingestion/bcp-entrypoint.sh"]      volumes:          - ./services/bcp:/ingestion/services/bcp          - ./bcp-entrypoint.sh:/ingestion/bcp-entrypoint.shbcp-entrypoint.shapt-get updateapt-get upgrade -yapt-get clean -yapt-get install -y python3-pip...蟒蛇腳本required_args.add_argument("--database", metavar="str", type=str, help="database from where to extract", required=True)我調用腳本的方式 - 在容器和主機上 - 是python3 -m services.bcp --database foo并且它工作得非常完美。問題是,我怎樣才能在 docker 容器上從主機實現相同的目標?基本上,我正在尋找類似的東西docker-compose exec services.bcp --database foo。我不想用dockerfile!理想情況下,一切都基于docker-compose.
查看完整描述

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)


查看完整回答
反對 回復 2023-05-16
?
尚方寶劍之說

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 


查看完整回答
反對 回復 2023-05-16
  • 2 回答
  • 0 關注
  • 213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號