我已经阅读了有关使用 docker 的教程:
docker run -it -p 9001:3000 -v $(pwd):/app simple-node-docker
但如果我使用:
docker run -it -p 9001:3000 simple-node-docker
它也有效吗?
-v
是不是更需要?还是从 Dockerfile 中获取 WORKDIR 行?FROM node:9-slim
# WORKDIR specifies the directory our
# application's code will live within
WORKDIR /app
另一个教程使用
mkdir ./app
在工作文件上,其他人没有,所以如果 WORKDIR 不存在,就足以让 docker 自动创建文件夹
最佳答案
将应用程序内容放入 Docker 容器有两种常用方法。我见过的许多 Node 教程都混淆了它们。你不需要docker run -v
, 为您提供 docker build
进行更改时的容器。
第一种方法是将应用程序的静态副本复制到镜像中。您可以通过 Dockerfile 执行此操作,通常看起来像这样:
FROM node
WORKDIR /app
# Install only dependencies now, to make rebuilds faster
COPY package.json yarn.lock ./
RUN yarn install
# NB: node_modules is in .dockerignore so this doesn't overwrite
# the previous step
COPY . ./
RUN yarn build
CMD ["yarn", "start"]
生成的 Docker 镜像是自包含的:如果您只有该镜像(也许
docker pull
从存储库编辑它),您可以运行它,正如您所注意到的,没有任何特殊的 -v
选项。此路径的缺点是您需要重新运行 docker build
如果您进行了任何更改,请重新创建图像。第二种方式是使用
docker run -v
将当前源目录注入(inject)到容器中。例如:docker run \
--rm \ # clean up after we're done
-p 3000:3000 \ # publish a port
-v $PWD:/app \ # mount current directory over /app
-w /app \ # set default working directory
node \ # image to run
yarn start # command to run
此路径隐藏了
/app
中的所有内容图像中的目录,并将容器中的目录替换为您当前目录中的任何内容。这要求您有一个可用的应用程序源代码树的内置功能副本,因此它支持实时重新加载等功能;有助于开发,而不是你想要的 Docker 在生产中。就像我说的,我已经看到很多教程做这两件事:
# First build an image, populating /app in that image
docker build -t myimage .
# Now run it, hiding whatever was in /app
docker run --rm -p3000:3000 -v$PWD:/app myimage
您不需要
-v
选项,但如果您的应用程序发生更改,您确实需要手动重建。$EDITOR src/file.js
yarn test
sudo docker build -t myimage .
sudo docker run --rm -p3000:3000 myimage
正如我在这里注意到的
docker
命令需要 root 等效权限;但另一方面,最后的 docker run
命令非常接近您“真正”运行的内容(可能通过 Docker Compose 或 Kubernetes,但不需要应用程序源的副本)。
关于docker -v 不再需要了?和 Dockerfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52686534/