如何从 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/bash
或 sh
使用 -c
标志,它允许您从字符串中定义 运行 的命令。此外,通过设置 --entrypoint ''
,您将覆盖 Dockerfile 上设置的默认入口点。当您设置了入口点时,docker 命令将作为其参数附加,因此我们将入口点覆盖为一个空入口点。
另外,在这种情况下,您不应该使用选项 -it
,因为当您想要与容器交互时会使用它们(即访问容器内的终端)。
这是要检查的事项列表:
在 Docker 文件中使用 CMD
而不是 ENTRYPOINT
。 docker run
图像名称后的命令覆盖Docker 文件 CMD
,如果 ENTRYPOINT
和 CMD
都存在,则 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
我从 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/bash
或 sh
使用 -c
标志,它允许您从字符串中定义 运行 的命令。此外,通过设置 --entrypoint ''
,您将覆盖 Dockerfile 上设置的默认入口点。当您设置了入口点时,docker 命令将作为其参数附加,因此我们将入口点覆盖为一个空入口点。
另外,在这种情况下,您不应该使用选项 -it
,因为当您想要与容器交互时会使用它们(即访问容器内的终端)。
这是要检查的事项列表:
在 Docker 文件中使用 CMD
而不是 ENTRYPOINT
。 docker run
图像名称后的命令覆盖Docker 文件 CMD
,如果 ENTRYPOINT
和 CMD
都存在,则 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