2017-04-11 64 views
1

我正在嘗試使用Docker構建和運行Marklogic實例。 Marklogic提供了一些不錯的http api,因此,作爲Dockerfile中的最終CMD,我運行了兩個腳本,它們通過curl執行一些http請求,以便將Marklogic的實例正確配置爲容器啓動。但是,當我跑我的形象,運行容器時使用curl成功運行

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的名字應該是足夠多的。我如何對Dockerfile運行的容器執行curl?這是正確的方式嗎? 我在Ubuntu 16.04上使用Docker 1.12.6構建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顯示了一對夫婦如何做到這一點herehere漂亮的文章。

+0

您正在同一個容器上運行Maklogic正在運行的捲髮嗎?所以你c通過調用localhost來捲曲自己的機器:'''TIMESTAMP ='curl -d「」-X POST http:// localhost:8001/admin/v1/init'''。這可能有幫助。 – n2o

+0

你好!這是我第一次嘗試,但我得到了同樣的結果:'失敗連接到本地主機:8001;連接被拒絕。 – Francesco

+0

我不太清楚你捲髮的時候(我也不知道Maklogic)。通常情況下,您認爲您的容器啓動,然後對容器執行外部捲曲,無論它是否設置。這就是我的建議和我在CI /測試工作流程中所做的。 – n2o

回答

1

幾件事情:

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 

所以,你可以改變你的Dockerfile和腳本,而不使用$HOST,但他們的作品只是增加-hdocker 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就足夠了,並且它不會被您的工作目錄所限制)