【发布时间】:2021-10-17 02:25:48
【问题描述】:
我用 Postgres 数据库构建了一个小型 Node.js 应用程序。我想对它进行 Dockerize 化,当我使用 docker-compose 时一切正常,现在我试图将它放在 AWS EC2 上,我正在使用 docker run,但它不起作用。
Docker 运行命令:
docker run -d -p 80:4000 --name appname hubname/appname
容器立即启动和停止
我对 Docker 还很陌生,所以我想我错过了一些东西。
请找到我的 Dockerfile:
FROM node:14 as base
WORKDIR /home/node/app
COPY package*.json ./
RUN npm install
COPY . .
FROM base as production
ENV NODE_PATH=./build
RUN npm start
我的 docker-compose:
version: '3.7'
services:
appname-db:
image: postgres
container_name: appname-db
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
- '5432:5432'
volumes:
- appname-db:/var/lib/postgresql/data
ts-node-docker:
build:
context: .
dockerfile: Dockerfile
target: production
volumes:
- ./src:/home/node/app/src
- ./nodemon.json:/home/node/app/nodemon.json
container_name: ts-node-docker
environment:
DB_HOST: ${DB_HOST}
DB_SCHEMA: ${DB_SCHEMA}
DB_USER: ${DB_USER}
DB_PASSWORD: ${DB_PASSWORD}
depends_on:
- appname-db:
condition: service_healthy
expose:
- '4000'
ports:
- '80:4000'
stdin_open: true
command: npm run start
volumes:
appname-db:
当我这样做时:
docker ps -a我看到容器启动并立即退出。
我找不到任何日志,这非常令人沮丧。
任何帮助/指针将不胜感激。
编辑 1 - 一些附加信息:
【问题讨论】:
-
我认为您必须将构建工件从构建的第一阶段(在第二条
FROM指令之前)复制到构建的第二阶段。例如,这是使用 ``COPY --from=0 /home/node/app/build ./` 完成的。有关多阶段构建如何工作的更多信息,请参阅docs.docker.com/develop/develop-images/multistage-build。 -
是否有理由不在您的服务器上使用 docker-compose up?我建议你坚持使用 Docker Compose,它更容易控制。您可能必须停止并删除现有容器。他们经常被卡住,并且图像的重建永远不会覆盖旧图像,因为它在完美世界中应该这样做。运行 docker ps -a,获取每个 ID,然后获取
docker stop <id>和docker rm <id>。首先让我们知道这是否有帮助。 -
使用
docker-compose up --build --force-recreate似乎也能解决一些问题。要摆脱系统上的每个悬挂容器,只需docker system prune -f。重新开始,通常问题就解决了。 -
@MarcSances 谢谢你的建议,不幸的是,我试过了,但没有成功。
-
@anatolhiman 你能用来自 docker hub 的图像做 docker-compose 吗?
标签: node.js postgresql docker docker-compose dockerfile