【问题标题】:How to hit HTTP endpoint from Docker image?如何从 Docker 映像中访问 HTTP 端点?
【发布时间】:2022-01-08 02:56:27
【问题描述】:

我有NodeJS/TypeScript 应用程序(github repo),当我运行package.json 中定义的script 时它工作正常。即,npm run start 将启动我的本地主机,我可以通过 POSTMAN 访问端点。

我已经创建了 docker 镜像(我是 Docker 的新手,这是我的第一个镜像)。在这里,我在 POSTMAN 中收到 Error: connect ECONNREFUSED 127.0.0.1:7001 错误。

我注意到,当我运行 docker 文件时,我在终端中没有看到 Listening on port 7001 消息。这告诉我我在.Dockerfile 中犯了一些错误。

步骤:

  • 我使用docker build -t <IMAGE-NAME> .创建了docker镜像我可以看到成功创建的镜像。
  • 我使用docker run --name <CONTAINER-NAME> <IMAGE-NAME> 启动了容器
  • 我还在 POSTMAN 中禁用了 Use the system proxy 设置,但没有运气。

详情:

  • Package.json 文件
"scripts": {
    "dev": "ts-node-dev --respawn --pretty --transpile-only src/server.ts",
    "compile": "tsc -p .",
    "start": "npm run compile && npm run dev"
  }
  • 当我运行 npm run start 时来自 terminal 的响应(这是成功的)

  • Dockerfile
#FROM is the base image for which we will run our application
FROM node:12.0.0

# Copy source code
COPY . /app 

# Change working directory
WORKDIR /app

# Install dependencies
RUN npm install
RUN npm install -g typescript

# Expose API port to the outside 
EXPOSE 7001

# Launch application
CMD ["npm", "start"]
  • 运行 docker 命令后的响应

  • GitHub 存储库结构

【问题讨论】:

  • “EXPOSE”命令只是让 docker 知道容器中的端口应该可以在容器外部访问。要从外部 docker 实际使用它,您需要使用 Dante 在他的回答中解释的“-p”。您可能有十几个 Web 服务器容器都暴露相同的端口,但它们可以映射到主机上的不同端口。我认为This post 很好地解释了它。

标签: node.js typescript docker


【解决方案1】:

您是否忘记将容器端口映射到主机端口?

docker run --name <CONTAINER-NAME> -p 7001:7001 <IMAGE-NAME>

-p 可以将端口暴露给您的网络。左侧的数字是容器端口(Dockerfile 上公开的 7001),第二个是主机上的目标端口。您也可以将其设置为其他可用端口。例如:-p 7001:3000在 http://localhost:3000 上公开

查看 Docker documentation 了解网络

【讨论】:

  • 感谢您的建议。我不再收到那个错误了。我看到的是socket hung up 错误。让我试着解决这个问题。看起来我的快递服务器没有运行,但这是我现在的猜测。
  • 如果有效,请标记为正确答案,以帮助其他人轻松找到。
【解决方案2】:

最后,我能够通过两件事来完成这项工作:

  1. 使用@Dante 的建议(如上所述)。
  2. 用以下内容更新我的.Dockerfile
FROM node:12.0.0

# Change working directory
WORKDIR /user/app

# Copy package.json into the container at /app
COPY package*.json ./

# Install dependencies
RUN npm install
RUN npm install -g typescript

# Copy the current directory contents into the container at root level (in this case, /app directory)
COPY . ./

# Expose API port to the outside 
EXPOSE 7001

# Launch application
CMD ["npm", "run", "start"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多