我正在部署一些不同的docker容器,mysql是第一个.我想在数据库启动后立即运行脚本并继续构建其他容器.该脚本一直在失败,因为当设置mysql(来自这个官方的mysql容器)的入口点脚本仍在运行时,它试图运行.
sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=MY_ROOT_PASS -p 3306:3306 -d mysql
[..] wait for mysql to be ready [..]
mysql -h 127.0.0.1 -P 3306 -u root --password=MY_ROOT_PASS < MY_SQL_SCRIPT.sql
Run Code Online (Sandbox Code Playgroud)
有没有办法等待在docker容器内完成入门的mysql安装脚本的信号?Bash睡眠似乎是次优解决方案.
编辑:去找这样的bash脚本.不是最优雅和善良的蛮力,但工作就像一个魅力.也许有人会觉得有用.
OUTPUT="Can't connect"
while [[ $OUTPUT == *"Can't connect"* ]]
do
OUTPUT=$(mysql -h $APP_IP -P :$APP_PORT -u yyy --password=xxx < ./my_script.sql 2>&1)
done
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的龙卷风Web套接字服务器设计一个测试套件.
我正在使用客户端执行此操作 - 通过websocket连接到服务器,发送请求并期望得到某个响应.
我使用python的unittest来运行我的测试,所以我不能(并且不想真正)强制执行测试的顺序.
这就是我的基础测试类(在所有测试用例继承之后)的组织方式.(记录和某些不相关的部分被剥离).
class BaseTest(tornado.testing.AsyncTestCase):
ws_delay = .05
@classmethod
def setUpClass(cls):
cls.setup_connection()
return
@classmethod
def setup_connection(cls):
# start websocket threads
t1 = threading.Thread(target=cls.start_web_socket_handler)
t1.start()
# websocket opening delay
time.sleep(cls.ws_delay)
# this method initiates the tornado.ioloop, sets up the connection
cls.websocket.connect('localhost', 3333)
return
@classmethod
def start_web_socket_handler(cls):
# starts tornado.websocket.WebSocketHandler
cls.websocket = WebSocketHandler()
cls.websocket.start()
Run Code Online (Sandbox Code Playgroud)
我想出的方案是让这个基类在所有测试中连接一次(虽然不一定是这种情况) - 我很乐意设置并拆除每个测试用例的连接,如果它解决了我的问题问题).重要的是我不希望同时打开多个连接.
简单的测试用例就是这样.
class ATest(BaseTest):
@classmethod
def setUpClass(cls):
super(ATest, cls).setUpClass()
@classmethod
def tearDownClass(cls):
super(ATest, cls).tearDownClass()
def test_a(self):
saved_stdout = sys.stdout
try:
out = StringIO() …Run Code Online (Sandbox Code Playgroud)