【问题标题】:Converting a docker-compose file to a build and run command将 docker-compose 文件转换为构建和运行命令
【发布时间】:2017-06-19 11:26:57
【问题描述】:

我想通过使用 docker build 和 docker run 命令而不是通过 compose 文件来启动我的 docker 容器。

我开始将撰写文件转换为命令,但我卡住了。

编写文件:

version: '2' 
services:
  node:
    build: ./node_js
    command: node server.js
    depends_on:
      - mongo
    links:
      - mongo      
    environment:
      NODE_ENV: development  
    ports:
      - '8080:8080'
    volumes:
      - ./node_js:/home/app/chat
      - /home/app/chat/node_modules


  mongo:
    build: ./mongo
    ports:
      - "27017:27017"

这就是我目前的想法

构建命令(运行时有效):

docker build --tag testenvironment/node_js ./node_js

运行命令:

docker run -p 8080:8080 --link mongoDB:testenvironment/mongo --name nodejs -d testenvironment/mongo node server.js

我已将 VOLUMES 替换为 dockerfile,如下所示:

FROM node:4.3.2

RUN useradd --user-group --create-home --shell /bin/false app &&\
  npm install --global npm@3.7.5

ENV HOME=/home/app

COPY package.json npm-shrinkwrap.json $HOME/chat/
RUN chown -R app:app $HOME/*

USER app
WORKDIR $HOME/chat
RUN npm install

VOLUME ./node_js:/home/app/chat
VOLUME /home/app/chat/node_modules

CMD ["node", "index.js"]

我虽然这就是一切,但是当我运行命令时,Node.js 会立即启动和停止。谁能告诉我我做错了什么或错过了什么。

如果您想了解更多信息,请询问。

提前致谢!

我想我找到了解决办法。在运动学中环顾四周时,我找到了容器卷的 UI,但它没有显示本地文件夹,所以我手动添加了它。

这是否意味着挂载卷的命令不正确?

我使用的最后一个 docker run 命令:

docker run --network mongo_node_network -p 8080:8080 -e NODE_ENV=development -v //c/path/to/node_js:/home/app/chat -v /home/app/chat/node_modules --name node_js -d testenvironment/node_js  node index.js

当我使用运动学界面手动添加音量时,它工作正常。 Docker 检查结果:

"Mounts": [
        {
            "Type": "bind",
            "Source": "/c/Users/Jan/Desktop/PrototypeEnvironment/Software/PrototypeEnvironment/TestEnvironmentBuildTest/node_js",
            "Destination": "/home/app/chat",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        },
        {
            "Type": "bind",
            "Source": "/mnt/sda1/var/lib/docker/volumes/df707fea2364811c9377276e8fdbbd16d9af55720475f436b6206e77806bdb50/_data",
            "Destination": "/home/app/chat/node_modules",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],

【问题讨论】:

    标签: node.js docker docker-compose dockerfile


    【解决方案1】:

    修复图像名称并使用网络而不是链接。这大致相当于您的 docker-compose:

    docker network create mynet
    
    docker build -t testenvironment/node_js ./nodejs
    docker build -t testenvironment/mongo ./mongo
    
    docker run -d --network mynet -p 27017:27017 --name mongo testenvironment/mongo
    docker run --network mynet -p 8080:8080 -e NODE_ENV=development -v $(pwd)/node_js:/home/app/chat --name nodejs -d testenvironment/node_js  node server.js
    

    删除您在 Dockerfile 中添加的 VOLUMEs。

    正如@BMitch 建议的那样,由于您在 D4W 上,请确保您要挂载的目录位于与 Docker VM 共享的驱动器上。 Docker 工具箱的菜单可能与这些docs 不同:

    【讨论】:

    • 感谢@Robert 的回答,它帮了很多忙,但我仍然无法正常工作。我对 Node.js 的 docker run 命令进行了一些更改: 1. 我使用绝对路径而不是 $(pwd) 因为它不起作用(我认为它与我使用 Windows 的 Docker 工具箱有关) . 2.我加了第二卷,我想你只加了一个(对吗?)。但是当我启动 nodejs 容器时,出现以下错误:Error: Cannot find module '/home/app/chat/server.js'.
    • 我使用的运行命令:docker run --network mynet -p 8080:8080 -e NODE_ENV=development -v /home/app/chat/node_modules -v //c/path/to/node_js:/home/app/chat --name node_js -d testenvironment/node_js node server.js
    • 您的音量源是否存在于您的 Windows 主目录中?我相信默认情况下不允许这样做
    • 是的,有解决办法吗?
    • 由于您在 D4W 上,请确保您要挂载的目录位于与 Docker VM 共享的驱动器上。 docker 工具箱的菜单可能与这些文档不同:docs.docker.com/docker-for-windows/#shared-drives
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多