在运行容器时使用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
就足够了,而且不会被你的工作目录所决定。