在docker容器

时间:2015-10-01 22:42:56

标签: rabbitmq common-lisp amqp sbcl docker-compose

我正在尝试使用cl-rabbit通过在Docker容器内运行的lisp进程与RabbitMQ代理进行通信。当我在docker容器外运行代码时,我的代码有效,因此问题与操作系统或Docker有关。 (它在容器外的Mac OS X上运行,但在容器内部运行Ubuntu 14.04。)

当我使用docker-compose up运行系统时,我看到消息代理已成功启动的输出。 lisp客户端提供此输出:

sbcl-rabbit_1 | This is SBCL 1.2.15, an implementation of ANSI Common Lisp.
sbcl-rabbit_1 | More information about SBCL is available at <http://www.sbcl.org/>.
sbcl-rabbit_1 |
sbcl-rabbit_1 | SBCL is free software, provided as is, with absolutely no warranty.
sbcl-rabbit_1 | It is mostly in the public domain; some portions are provided under
sbcl-rabbit_1 | BSD-style licenses.  See the CREDITS and COPYING files in the
sbcl-rabbit_1 | distribution for more information.
sbcl-rabbit_1 | Created connection #<CL-RABBIT::CONNECTION {10047054F3}>
sbcl-rabbit_1 | Created socket #.(SB-SYS:INT-SAP #X00651650)
sbcl-rabbit_1 | Opened socket #.(SB-SYS:INT-SAP #X00651650)
sbcl-rabbit_1 | CORRUPTION WARNING in SBCL pid 10(tid 140737354065728):
sbcl-rabbit_1 | Memory fault at 0x7ffff266ce10 (pc=0x7ffff2c957c2, sp=0x7ffff309f3d0)
sbcl-rabbit_1 | The integrity of this image is possibly compromised.
sbcl-rabbit_1 | Continuing with fingers crossed.
sbcl-rabbit_1 | Unhandled SB-SYS:MEMORY-FAULT-ERROR in thread #<SB-THREAD:THREAD
sbcl-rabbit_1 |                                                 "main thread" RUNNING
sbcl-rabbit_1 |                                                  {1003FAF093}>:
sbcl-rabbit_1 |   Unhandled memory fault at #x7FFFF266CE10.
sbcl-rabbit_1 |
sbcl-rabbit_1 | Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1003FAF093}>
sbcl-rabbit_1 | 0: ((LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX))
sbcl-rabbit_1 | 1: (SB-IMPL::CALL-WITH-SANE-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX) {10047B016B}>)
sbcl-rabbit_1 | 2: (SB-IMPL::%WITH-STANDARD-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX) {10047B013B}>)
sbcl-rabbit_1 | 3: (PRINT-BACKTRACE :STREAM #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDERR* {1000164243}> :START 0 :FROM :INTERRUPTED-FRAME :COUNT NIL :PRINT-THREAD T :PRINT-FRAME-SOURCE NIL :METHOD-FRAME-STYLE NIL)
sbcl-rabbit_1 | 4: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SB-SYS:MEMORY-FAULT-ERROR {10047ACE93}> #<unavailable argument>)
sbcl-rabbit_1 | 5: (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<SB-SYS:MEMORY-FAULT-ERROR {10047ACE93}>)
sbcl-rabbit_1 | 6: (INVOKE-DEBUGGER #<SB-SYS:MEMORY-FAULT-ERROR {10047ACE93}>)
sbcl-rabbit_1 | 7: (ERROR SB-SYS:MEMORY-FAULT-ERROR :ADDRESS 140737260211728)
sbcl-rabbit_1 | 8: (SB-SYS:MEMORY-FAULT-ERROR)
sbcl-rabbit_1 | 9: ("foreign function: call_into_lisp")
sbcl-rabbit_1 | 10: ("foreign function: post_signal_tramp")
sbcl-rabbit_1 | 11: (CFFI::PREPARE-FUNCTION "amqp_login_with_properties" (:STRUCT CL-RABBIT::AMQP-RPC-REPLY-T) (:POINTER :POINTER :INT :INT :INT :POINTER :INT :POINTER :POINTER) :DEFAULT-ABI)
sbcl-rabbit_1 | 12: (CL-RABBIT::AMQP-LOGIN-SASL-PLAIN-WITH-PROPERTIES #.(SB-SYS:INT-SAP #X00641500) "/" 0 131072 0 #.(SB-SYS:INT-SAP #X7FFFF329FFE8) 0 "guest" "guest")
sbcl-rabbit_1 | 13: ((LABELS #:FN274 :IN CL-RABBIT:LOGIN-SASL-PLAIN) (CL-RABBIT::NUM-ENTRIES 2 CL-RABBIT::ENTRIES #.(SB-SYS:INT-SAP #X00651840)))
sbcl-rabbit_1 | 14: (CL-RABBIT::CALL-WITH-AMQP-TABLE #<CLOSURE (LABELS #:FN274 :IN CL-RABBIT:LOGIN-SASL-PLAIN) {100470785B}> (("product" . "cl-rabbit") ("version" . "0.1")))
sbcl-rabbit_1 | 15: (CL-RABBIT.EXAMPLES::TROY-TEST)
sbcl-rabbit_1 | 16: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CL-RABBIT.EXAMPLES::TROY-TEST) #<NULL-LEXENV>)
sbcl-rabbit_1 | 17: (EVAL (CL-RABBIT.EXAMPLES::TROY-TEST))
sbcl-rabbit_1 | 18: (SB-IMPL::PROCESS-EVAL/LOAD-OPTIONS ((:LOAD . "examples.lisp") (:EVAL . "(sleep 3)") (:EVAL . "(cl-rabbit.examples::troy-test)") (:QUIT)))
sbcl-rabbit_1 | 19: (SB-IMPL::TOPLEVEL-INIT)
sbcl-rabbit_1 | 20: ((FLET #:WITHOUT-INTERRUPTS-BODY-83 :IN SAVE-LISP-AND-DIE))
sbcl-rabbit_1 | 21: ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE))
sbcl-rabbit_1 |
sbcl-rabbit_1 | unhandled condition in --disable-debugger mode, quitting

堆栈跟踪似乎表示RabbitMq-C代码中的错误指针引用。

要构建docker镜像,请使用此文件创建sbcl图像:

FROM ubuntu:14.04

# Install things needed to get and install sbcl and quicklisp
RUN apt-get -y update && apt-get install -y wget make pkg-config gcc libffi-dev
# Install sbcl
RUN cd /usr/local && \
    wget http://prdownloads.sourceforge.net/sbcl/sbcl-1.2.15-x86-64-linux-binary.tar.bz2 && \
    tar xf sbcl-1.2.15-x86-64-linux-binary.tar.bz2 && \
    cd sbcl-1.2.15-x86-64-linux && \
    ./install.sh
# Install quicklisp
RUN wget https://beta.quicklisp.org/quicklisp.lisp && \
    yes "" | sbcl --load quicklisp.lisp \
                  --eval '(quicklisp-quickstart:install)' \
                  --eval '(ql:quickload "vecto")' \
                  --eval '(ql:add-to-init-file)'\
                  --non-interactive

# Mount workspace
WORKDIR /app

# Run sbcl
CMD sbcl

这是使用docker build -f Dockerfile-sbcl -t sbcl构建的。然后我有第二个docker文件用cl-rabbit构建一个图像。

# SBCL with cl-rabbit installed
FROM sbcl

RUN apt-get update -y && apt-get install -y librabbitmq-dev

ENV SBCL_CORE_DIR=/sbcl


RUN mkdir -p $SBCL_CORE_DIR
RUN sbcl --eval '(ql:quickload :cl-rabbit)' \
         --eval '(sb-ext:save-lisp-and-die "/'${SBCL_CORE_DIR}'/sbcl-rabbit.core")'

RUN echo Saved core in $SBCL_CORE_DIR
RUN ls -l $SBCL_CORE_DIR

CMD sbcl --core $SBCL_CORE_DIR/sbcl-rabbit.core \
    --non-interactive                           \
    --load examples.lisp                        \
    --eval '(sleep 3)'                          \
    --eval '(cl-rabbit.examples::troy-test)'

#CMD ls -l
# EOF

这是使用此docker-compose build使用此docker-compose.yml构建的。

sbcl-rabbit:
  build: .
  dockerfile: Dockerfile-sbcl-rabbitmq
  volumes:
   - ../../path/to/lisp://app
  links:
   - msgbroker


msgbroker:
  image: rabbitmq
  ports:
   - "5672:5672"

当我使用docker-compose up运行时,我得到上述输出。

examples.lisp如下:

(require 'cl-rabbit)
(in-package :cl-rabbit.examples)

(defvar msgbroker "msgbroker")
;;(setq msgbroker "localhost")

(defun troy-test ()
  (with-connection (conn)
    (format t "Created connection ~s~%" conn)
    (let ((socket (tcp-socket-new conn))
          (channel 1))
      (format t "Created socket ~s~%" socket)
      (socket-open socket msgbroker 5672)
      (format t "Opened socket ~s~%" socket)
      (login-sasl-plain conn "/" "guest" "guest")
      (format t "logged in ~s~%" conn)
      (channel-open conn channel)
      (format t "Openned channel ~s~%" conn)
      (queue-declare conn channel
                     :queue "lisp-queue"
                     :durable t)
      (exchange-declare conn channel "lisp-exchange" "direct"
                        :durable t)
      (queue-bind conn channel
                  :queue "lisp-queue"
                  :routing-key "lisp-queue"
                  :exchange "lisp-exchange")
      (print "Bound queue")
      (basic-publish conn channel
                     :exchange "lisp-exchange"
                     :routing-key "lisp-queue"
                     :body "Message from lisp")
      (print "Pubished");
      (basic-consume conn channel "lisp-queue")
      (print "Received")
      (let* ((result (consume-message conn))
             (message (envelope/message result))
             (formatted (format t "Got message: ~s~%content: ~s~%props: ~s"
                                result (babel:octets-to-string (message/body message) :encoding :utf-8)
                                (message/properties message))))
        (prin1 formatted)
        (pprint formatted)
        (cl-rabbit:basic-ack conn channel (envelope/delivery-tag result))))))

基于打印语句,问题发生在login-sasl-plain

我使用docker run rabbit_sbcl-rabbit bash使用交互式shell启动Docker容器,并使用telnet msgbroker 5672验证主机msgbroker上的端口5672是否连接到Rabbit MQ服务器。如果我在telnet会话中键入文本,我会看到服务器发出AMQP连接的消息。

当lisp客户端尝试连接时,我没有看到类似的消息。

使用类似的配置,我使用Java客户端发送和接收消息,发送者和接收者在一个Docker容器中,而RabbitMQ服务器在另一个容器中,正如我在这里尝试的那样。

知道出了什么问题,或进一步建议做些什么来尝试诊断它?

1 个答案:

答案 0 :(得分:0)

嘿,如果你还有麻烦,试着用静态链接的librabbitmq和libffi构建sbcl。

另外,您可能会发现我的项目很有用 - https://github.com/cl-rabbit/cl-bunny/