Docker 使用 --mount 标志时容器不会 运行

Docker container does not run when using --mount flag

我只想创建一个 docker 容器,该容器使用 found here.

指南从官方 Node.js 图像中提取

我想做的唯一改变是我想将我的主机目录挂载到我的容器中,这样我就可以在主机上创建新文件并在容器中更新它们。

我已经尝试了所有建议here:-v 标志、--mount 标志等

但是当我将这些标志与 运行 命令一起使用时,实际上没有容器 运行s.

我运行以下:

docker run -p 49160:8080 -d myname/node-web-app --mount source=/Users/myname/desktop/dockyard/enviro

它吐出一个容器ID:

7302055670c231fb41d04d6475d42405cbee834e37e0827a68d7c396a918d3ec

但是当我 运行 docker-ps 容器列表是空的。

当我检查 docker-ps -a 时,我可以看到它已退出,代码为 9:

CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                         PORTS                    NAMES
dbf7973608a0        myname/node-web-app            "docker-entrypoint.s…"   4 seconds ago       Exited (9) 2 seconds ago                                quirky_sammet

我已经搜索了代码 9 的解释,但找不到任何内容。

非常感谢能提供的任何帮助。

更新

试过: docker run -p 49160:8080 -d myimage -v /Users/myname/desktop/dockyard/enviro:/usr/src/main

容器以代码 0 退出。docker logs 只需 returns v11.15.0

我知道这意味着容器正在退出,因为没有进程,但是如果我 运行 docker run -p 49160:8080 -d myimage 没有 -v 标志,容器 运行 完全没问题。

所以不确定为什么 -v 标志会导致退出 (0)。

Dockerfile 根据 Node.js 教程:

FROM node:11

# Create app directory
WORKDIR /usr/src/main

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "npm", "start" ]

您可能会发现在调试时 docker run --interactive --ttydocker run --detach 更容易。

我认为您的 mount 语法很乏味。我认为您需要 sourcetarget 否则 Docker 引擎不知道将目录映射到容器中的何处。

我不太熟悉 --mount 语法,所以请尝试以下操作将您的本地目录 (/Users/myname/desktop/dockyard/enviro) 映射到容器的目录 (/Users/myname)

--volume=/Users/myname/desktop/dockyard/enviro:/Users/myname

当容器退出时,您应该能够使用例如:

提取日志
docker logs dbf7973608a0

更新

您提供的应该有效;对我有用。

我在 :8080 上创建了一个简单的 Express 服务器,并在主机目录中映射到容器。

已创建 index.js:

const express = require('express')
const app = express()
const port = 8080

app.get('/', (req, res) => res.send('Happy Birthday Freddie!'))

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

和package.json:

{
    "name": "test",
    "version": "0.0.1",
    "scripts": {
        "start": "node ./index.js"
    },
    "dependencies": {
        "express": "~4.17.1"
    }
}

然后建|运行它:

docker build --tag=56822320 .
docker run \
--interactive \
--tty \
--publish=8080:8080 \
--volume=${PWD}:/test \
56822320

有效:

curl localhost:8080
Happy Birthday Freddie!

证明映射有效:

docker run \
--interactive \
--tty \
--publish=8080:8080 \
--volume=${PWD}:/test \
56822320 /bin/sh
# ls /test
Dockerfile  index.js  package.json

HTH!