我已经阅读了有关使用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自动创建文件夹(如果不存在)
答案 0 :(得分:0)
有两种将应用程序内容放入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
将当前源目录注入到容器中。例如:
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,但不需要应用程序源的副本)。