在 运行 个容器中成功使用 curl
Using curl with success while running containers
我正在尝试使用 Docker 构建并 运行 一个 Marklogic 实例。 Marklogic 提供了一些不错的 http api,因此,作为 Docker 文件中的最终 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
我觉得conainer的名字应该够了。如何通过 Docker 文件对我正在 运行 的容器执行 curl
?这是正确的方法吗?
我正在使用 Docker 1.12.6,在 Ubuntu 16.04 上构建 78d1802。这是我的 Docker 文件:
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
此 Docker 文件使用两个 .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`
几件事:
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 和脚本,但它们只需将 -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
就足够了,它不依赖于您的工作目录。
我正在尝试使用 Docker 构建并 运行 一个 Marklogic 实例。 Marklogic 提供了一些不错的 http api,因此,作为 Docker 文件中的最终 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
我觉得conainer的名字应该够了。如何通过 Docker 文件对我正在 运行 的容器执行 curl
?这是正确的方法吗?
我正在使用 Docker 1.12.6,在 Ubuntu 16.04 上构建 78d1802。这是我的 Docker 文件:
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
此 Docker 文件使用两个 .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`
几件事:
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 和脚本,但它们只需将 -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
就足够了,它不依赖于您的工作目录。