【问题标题】:Docker Couchbase: Cannot connect to port 8091 using curl from within entrypoint scriptDocker Couchbase:无法从入口点脚本中使用 curl 连接到端口 8091
【发布时间】:2015-12-07 10:44:26
【问题描述】:

在 OS X 10.11.1 上运行 docker-machine 0.5.0 版、Docker 1.9.0 版。

我有自己的Couchbase image(不是官方的)。在entrypoint script 内部,我正在运行一些curl 命令来配置Couchbase 服务器并加载示例数据。问题是,curl 失败并显示错误消息Failed to connect to localhost port 8091: Connection refused。 我试过127.0.0.10.0.0.0localhost,都没有成功。 netstat 表明localhost 上的端口8091 正在侦听。如果我稍后使用docker exec 登录到服务器并运行相同的curl 命令,这些都可以!我错过了什么?

错误:

couchbase4 |   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
couchbase4 |                                  Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (7) Failed to connect to localhost port 8091: Connection refused

netstat 输出:

root@cd4d3eb00666:/opt/couchbase/var/lib# netstat -lntu                              
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:21100           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:21101           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:9998          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:4369            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8091            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8092            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:41125           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:11209           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:11210           0.0.0.0:*               LISTEN     
tcp6       0      0 :::11209                :::*                    LISTEN     
tcp6       0      0 :::11210                :::*                    LISTEN

【问题讨论】:

  • 能否请您发布您的入口点脚本?
  • @ReneM。已经在那了。文本“入口点脚本”是一个超链接。
  • 等一下!你的入口点脚本应该启动 couchdb,所以当你的 curl 命令在那里失败但后来可以工作时。我认为您应该考虑入口点脚本中命令的顺序。在尝试使用 curl 连接之前先启动 couchdb ;)
  • @ReneM。你错过了脚本的第一行? $CB_HOME/etc/couchbase_init.d restart
  • 您在容器中使用 initd 和类似的东西运行完整的 linux?为什么?查找官方图像,只运行需要的,通过你的入口点脚本手动运行你的服务。这是我的建议

标签: docker couchbase boot2docker docker-machine


【解决方案1】:

这是我的 Dockerfile:

FROM couchbase

COPY configure-cluster.sh /opt/couchbase

CMD ["/opt/couchbase/configure-cluster.sh"]

configure-cluster.sh

/entrypoint.sh couchbase-server &

sleep 10

curl -v -X POST http://127.0.0.1:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300
curl -v http://127.0.0.1:8091/node/controller/setupServices -d services=kv%2Cn1ql%2Cindex
curl -v http://127.0.0.1:8091/settings/web -d port=8091 -d username=Administrator -d password=password
curl -v -u Administrator:password -X POST http://127.0.0.1:8091/sampleBuckets/install -d '["travel-sample"]'

这会配置 Couchbase 服务器,但仍在调试如何将 Couchbase 重新置于前台。

详情请访问:https://github.com/arun-gupta/docker-images/tree/master/couchbase

【讨论】:

  • 我看到的唯一显着差异是您是从官方图像构建的并且睡眠时间更长。我自己构建的原因是官方映像基于 Ubuntu(我在 Debian 上)并安装了一堆我还不需要的软件包。我会增加睡眠时间,看看会发生什么。
  • 我想通了并发布了答案。据我所见,在前台运行服务器需要大量重复来自$CB_HOME/etc/couchbase_init.d 的代码。我已经放弃了,现在只在最后尾随 here 文档。
【解决方案2】:

事实证明,如果我在重新启动服务器后执行curls,这些都可以工作。去搞清楚!也就是说,请注意,据我所知,用于安装示例存储桶的 REST API 未记录在案。 arun-gupta 的博客和他的回答是我唯一看到提到安装示例存储桶的 REST 调用的地方。有一个python script 可用,但这需要安装python-httplib2

也就是说,arun-gupta 的最后一个curl 语句可以改进如下:

if [ -n "$SAMPLE_BUCKETS" ]; then
    IFS=',' read -ra BUCKETS <<< "$SAMPLE_BUCKETS"

    for bucket in "${BUCKETS[@]}"; do
        printf "\n[INFO] Installing %s.\n" "$bucket"
        curl -sSL -w "%{http_code} %{url_effective}\\n" -u $CB_USERNAME:$CB_PASSWORD --data-ascii '["'"$bucket"'"]' $ENDPOINT/sampleBuckets/install
    done
fi

其中SAMPLE_BUCKETS 可以是逗号分隔的环境变量,可能的值是gamesim-samplebeer-sampletravel-sample 的组合。 --data-ascii 选项可防止 curl 阻塞动态创建的 JSON。

如果有一种简单的方法可以在前台启动服务器就好了。 :)

【讨论】:

  • 您是否查看过在后台启动服务器、调用 REST API,然后将其带回前台的服务器? set -m /entrypoint.sh couchbase-server & sleep 10 Invoke REST API fg 1 Complete script at:github.com/arun-gupta/docker-images/blob/master/couchbase/…
  • 直接调用couchbase-server会给我一堆错误。基本图像之间存在差异,并且您的图像与我拥有的图像之间存在依赖关系。但我会尝试fg 1
  • 我使用supervisor 来控制进程。 fg 1 没用,但 $CB_HOME/etc/couchbase_init.d restart &amp;&amp; fg 成功了。谢谢。
  • fg 1 需要启用作业控制。
猜你喜欢
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
相关资源
最近更新 更多