【问题标题】:Docker compose run yarn installDocker 撰写运行纱线安装
【发布时间】:2018-02-15 11:53:05
【问题描述】:

在 docker-compose build 命令期间在 Dockerfile 中运行步骤 RUN yarn install 时,我得到:

[1/4] 正在解析包... [2/4] 正在获取包... 信息 fsevents@1.1.3:平台“linux”与该模块不兼容。 info "fsevents@1.1.3" 是一个可选依赖项并且失败了 兼容性检查。从安装中排除它。 [3/4] 链接 依赖项...警告“@rails/webpacker > postcss-cssnext@3.1.0”有 未满足的对等依赖“caniuse-lite@^1.0.30000697”。警告” > webpack-dev-server@2.11.1" 具有未满足的对等依赖关系 "webpack@^2.2.0 || ^3.0.0”。警告“webpack-dev-server > webpack-dev-middleware@1.12.2" 具有未满足的对等依赖关系 “webpack@^1.0.0 || ^2.0.0 || ^3.0.0”。 [4/4] 构建新包...

但未创建 node_modules 文件夹。另一方面,当我运行时

docker-compose run SERVICE_NAME yarn install

我明白了:

[1/4] 正在解析包... [2/4] 正在获取包... 信息 fsevents@1.1.3:平台“linux”与该模块不兼容。 info "fsevents@1.1.3" 是一个可选依赖项并且失败了 兼容性检查。从安装中排除它。 [3/4] 链接 依赖项...警告“@rails/webpacker > postcss-cssnext@3.1.0”有 未满足的对等依赖“caniuse-lite@^1.0.30000697”。警告” > webpack-dev-server@2.11.1" 具有未满足的对等依赖关系 "webpack@^2.2.0 || ^3.0.0”。警告“webpack-dev-server > webpack-dev-middleware@1.12.2" 具有未满足的对等依赖关系 “webpack@^1.0.0 || ^2.0.0 || ^3.0.0”。 [4/4] 构建新包...

然后文件夹 node_modules 它是在项目文件夹中创建的。

我只是不明白为什么......我期待相同的功能,但我错过了一些东西。

这里是我的 docker-compose 服务

services:
  ruby:
    build:
      context: .
      dockerfile: docker/ruby/Dockerfile
    networks:
      - some-network
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - mysql
    command: bundle exec rails s -p 3000 -b '0.0.0.0'

Dockerfile

FROM ruby:2.5

# Install dependencies:
# - build-essential: To ensure certain gems can be compiled
# - nodejs: Compile assets
# - npm: Install node modules
# - yarn: Install & manage node modules [should make npm obsolete]
# - libpq-dev
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && \
    apt-get install -qq -y build-essential nodejs yarn \
    libpq-dev \
    mysql-client 

RUN mkdir /app
COPY . /app

WORKDIR /app

# install node dependencies
RUN yarn install

RUN bundle install

【问题讨论】:

  • 你确定在第一种情况下 node_modules 文件夹不是在容器内生成的吗?或者您是否有该服务的volume 映射?
  • 在运行 docker-compose build 之后,我进入容器并且文件夹不存在。我编辑了我的问题,以便向您展示 docker-compose 文件中的服务设置
  • 能否也提供docker/ruby/Dockerfile
  • 添加了Dockerfile
  • 我看到你已经在 docker-compose 中为 /app 路径映射了你的 docker 根路径,所以你不需要在 Dockerfile 中复制。如果要将所有文件复制到容器中,则必须删除 docker-compose 中的 volumes 部分。

标签: docker docker-compose yarnpkg


【解决方案1】:

首先根据Dockerfile创建一个镜像:

  1. 获取图像ruby:2.5 以从中创建新图像
  2. 安装所有依赖项
  3. 创建文件夹/app
  4. 将系统(项目目录)中的所有文件复制到映像的/app 路径
  5. 安装yarnbundle(调用镜像内的方法)

然后将您的项目文件夹“挂载”到图像的/app 文件夹,因此它与您的系统根文件夹相同。之后“生成”容器并从 Docker 文件(如果存在)执行CMD 命令。

请注意这不是图像/容器生成流程的详细说明,但希望它能帮助您解决问题。所以你可以

  1. 直接从容器运行代码(就像在 Dockerfile 中所做的那样)
  2. 或不要将源代码复制到容器并将代码作为卷挂载(就像您在 docker-compose.yml 中所做的那样),并在系统中执行 yarn install,或者使用安装命令创建入口点脚本:entrypoint: ./entrypoint.sh

文件示例

如果您想“即时”更新源文件(在不重建容器的情况下查看更新),您必须使用第二种方式。

在你的项目目录中创建文件run.sh:

run.sh

#!/bin/sh

echo '--- run yarn install'
yarn install

echo '--- run bundle install'
bundle install

# HERE YOU CAN RUN ANY OTHER SCRIPT BEFORE CONTAINER BUILDING

echo '--- create docker image and up it'
sudo docker-compose up -d --build

docker-compose.yml

无需更改(如您的问题所示)。

Dockerfile

FROM ruby:2.5

# Install dependencies:
# - build-essential: To ensure certain gems can be compiled
# - nodejs: Compile assets
# - npm: Install node modules
# - yarn: Install & manage node modules [should make npm obsolete]
# - libpq-dev
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && \
    apt-get install -qq -y build-essential nodejs yarn \
    libpq-dev \
    mysql-client 

WORKDIR /app

要构建和构建容器只需运行命令sh run.sh

它将在您的系统中安装节点依赖项,之后将创建容器,/app 文件夹将是您的项目文件夹(在您的系统中),因此您的代码更改将立即生效。

【讨论】:

  • 通过删除已安装的卷,我在容器中获得了 node_modules 文件夹,但在主机中没有。此外我不能修改容器外的文件。我需要在 IDE 中将容器文件夹与主机映射?
  • @Jordi 你不能用IDE映射容器文件夹(即使你可以通过你的容器IP,它会导致很多问题:权限,索引速度,同步问题)。允许容器从系统读取文件的常规方法(您在volume 部分完成),但在这种情况下,您需要在构建容器之前在系统中安装依赖项。请参阅更新的答案(EXAMPLE OF FILES 部分)
  • 我想在没有脚本的情况下运行 docker-compose。我尝试了这种方法 => phraseapp.com/blog/posts/…,但我没有看到在安装纱线后创建的文件夹(已经从 Dockerfile 中删除了复制部分),不在容器中,也没有在安装的卷中。有趣的是,当我进入容器并执行“yarn install”然后我在已安装的卷中看到“node_modules”文件夹,但当然我想在 Dockerfile 中获得相同的结果
  • 我不知道它是否是错误,但 docker 在挂载卷之后首先“执行”Dockerfile(直到 CMD 命令)。如果你想在没有脚本的情况下运行 docker-compose,创建 bash 文件 entrypoint.sh,在其中写入命令 yarn installbundle install 并运行你的 docker:sudo docker-compose up -d --build。 Docker 会自动执行entrypoint.sh(所以它只是你代码的一部分)。希望这种方式能有所帮助。
  • 我在您上一条评论中使用了您的方法,但后来我需要调试并意识到由于入口点,我无法使用 docker-compose 将远程 sdk 设置为调试。这是我基于所有文件的相同问题提出的另一个问题。希望你能看看。 stackoverflow.com/questions/48948058/…
猜你喜欢
  • 2020-04-11
  • 2019-03-23
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2020-07-31
相关资源
最近更新 更多