如何从 Docker 图片 运行 bash 脚本

how to run bash script from Docker Image

我从 Docker 文件创建了一个 docker 图像。项目运行完美。我有一些测试并调用这些测试我创建了一个 run_tests.sh 文件,我也使该文件可执行。

所以,当我 运行 docker run -it --rm <image_name> run_tests.sh 它应该输出测试结果,而不是输出它监听的服务器 ip 地址。

如何从 Docker 图像 运行 bash 脚本而不输入 shell?

这是我的Docker文件...

FROM python:3.8-slim-buster

RUN pip install --upgrade pip
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /app

COPY requirements.txt /app/requirements.txt

# install dependencies
RUN pip install -r requirements.txt
RUN apt-get update
RUN apt-get install gnupg -y

# copy project
COPY . /app/

# making executable test file and entrypoint file for bash shell
RUN chmod +x run_tests.sh 
RUN chmod +x entrypoint.sh

COPY ./entrypoint.sh /
ENTRYPOINT ["sh", "/entrypoint.sh"]

您可以 运行 通过 运行ning:

实现
docker run --rm --entrypoint '' <image_name> /bin/bash -c './run_tests.sh'

docker run --rm --entrypoint '' <image_name> sh -c './run_tests.sh'

如果您的图像只有 sh 个可用

在任何一种情况下,您都只是 运行从所需图像创建一个容器,然后 运行使用 /bin/bashsh 使用 -c 标志,它允许您从字符串中定义 运行 的命令。此外,通过设置 --entrypoint '',您将覆盖 Dockerfile 上设置的默认入口点。当您设置了入口点时,docker 命令将作为其参数附加,因此我们将入口点覆盖为一个空入口点。

另外,在这种情况下,您不应该使用选项 -it,因为当您想要与容器交互时会使用它们(即访问容器内的终端)。

这是要检查的事项列表:

在 Docker 文件中使用 CMD 而不是 ENTRYPOINT docker run 图像名称后的命令覆盖Docker 文件 CMD,如果 ENTRYPOINTCMD 都存在,则 CMD 将作为参数传递给 ENTRYPOINT。您可以使用 中描述的 docker run --entrypoint 来解决这个问题,但是在这里使用 ENTRYPOINT 没有任何好处;只需使用 CMD 即可。

CMD ["sh", "/entrypoint.sh"]

确保你的脚本可以正常执行。它应该是可执行的(如chmod +x),并且它应该以“shebang”行开头

#!/bin/sh
# ^^^ as the very very first thing in the script

在 Docker 之外你应该能够 运行 ./run_tests.sh 并且它应该 运行 而无需明确指定解释器。如果该文件在主机上是可执行的(并作为可执行文件签入源代码管理),那么 Dockerfile COPY 将保留可执行位并且您不需要 RUN chmod 在 Docker文件.

(您可以对 entrypoint.sh 脚本执行相同的操作,并从 CMD 中省略显式 sh 解释器。)

将脚本放在 $PATH 某处。 /usr/local/bin 通常是一个不错的选择。

(在 Python 上下文中,如果您的 setup.cfg 文件包含 setuptools entry points,那么 pip install 会将其包装脚本放入 /usr/local/bin 中,您可以只是 运行 他们;这是自动完成的。)

将这些放在一起,您会得到一个 Docker 文件,例如:

COPY entrypoint.sh run_tests.sh /usr/local/bin
# RUN chmod +x /usr/local/bin/*
CMD ["entrypoint.sh"]

而且您应该能够运行完全按照您最初提出的docker run命令

docker run -it --rm image_name run_tests.sh