如何在docker中使用gulp运行node.js并找到正确的bashsrc

如何在docker中使用gulp运行node.js并找到正确的bashsrc,bash,docker,gulp,Bash,Docker,Gulp,我是Docker的新手,我确实有一些问题 我的目标是: 使用Dockerfile创建docker容器并留在容器内/不要从容器中退出 运行本地Docker容器 使用package.json安装“gulp” 在Docker上安装“gulp global” 将所有文件复制到我的Docker容器 执行“gulp--version”和默认的“gulptask”,并停留在终端内 以下是我的设置: Dockerfile FROM node:10 WORKDIR /usr/src/app COPY pack

我是Docker的新手,我确实有一些问题

我的目标是:

  • 使用Dockerfile创建docker容器并留在容器内/不要从容器中退出
  • 运行本地Docker容器
  • 使用package.json安装“gulp”
  • 在Docker上安装“gulp global”
  • 将所有文件复制到我的Docker容器
  • 执行“gulp--version”和默认的“gulptask”,并停留在终端内
以下是我的设置:

Dockerfile

FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --global gulp-cli
RUN npm install
COPY . .
EXPOSE 3000
CMD ["gulp --version" , "gulp"]  or? [gulp --version , gulp]
package.json

{
  "name": "docker-test",
  "version": "1.0.0",
  "description": "Testing Docker",
  "main": "index.js",
  "scripts": {
    "test": "test"
  },
  "author": "",
  "license": "",
  "devDependencies": {
    "gulp": "^4.0.0"
  }
}
gulpfile.js

function defaultTask(cb) {
 console.log("Default task for gulp 4.0 for docker")
  cb();
} 
exports.default = defaultTask 
docker-compose.yml(我不认为我们需要这个来回答我的问题,但我还是会发布它,因为我不确定这是否会产生一些问题)

我现在的问题是:

首先,我真的对docker的工作流程感到困惑。 如果我运行以下命令,我是否正确理解它:

docker build . --tag gulp-docker-test 
我将使用dockerfile的内容在我的计算机上创建一个新的docker容器? 如果我需要更新其中的任何内容,我必须再次运行它,以便更新容器

如果我使用:

docker start gulp-docker-test
它会启动容器吗?如果我改变了里面的东西怎么办?它会在容器重新启动时返回吗?还是因为它只是一个暂时的图像而消失了

除此之外,如果我尝试运行它,会出现以下错误:

ERROR: for gulp-docker-test  Cannot start service html: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"gulp --version\": executable file not found in $PATH": unknown

ERROR: for html  Cannot start service html: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"gulp --version\": executable file not found in $PATH": unknown
我确实尝试过这些方法:使用exec执行,删除Dockerfile的CMD中的引号,但我认为我缺少一些基本知识。我不明白如何在shell中启动这个容器,以便docker知道$path

提前谢谢你的帮助

编辑:

我确实发现了如何使用shell运行docker

docker run -it --entrypoint bash  gulp-docker-test3
如果我可以将默认bash添加到dockerfile中,它看起来应该可以工作。

首先 我将在我的计算机上创建一个包含内容的新docker容器 dockerfile的名字?如果我需要更新其中的任何内容,我必须 再次运行它以便更新容器

docker build
创建一个映像(如ISO)。要创建容器,必须启动/运行此映像。容器是一个正在运行的映像,它可能不同于原始映像,因为在运行期间,您可以修改其中的文件系统。停止并移除容器时,所有更改都将丢失。Docker的做法不是将数据存储在图像中——如果图像生成有价值的内容,则应将其存储在外部(考虑卷)

第二 这是不正确的。JSON表示法要求您将每个参数放在单独的数组元素中。这是正确的:

CMD ["guld", "--version"]
结论 您可以使用创建图像

docker build -t my-image .
您可以使用以下命令启动它(创建容器)

如果您需要控制正在运行的容器,可以使用友好的名称
我的图像实例
,或者,如果您没有提供,可以先使用容器的
ID

我将在我的计算机上创建一个包含内容的新docker容器 dockerfile的名字?如果我需要更新其中的任何内容,我必须 再次运行它以便更新容器

docker build
创建一个映像(如ISO)。要创建容器,必须启动/运行此映像。容器是一个正在运行的映像,它可能不同于原始映像,因为在运行期间,您可以修改其中的文件系统。停止并移除容器时,所有更改都将丢失。Docker的做法不是将数据存储在图像中——如果图像生成有价值的内容,则应将其存储在外部(考虑卷)

第二 这是不正确的。JSON表示法要求您将每个参数放在单独的数组元素中。这是正确的:

CMD ["guld", "--version"]
结论 您可以使用创建图像

docker build -t my-image .
您可以使用以下命令启动它(创建容器)

如果您需要控制正在运行的容器,可以使用友好的名称
my image instance
,或者,如果您没有提供,可以使用容器的
ID

如果我运行
docker build
我将创建一个新容器

它将执行Dockerfile的内容,并创建一个新图像

您需要
docker运行
(或者,很少情况下,
docker创建
)图像以从中创建容器。更新docker文件或应用程序源时,需要重复
docker build
步骤、
docker stop&&docker rm
现有容器,以及
docker run
新容器。您的
docker compose.yml
片段封装了这个,但是请注意,docker compose将在适当的时候删除并重新创建一个容器

如果我使用
docker启动吞咽docker测试

它将以该名称启动一个容器。这是一个独立于图像名称空间的名称空间。容器必须已经存在并停止(通常通过显式
docker stop
命令)。这是一种稍微不寻常的状态

CMD[“咕噜——版本”,“咕噜”]

这将查找名为
gulp--version
的二进制文件,并使用单个参数
gulp
运行它。由于您可能没有一个名为
/usr/local/bin/gulp--version
(文件名中包含空格和“version”)的文件,因此会出现错误

您在Dockerfile中只获得一个CMD。(或者改为一个入口点,但我倾向于认为CMD更可取,除非是在一些非常特殊的情况下。)在shell中键入的每个“单词”在语法中都变成一个单独的“单词”。比如说,你可以写

CMD ["gulp", "--version"]
或者,如果您不使用括号,Docker将把CMD文本包装在
sh-c…
中,这样更接近您实际编写的内容

CMD gulp --version && gulp
实际上,您通常会在构建映像时运行构建工具(如Gulp),并使用CMD实际启动应用程序

RUN gulp
CMD ["npm", "start"]
如果我运行
docker build
我将创建一个新容器

它将执行Dockerfile的内容,并创建一个新图像

您需要
docker运行
(或者,很少情况下,
docker创建
)图像以从中创建容器。当你起床的时候
CMD gulp --version && gulp
RUN gulp
CMD ["npm", "start"]