在运行容器时使用curl成功

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

 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 

我以为conainer的名字应该足够了。 我怎样才能curl到我正在运行Dockerfile的容器? 这是正确的吗? 我正在使用Docker 1.12.6,在Ubuntu 16.04上构build78d1802。 这是我的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实例configuration为容器启动。 这是marklogic.init.database.sh

 TIMESTAMP=`curl -d "" -X POST http://${HOST}:8001/admin/v1/init` 

这是我的marklogic.admin.setup.sh

 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情况下更改你的Dockerfile和脚本,但是它们只是在docker run添加-h

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 。 另外(可能已经是正确的,这只是一个复制和粘贴问题)确保"Content type..."是在-X POST -H的同一行上(或者像在以下行中一样将它连接在一起)

 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` 

4)最后,尽pipe它不应该有任何影响,因为你在/tmp脚本中使用绝对path名,你不需要放置. 在他们之前(所以没有./tmp/marklogic.init.database.sh但是/tmp/marklogic.init.database.sh就足够了,而且不会被你的工作目录所决定。