1

可以在 Dockerfile 底部添加什么命令以在 ENNTRYPOINT 之后进入容器提示符?Dockerfile 运行正常。只是它从执行它的地方回到提示。

 # Pull base image
From ubuntu:18.04
LABEL maintainer="tester@gmail.com"

# Install dependencies
RUN apt-get update -y
RUN apt-get install -y build-essential python3.6 python3.6-dev python3-pip python3.6-venv
RUN apt-get install -y vim
RUN python3.6 -m pip install pip --upgrade
RUN pip3 install pytest pytest-cache
RUN pip3 install pylint
RUN pip3 install requests

# Create working directory
RUN mkdir /testsuite

# Copy project
COPY comments_categories_api  /testsuite/comments_categories_api
COPY comments_posts_api  /testsuite/comments_posts_api/
RUN chmod -R a+rwX testsuite/
# Set working directory

WORKDIR /testsuite
# Set Python version
RUN echo alias python='/usr/bin/python3' >> ~/.bashrc
# RUN echo cd testsuite/ >> ~/.bashrc

# Define ENTRYPOINT
COPY ./docker-entrypoint.sh /testsuite/docker-entrypoint.sh
RUN ["chmod", "+x", "/testsuite/docker-entrypoint.sh"]
ENTRYPOINT ["sh", "/testsuite/docker-entrypoint.sh"] 

4

2 回答 2

2

用“$@”结束你的 docker-entrypoint.sh。这是一个例子:

#!/bin/bash

echo Hello

$@

=== 更新

根据您的评论,该文件应为:

#!/bin/bash

pytest -v

$@
于 2019-05-03T04:23:24.963 回答
1

在 ENTRYPOINT 之后,定义上,容器退出。

听起来您的意思是您想要一个容器,它首先运行一些测试,然后启动一个交互式外壳。您需要制作一个执行此操作的 shell 脚本

#!/bin/sh
pytest -v
sh

然后使该脚本成为图像的主要进程。


我在这里有两种风格的评论,阅读其他评论也可能对你很重要。您提到尝试使用

docker run -it vip_app:v0.1 /bin/bash

如果您使用 CMD 声明 process 命令,您的/bin/bash命令将替换 CMD,您将获得一个交互式 shell。如果您使用 ENTRYPOINT 声明它,/bin/bash则作为参数传递给 ENTRYPOINT(并且可能会被完全忽略)。如果我不明确需要两者,我倾向于更喜欢 CMD 而不是 ENTRYPOINT。

您还尝试python使用.bashrc文件更改默认命令。 .bashrc在许多常见情况下不会被阅读。例如,如果您

docker run --rm vip_app:v0.1 python myapp.py

.bashrc不会被读取,你会运行(/usr/bin/python可能是 Python 2.7)。我根本不会在图像中安装这样的“便利”东西。

于 2019-05-03T10:16:53.690 回答