在运行容器时成功使用curl

在运行容器时成功使用curl,curl,docker,dockerfile,marklogic,Curl,Docker,Dockerfile,Marklogic,我正在尝试使用Docker构建并运行Marklogic实例。Marklogic提供了一些不错的http api,因此,作为Dockerfile中的finalCMD,我运行了两个脚本,它们通过curl执行一些http请求,以便在容器启动时正确配置Marklogic的实例。但当我运行我的形象 docker run -p 7997-8002:7997-8002 --name gi-ml-container -e USER=admin -e PASSWORD=admin -e REALM=public

我正在尝试使用Docker构建并运行Marklogic实例。Marklogic提供了一些不错的http api,因此,作为Dockerfile中的final
CMD
,我运行了两个脚本,它们通过
curl
执行一些http请求,以便在容器启动时正确配置Marklogic的实例。但当我运行我的形象

docker run -p 7997-8002:7997-8002 --name gi-ml-container -e USER=admin -e PASSWORD=admin -e REALM=public -e HOST=gi-ml-container gi-marklogic
我得到了这个错误:

0curl: (6) Could not resolve host: gi-ml-container; Name or service not known
我想科纳纳的名字应该足够大。如何对Dockerfile运行的容器执行
curl
?这条路对吗? 我正在使用Docker 1.12.6,在Ubuntu 16.04上构建78d1802。这是我的Dockerfile:

FROM centos:centos7
ARG USER=admin
ARG PASSWORD=admin
ARG REALM=public
ARG HOST=localhost
RUN yum -y install glibc.i686 gdb.x86_64 redhat-lsb.x86_64 && yum clean all
RUN yum -y install initscripts && yum clean all
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/MarkLogic/mlcmd/bin
COPY MarkLogic-RHEL7-8.0-6.3.x86_64.rpm /tmp/MarkLogic-RHEL7-8.0-6.3.x86_64.rpm
COPY marklogic.admin.setup.sh /tmp/marklogic.admin.setup.sh
COPY marklogic.init.database.sh /tmp/marklogic.init.database.sh
RUN chmod +x /tmp/*.sh
RUN yum -y install /tmp/MarkLogic-RHEL7-8.0-6.3.x86_64.rpm
RUN rm /tmp/MarkLogic-RHEL7-8.0-6.3.x86_64.rpm
EXPOSE 7997 7998 7999 8000 8001 8002
CMD /etc/init.d/MarkLogic start && ./tmp/marklogic.init.database.sh -h $HOST && ./tmp/marklogic.admin.setup.sh -u $USER -p $PASSWORD -r $REALM -h $HOST && tail -f /dev/null
此Dockerfile使用两个
.sh
文件在容器启动时配置Marklogic实例。这是
marklogic.init.database.sh

TIMESTAMP=`curl -d "" -X POST http://${HOST}:8001/admin/v1/init`
TIMESTAMP=`$CURL -X POST -H
"Content-type: application/x-www-form-urlencoded" \
--data "admin-username=${USER}" --data "admin-password=${PASS}" \
--data "realm=${SEC_REALM}" \
http://${HOST}:8001/admin/v1/instance-admin`
这是我的
marklogic.admin.setup.sh

TIMESTAMP=`curl -d "" -X POST http://${HOST}:8001/admin/v1/init`
TIMESTAMP=`$CURL -X POST -H
"Content-type: application/x-www-form-urlencoded" \
--data "admin-username=${USER}" --data "admin-password=${PASS}" \
--data "realm=${SEC_REALM}" \
http://${HOST}:8001/admin/v1/instance-admin`
我非常关注Maklogic在几篇好文章中所展示的关于如何做到这一点的内容。

几件事:

1) 您必须在
docker run
中使用
-h
选项指定主机名:
-h gi-ml-container-d

docker run -p 7997-8002:7997-8002 --name gi-ml-container -e USER=admin -e PASSWORD=admin -e REALM=public -e HOST=gi-ml-container-d -h gi-ml-container-d gi-marklogic
因此,您可以在不使用
$HOST
的情况下更改docker文件和脚本,但它们只需将
-h
添加到
docker运行中即可工作

2) 当您将
MarkLogic
作为服务启动时,它会过快地返回控件,因此在下一个命令运行时它还没有运行。因此,添加睡眠来延迟它:

CMD /etc/init.d/MarkLogic start && sleep 5 && /tmp/marklogic.init.database.sh -h $HOST && sleep 5 && /tmp/marklogic.admin.setup.sh -u $USER -p $PASSWORD -r $REALM -h $HOST && tail -f /dev/null
3) 在
marklogic.admin.setup.sh
脚本中,确保
$CURL
不是空的。也许你可以直接在里面写
curl
。另外(可能已经正确,这只是一个复制和粘贴问题)请确保
“内容类型…”
-X POST-H
位于同一行(或与
\
连接,如下行所示)


4) 最后,尽管它不应该有任何影响,因为您在
/tmp
中为脚本使用了绝对路径名,但不需要将
放在它们前面(因此,不是
/tmp/marklogic.init.database.sh
而是
/tmp/marklogic.init.database.sh
就足够了,它不依赖于您的工作目录。

您正在运行Maklogic的同一个容器上运行curl?因此您可以通过调用localhost:
TIMESTAMP=`curl-d来对自己的机器进行curl-X柱http://localhost:8001/admin/v1/init`
。这可能会有帮助。您好!这是我第一次尝试,但我得到了相同的结果:
连接到本地主机失败:8001;连接被拒绝。
。我不太确定何时执行卷发(我也不知道)。通常,您假设容器启动,然后对容器执行外部卷曲,无论容器是否已设置。这是我的建议,也是我在CI/测试工作流中所做的。