docker -v 不再需要了?和 Dockerfile

标签 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 自动创建文件夹

最佳答案

将应用程序内容放入 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/

相关文章:

docker - 无法推送到 docker hub(需要身份验证)

wsl2 上的 docker 非常慢

node.js - Node.js child_process.exec “/bin/sh: 1: docker: not found”错误

docker - 使用默认值时访问 COMPOSE_PROJECT_NAME

python - 如何从 Dockerfile 安装 Python 3.7 和 Pip

docker - 在Docker环境中使用pimcore

docker - 合并两个docker镜像

docker - 如何使用 docker cp 将多个文件从容器复制到主机

php - Docker:wordpress dev 沙盒环境

docker - Docker检查格式以检索特定网络的IP