Docker 图片 "node" 在我可以访问它之前终止(使用 azure cli)
Docker image "node" terminates before I can access it (using azure cli)
我尝试在 Azure 上部署基于节点 (node:latest) 的图像。当我这样做时它会自动终止并且不让我做我需要用它做的事情。
我的 docker 文件:
WORKDIR /usr/src/app
COPY package.json .
COPY artillery-scripts.sh .
COPY images images
COPY src src
EXPOSE 80
RUN npm install -g artillery && \
npm install faker && \
npm install worker && \
npm install -g node-fetch -save && \
npm install -g https://github.com/preguica/artillery-plugin-metrics-by-endpoint.git
我试过在末尾添加 && \ while true; do echo SLEEP; sleep 10; done
这样它就不会自动终止但会产生错误。
有人知道这是什么问题吗?
最好先在本地尝试一下。看来您误解了 docker 的一些基本部分。
在你的 Dockerfile 中写一些会暂停的东西是没有意义的,因为那个文件是用来构建图像的,而不是 运行ning 容器。
获得镜像后,您可以运行一个或多个基于此镜像的容器。
通常你会想要在末尾放置一个 CMD 或 ENTRYPOINT 来告诉容器要 运行 的命令。阅读 this article,其中对两者都有很好的解释。
如果您想与容器交互,请查看 run command 的 -i 和 -t(或简称 -it)标志。当您 运行 您的容器时,您还可以提供一个命令,这将覆盖 CMD 中给出的任何命令或附加到 ENTRYPOINT 中的任何内容。
如果您不写 ENTRYPOINT 或 CMD,它将默认为 运行ning shell。
但是,如果您 运行 它没有 -it 它将启动 shell,认为它已经完成并立即停止。
同样,如果您想启动一个特定的脚本,例如您可以在 Dockerfile 的末尾添加一行,例如
CMD "node somefile.js"
因此,首先基于 docker 文件构建您的映像,然后 运行 基于该映像的容器:
docker build -t someImageName:someTag .
docker run -it someImageName:someTag // will run CMD, "node somefile.js" or:
docker run -it someImageName:someTag node // will override it and just run node
您可以在本地安装 docker,然后在您的本地计算机上完成所有操作,一旦您对它有所了解,一旦您确定您的 docker 文件是正确的,请查看如何将其部署到天蓝色。这样更容易调试和学习。
额外提示:您编写了 EXPOSE 80。阅读有关 EXPOSE 和 PUBLISH 的文档,因为当您开始时可能会感到困惑。 EXPOSE 只是用于文档,它实际上并没有暴露任何东西。如果你想以某种方式从外部世界连接到容器,你必须发布端口。这是在 运行 命令中完成的:
docker run -it someImageName:someTag -p 80:80 // the first is host port, the second is the container port.
我尝试在 Azure 上部署基于节点 (node:latest) 的图像。当我这样做时它会自动终止并且不让我做我需要用它做的事情。
我的 docker 文件:
WORKDIR /usr/src/app
COPY package.json .
COPY artillery-scripts.sh .
COPY images images
COPY src src
EXPOSE 80
RUN npm install -g artillery && \
npm install faker && \
npm install worker && \
npm install -g node-fetch -save && \
npm install -g https://github.com/preguica/artillery-plugin-metrics-by-endpoint.git
我试过在末尾添加 && \ while true; do echo SLEEP; sleep 10; done
这样它就不会自动终止但会产生错误。
有人知道这是什么问题吗?
最好先在本地尝试一下。看来您误解了 docker 的一些基本部分。 在你的 Dockerfile 中写一些会暂停的东西是没有意义的,因为那个文件是用来构建图像的,而不是 运行ning 容器。
获得镜像后,您可以运行一个或多个基于此镜像的容器。 通常你会想要在末尾放置一个 CMD 或 ENTRYPOINT 来告诉容器要 运行 的命令。阅读 this article,其中对两者都有很好的解释。
如果您想与容器交互,请查看 run command 的 -i 和 -t(或简称 -it)标志。当您 运行 您的容器时,您还可以提供一个命令,这将覆盖 CMD 中给出的任何命令或附加到 ENTRYPOINT 中的任何内容。 如果您不写 ENTRYPOINT 或 CMD,它将默认为 运行ning shell。 但是,如果您 运行 它没有 -it 它将启动 shell,认为它已经完成并立即停止。
同样,如果您想启动一个特定的脚本,例如您可以在 Dockerfile 的末尾添加一行,例如
CMD "node somefile.js"
因此,首先基于 docker 文件构建您的映像,然后 运行 基于该映像的容器:
docker build -t someImageName:someTag .
docker run -it someImageName:someTag // will run CMD, "node somefile.js" or:
docker run -it someImageName:someTag node // will override it and just run node
您可以在本地安装 docker,然后在您的本地计算机上完成所有操作,一旦您对它有所了解,一旦您确定您的 docker 文件是正确的,请查看如何将其部署到天蓝色。这样更容易调试和学习。
额外提示:您编写了 EXPOSE 80。阅读有关 EXPOSE 和 PUBLISH 的文档,因为当您开始时可能会感到困惑。 EXPOSE 只是用于文档,它实际上并没有暴露任何东西。如果你想以某种方式从外部世界连接到容器,你必须发布端口。这是在 运行 命令中完成的:
docker run -it someImageName:someTag -p 80:80 // the first is host port, the second is the container port.