当我使用以下命令启动Docker容器时
docker run -it -d -p 8081:8080 --name ${APP_CONTAINER_NAME} ${APP_IMAGE}
我可以在浏览器上通过localhost:8081
但是,如果我改为使用以下两个卷来运行它:
docker run -it -d -p 8081:8080 -v ${PWD}:/app -v /app/node_modules --name ${APP_CONTAINER_NAME} ${APP_IMAGE}
端口映射被忽略-我无法在localhost:8081
上访问它,但可以在localhost:8080
上访问它。
我的dockerfile具有:
FROM node:8-alpine
RUN apk update && apk add bash
RUN npm install -g http-server
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 8080
CMD [ "http-server", "dist" ]
为什么将卷添加到第二个docker run命令中会忽略从8081到8080的端口映射?
如下面建议的那样,在没有 -d
的情况下运行(但有卷):
docker run -it -p 8081:8080 -v ${PWD}:/app -v /app/node_modules --name ${APP_CONTAINER_NAME} ${APP_IMAGE}
给予:
Starting up http-server, serving dist
Available on:
http://127.0.0.1:8080
http://172.17.0.2:8080
Hit CTRL-C to stop the server
但是即使容器确实在运行,我也无法在localhost:8080
或localhost:8081
上访问它:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
603b1bf02d58 app-image "http-server dist" 11 seconds ago Up 5 seconds 0.0.0.0:8081->8080/tcp app-container
当我改为运行没有卷但仍映射到8081时,它可以工作:
Starting up http-server, serving dist
Available on:
http://127.0.0.1:8080
http://172.17.0.2:8080
Hit CTRL-C to stop the server
,我可以在localhost:8081
上访问它。因此,添加卷时必须弄乱应用程序中的某些内容,只是不确定是什么。我也尝试过跑步:
docker volume prune
在启动容器之前,但是没有效果。为什么创建卷会阻止访问应用程序的任何想法?