首页 > 解决方案 > 运行 docker image 时在 python 中将 url 作为参数传递

问题描述

我想在运行我的 docker 映像时传递一个 GCP 存储 URL 作为参数,以便它可以从我的存储中提取我的 csv 文件并打印数据集。

下面是我的dockerfile

# Use the official lightweight Python image.
# https://hub.docker.com/_/python
FROM continuumio/miniconda3


# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

# Install production dependencies.
RUN pip install Flask gunicorn
RUN pip install scikit-learn==0.20.2 firefly-python==0.1.15
RUN pip install --upgrade google-cloud-storage
ENTRYPOINT ["python"]
CMD ["pre.py"]

我尝试通过以下命令运行 docker 映像并出现以下错误

docker run preprocess:v1 "https://storage.googleapis.com/MYBucket/app/Model/IrisClassifier.sav"

.

python: can't open file 'https://storage.googleapis.com/MYBucket/app/Model/IrisClassifier.sav': [Errno 2] No such file or directory
import os
import argparse
from google.cloud import storage
from sklearn.externals import joblib
from urllib.request import urlopen

def parse_arguments():
    print('entered parse arg')
    parser = argparse.ArgumentParser()
    parser.add_argument('data_dir', type=str, help='GCSpath')
    args = parser.parse_known_args()[0]
    print('Argument passed')
    print(os.getcwd())
    print('STARTING CLOUD RETRIVAL')
    print('*****client initialized')
    dataset_load = joblib.load(urlopen(args.dat_dir))
    print('*****loaded Dataset')
    print(dataset_load)


def main(_):
    print("Prior to entering arg")
    parse_arguments()

我想在运行我的 docker 映像时传递一个类似的 GCP 存储桶 https://storage.googleapis.com/MYBucket/app/Model/IrisClassifier.sav

标签: pythondockerdockerfilecommand-line-arguments

解决方案


您首先需要将所有内容更改CMDENTRYPOINT

FROM continuumio/miniconda3

ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

RUN pip install Flask gunicorn
RUN pip install scikit-learn==0.20.2 firefly-python==0.1.15
RUN pip install --upgrade google-cloud-storage
ENTRYPOINT ["python", "pre.py"]

然后你可以通过你的URL.

您的设置问题是:

docker 将启动入口点,即python使用您的命令覆盖 CMD,这将为您提供:

python YOUR_URL

更新

我不知道你是否添加了 if 语句来运行主 def,但在这里你应该如何编辑脚本:

def main():
    print("Prior to entering arg")
    parse_arguments()


if __name__ == '__main__':
    main()

推荐阅读