我正在尝试使用Docker构建并运行Marklogic实例。 Marklogic提供了一些不错的http api,因此,作为Dockerfile中的最终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`
这是我的
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在有关如何执行here和here的几篇不错的文章中显示的内容。
最佳答案
几样东西:
1)您必须在-h
中使用docker run
选项指定主机名:-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和脚本,但是它们仅将-h
添加到docker run
即可工作。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)最后,虽然它不会产生任何影响,因为您为
/tmp
中的脚本使用了绝对路径名,因此无需在它们之前放置.
(因此./tmp/marklogic.init.database.sh
不够,但/tmp/marklogic.init.database.sh
足够,并且不受工作目录的影响。关于curl - 在运行容器时成功使用curl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43340487/