docker -v不需要了吗?和Dockerfile

时间:2018-10-07 07:58:39

标签: docker

我已经阅读了有关使用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自动创建文件夹(如果不存在)

1 个答案:

答案 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,但不需要应用程序源的副本)。