我正在尝试对基于React和Node / Express的应用进行docker化。当我运行命令docker-compose up --build
时,我在终端中得到以下内容
并且当我运行docker ps
时,只有server-app
容器已启动并正在运行(因此client-app
无法成功构建吗?)。同样,当我运行docker-compose exec
输入执行的容器时,在该容器内没有创建任何客户端应用程序。有什么想法我做错了吗?
这是文件夹结构的样子
这些是我的docker文件
docker-compose.yml
version: "3"
services:
server:
container_name: server-app
build:
context: ./server
dockerfile: Dockerfile
command: nodemon --inspect server.js
ports:
- "5000:5000"
volumes:
- "./server/:/app/server"
- "/app/server/node_modules"
networks:
- appnet
client:
container_name: client-app
build:
context: ./client
dockerfile: Dockerfile
volumes:
- "./client/:/app/client"
- "/app/client/node_modules"
ports:
- "3000:3000"
environment:
- NODE_ENV=development
networks:
- appnet
depends_on:
- server
networks:
appnet:
driver: "bridge"
服务器/ Dockerfile
FROM node:12.14-alpine
WORKDIR /app/server
# Install nodemon
RUN npm install -g nodemon
COPY ./package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
客户端/ Dockerfile
FROM node:12.16-alpine
WORKDIR /app/client
COPY ./package*.json ./
RUN npm install --silent
RUN npm install [email protected] -g --silent
COPY . .
CMD ["npm", "start"]
问题是客户端在服务器启动并准备就绪之前尝试连接到服务器。下面的配置不足以解决依赖项
depends_on:
- server
作为快速解决方案或解决方法,您可以将此行添加到客户端配置中
restart: always
更好的解决方案是为您的客户实施wait_for
,以更新您的client/Dockerfile
FROM node:12.16-alpine
WORKDIR /app/client
COPY ./package*.json ./
RUN npm install --silent
RUN npm install [email protected] -g --silent
COPY . .
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
添加docker-entrypoint.sh
(chmod a + x)
#!/bin/sh -e
until nc -vz server:5000 > /dev/null; do
>&2 echo "server:5000 is unavailable - sleeping"
sleep 2
done
>&2 echo "server is up"
npm start
exit 0