【问题标题】:passing url as arguments in python when running docker image运行 docker image 时在 python 中将 url 作为参数传递
【发布时间】:2019-11-04 06:20:56
【问题描述】:

我想在运行我的 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

【问题讨论】:

    标签: python docker dockerfile command-line-arguments


    【解决方案1】:

    首先您需要将所有CMD 更改为ENTRYPOINT

    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()
    

    【讨论】:

    • 我不明白,请您解释一下,因为我是 docker 新手
    • docker run preprocess:v1 YOUR_URL 将覆盖您图像中的CMD,因此您将在没有pre.py 的情况下得到python YOUR_URL,并且您会遇到什么错误
    • 我像你一样编辑了 dockerfile: ENTRYPOINT ["python","pre.py"] 但是现在当我运行 docker 镜像 docker run -d preprocess:v5 storage.googleapis.com/MyBucket/app/Model/iris.csv 时没有输出正如您在我的 python 代码中看到的,即使是我用于日志的打印语句也没有打印
    • 这是另一个问题,请参阅:stackoverflow.com/questions/29663459/…
    • 我已经给出了 ENTRYPOINT ["python","-u","pre.py"] 正如你所说的,但我仍然不能没有输出.. 我也可以在容器停止时看到日志
    猜你喜欢
    • 2021-09-24
    • 2020-04-07
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多