将字符串的 CLA 传递到 Docker 映像中 - Python

Posted

技术标签:

【中文标题】将字符串的 CLA 传递到 Docker 映像中 - Python【英文标题】:Pass CLA of a String into a Docker Image - Python 【发布时间】:2021-11-06 14:39:38 【问题描述】:

我想将一个字符串传递给命令行参数,以便在启动 docker 容器时在 python 文件中设置类。我使用的是 python:3.9 的基础镜像。

在构建 docker 容器时如何传递字符串的 CLA

Python 脚本

if __name__ == '__main__':
    import argparse

    parser = argparse.ArgumentParser(description='Pass the variable needed')
    parser.add_argument('var', type=str, help='variable')
    args = parser.parse_args()
    ENVPath = '/usr/local/bin/chromedriver'

    if sys.argv[1] == 'prod':
        currentvar = TestPrerequisiteService(ENVPath, prod)

    elif sys.argv[1] == 'test':
        currentvar = TestPrerequisiteService(ENVPath, test)
    else:
        print("Invalid variable")
        exit()

Dockerfile

FROM python:3.9

ADD /app/main.py .
ADD /app/Connect.py .

# Install Chrome WebDriver
RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSION && \
    curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \
    unzip -qq /tmp/chromedriver_linux64.zip -d /opt/chromedriver-$CHROMEDRIVER_VERSION && \
    rm /tmp/chromedriver_linux64.zip && \
    chmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver && \
    ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver /usr/local/bin/chromedriver

# Install Google Chrome
RUN curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
    echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list && \
    apt-get -yqq update && \
    apt-get -yqq install google-chrome-stable && \
    rm -rf /var/lib/apt/lists/*

COPY requirements.txt .

RUN pip install -r requirements.txt

WORKDIR /microservices

COPY ./app ./app


CMD ["python","./app/main.py"]

我们将不胜感激:)

【问题讨论】:

运行 docker 容器时当前的输出是什么? @belfner 当我运行此命令“docker run -p 5000:5000 microservicestesting prod”时,我收到此错误来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:380:启动容器进程导致: exec: "prod": $PATH 中找不到可执行文件:未知。 什么是“产品”? 我试图作为 CLA 传递的字符串变量 【参考方案1】:

CMD 定义传递给容器入口点的参数。我相信您容器的当前入口点是/bin/sh,它将["python","./app/main.py"] 作为参数。当您使用docker run -p 5000:5000 microservicestesting prod 运行容器时,prod 会使用 CMD 覆盖 dockerfile 中定义的参数。

要获得您想要的功能,将 CMD 更改为 ENTRYPOINT,然后当您运行 docker run 命令时,prod 将作为参数传递给 ["python","./app/main.py"]

【讨论】:

以上是关于将字符串的 CLA 传递到 Docker 映像中 - Python的主要内容,如果未能解决你的问题,请参考以下文章

在构建时使用 docker-compose 将环境变量传递给 docker 映像

原始 IP 未传递到 AWS Elastic Beanstalk 上的单个容器 Docker 映像上的容器

使用 Docker 文件中的 COPY 将文件夹从 Windows 主机操作系统复制到 Docker 映像中

如何将多个docker映像部署到单个虚拟机

我们可以在通过 dockerfile 构建 docker 映像的同时通过 cmd 行传递 ENV 变量吗?

将Python软件包安装到Docker映像的不同方法