如何使用docker compose文件中的命名映像和指定映像的Dockerfile启动命名NodeJS容器



给定此目录结构:

.
├── backend
├── compose.yaml
└── frontend
└── Dockerfile.dev
2 directories, 2 files

我的"compose.yaml";是这样的:

services:
frontend_service:
container_name: frontend_container
restart: always
image: frontend_image
build:
context: .
dockerfile: ./frontend/Dockerfile.dev
working_dir: /home/frontend
volumes:
- ./frontend:/home/frontend

我的"Dockerfile.dev";是这样的:

FROM node:lts

但当我运行docker compose up --build -d时,frontend_container不断重新启动,我无法将docker exec -it frontend_container bash放入其中进行验证。我收到这个错误消息Error response from daemon: Container 0136df5ba3c803dcded6695f65e51c38f4efe397859e77d001f862ced626d969 is restarting, wait until the container is running

当我docker ps --all时,我得到了这个:

CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS                        PORTS                           NAMES
0136df5ba3c8   frontend_image   "docker-entrypoint.s…"   4 seconds ago   Restarting (0) 1 second ago                                   frontend_container
9dbc74fa0bbb   postgres_image   "docker-entrypoint.s…"   9 days ago      Up 33 minutes                 0.0.0.0:5432->5432/tcp          postgres_container
f717459d3c53   pgadmin4_image   "/entrypoint.sh"         9 days ago      Up 33 minutes                 443/tcp, 0.0.0.0:5050->80/tcp   pgadmin4_container

你可能想知道为什么我有这样一个奇怪的组成文件。但如果您注意到,我有一个postgres容器和一个pgadmin容器正在运行。在使用node进行测试之前,我先用这两个组件测试了这个组合文件结构。

给定另一个项目中的目录结构:

.
├── compose.yaml
├── pgadmin4.Dockerfile
└── postgres.Dockerfile
0 directories, 3 files

";compose.yaml";如下所示:

services:
postgres_service:
container_name: postgres_container
image: postgres_image
build:
context: .
dockerfile: postgres.Dockerfile
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- '5432:5432'
volumes:
- postgres_volume:/var/lib/postgresql/data
networks:
- db_network
pgadmin4_service:
container_name: pgadmin4_container
build:
context: .
dockerfile: pgadmin4.Dockerfile
image: pgadmin4_image
restart: always
environment:
- PGADMIN_DEFAULT_EMAIL=admin@admin.com
- PGADMIN_DEFAULT_PASSWORD=root
- PGADMIN_LISTEN_PORT=80
ports:
- '5050:80'
volumes:
- pgadmin4_volume:/var/lib/pgadmin
networks:
- db_network
volumes:
pgadmin4_volume:
name: "pgadmin4_volume"
postgres_volume:
name: "postgres_volume"
networks:
db_network:
name: "db_network"

而";pgadmin4.Dockerfile";如下所示:

FROM dpage/pgadmin4

而";postgres。Dockerfile";如下所示:

FROM postgres:latest

我基本上把compose文件从postgres/pgadmin项目复制到了NodeJS项目,并做了一些调整,但当我使用docker compose时,NodeJS容器崩溃的事实很奇怪。如果我使用docker run -d --name hello_node node:lts,我可以很容易地完成docker exec -it hello_node bash,而yarn --version工作得很好。为什么我不能用docker compose为NodeJS设置这个工作流?这不可能吗?如有任何帮助,我们将不胜感激。

您的frontend_container没有运行任何PID为1的进程。在frontend_service的撰写配置中提供一个命令,这样容器在运行后不会立即退出。这个过程可以是任何服务,例如开发服务器。在本例中,我正在运行一个命令tail -f /dev/null

services:
frontend_service:
container_name: frontend_container
restart: always
image: frontend_image
build:
context: .
dockerfile: ./frontend/Dockerfile.dev
working_dir: /home/frontend
volumes:
- ./frontend:/home/frontend
tty: true
command: tail -f /dev/null

PS:容器运行后;使用docker exec命令登录到此容器的bashsh。现在,如果您在这个conainter的shell中运行$ top命令,您会发现tail命令正在使用PID 1运行。在docker中,这个过程是一个主过程,当它退出时,容器就存在了。我希望它能让您弄清楚在docker容器中的main进程中运行什么。

相关内容

最新更新