首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Docker中使用覆盖入口点运行测试脚本是一种反模式吗?

在Docker中使用覆盖入口点运行测试脚本是一种反模式吗?
EN

Stack Overflow用户
提问于 2021-01-14 05:40:35
回答 1查看 246关注 0票数 0

我有一个下面的Dockerfile

代码语言:javascript
复制
FROM python:3.6

WORKDIR /app
 
ADD main.py /app

ENTRYPOINT [ "python3",  "main.py" ]

我有一个在部署之前运行的先决条件测试,用于验证连接、输入文件等

所以我将测试脚本添加到Docker镜像中,如下所示

代码语言:javascript
复制
FROM python:3.6

WORKDIR /app
 
ADD main.py /app
ADD test.py /app

ENTRYPOINT [ "python3",  "main.py" ]

为了进行测试,我运行docker container,如下所示

代码语言:javascript
复制
docker run --entrypoint python3 myImage test.py 

这是Docker中的反模式吗?创建单独的测试容器镜像是不是更好的做法?

EN

回答 1

Stack Overflow用户

发布于 2021-01-14 09:33:14

我通常推荐使用CMD而不是ENTRYPOINT,原因有两个。

代码语言:javascript
复制
CMD ["python3", "main.py"]  # not ENTRYPOINT

您用来运行测试脚本的调用演示了其中之一。覆盖ENTRYPOINT有点笨拙,但是覆盖CMD非常简单;您只需运行

代码语言:javascript
复制
docker run myImage \
  python3 test.py

命令更自然地组合在一起。

首选CMD的第二个原因与测试脚本所做的事情有关:它“验证连接、输入文件等”。在容器启动时运行此脚本是非常合理的,如果成功,则继续运行主应用程序。您可以编写一个包装器脚本,该脚本将一些命令作为参数,运行测试脚本,如果成功,则启动给定的命令:

代码语言:javascript
复制
#!/bin/sh

# Run the verification script
if ! python3 test.py ; then
  echo 'Pre-launch verification failed, exiting' >&2
  exit 1
fi

# If that succeeded, run the command passed to us as arguments
exec "$@"

现在,您可以使用该脚本作为图像的ENTRYPOINT。当您使用have both ENTRYPOINT and CMD时,CMD将作为参数传递给ENTRYPOINT,这正是此脚本所期望的。

代码语言:javascript
复制
FROM python:3.6
WORKDIR /app

# Prefer COPY to ADD, unless you specifically need URL fetching or
# archive unpacking.  Use a relative path for the COPY destination
# to avoid repeating the path name.
COPY main.py test.py entrypoint.sh .

ENTRYPOINT ["/app/entrypoint.sh"] # must be JSON-array syntax
CMD ["python3", "main.py"]        # can be any valid CMD

使用此设置时,如果在docker run命令中替换CMD,则ENTRYPOINT仍然有效。

代码语言:javascript
复制
# Get an interactive debugging shell in this container, but only
# after the startup-time tests pass.
docker run --rm -it myImage /bin/sh

# I don't know why the startup-time tests aren't passing; skip even
# that.
docker run --rm -it --entrypoint /bin/sh myImage

(对于更一般的测试概念,包括应用程序的单元测试和集成测试,我通常从Docker外部启动这些测试;我不会构建特殊的纯测试容器,也不会在我的生产映像中包含测试代码。这不同于启动时配置检查,这似乎是您想要的。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65710189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档