0

我正在尝试使用 Docker 和 docker-compose在buildkite上为 Rails 应用程序设置测试环境,遵循 buildkite此处给出的示例

作为 Dockerfile 的一部分,我们正在编译应用程序上应该编译的资产,public/packs-test/我们可以使用下面该文件中的 ls 在 Dockerfile 中确认此输出。我们看到RUN ls /app/public包含 packs-test 目录的输出

当 docker-compose 然后由 buildkite 通过命令运行 docker-compose -f docker-compose.yml run -e RAILS_ENV=test --rm app /bin/sh -e -c 'ls public'时,它不包括 packs-test 目录。

这意味着当我们运行我们的规范时,他们会尝试在每个容器上重新编译。

如果我们在本地尝试这个,但是它确实包含预期的输出,所以不确定是否有可能通过他们使用的弹性堆栈设置阻止它在 buildkite 上工作?

我们是否错过了资产预编译中通过 docker compose 使该目录在容器中可用的步骤?

对此的任何见解将不胜感激

# Dockerfile

FROM ruby:2.5.1

# Lets us use "source"
SHELL ["/bin/bash", "-c"]

EXPOSE 5000

ENV RAILS_ENV=test

# Node/Yarn stuff
ENV NODE_VERSION 10.15.3
ENV YARN_VERSION 1.16.0

# Node, needed for asset pipeline
RUN curl -sSL "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" | tar --strip-components=2 -xJ -C /usr/local/bin/ node-v$NODE_VERSION-linux-x64/bin/node
RUN curl https://www.npmjs.com/install.sh | bash

# Install Yarn
RUN npm install -g "yarn@$YARN_VERSION"

WORKDIR /app

# Install Rubygems first
ADD Gemfile Gemfile.lock /app/
RUN gem install bundler \
    && bundle install -j 4

# Install npm libraries next
ADD package.json yarn.lock /app/
RUN yarn install --frozen-lockfile


# Now add the rest of your code
ADD . /app/

RUN RAILS_ENV="test" bundle exec rails assets:precompile


RUN ls /app/public

CMD ["rails", "server", "-p", "5000"]
#docker-compose.yml
version: '3'

services:
  app:
    build: .
    depends_on:
      - db
      - redis
    # This mounts the current Buildkite build into /app, ensuring any
    # generated files and artifacts are available to the buildkite-agent on
    # the host machine (outside of the Docker Container)
    volumes:
      - "./:/app"
    # env_file:
    #   - ".env.example"
    environment:
      REDIS_URL: redis://redis

    ports:
      - "5000:5000"

  db:
    image: postgres:10

  redis:
    image: redis

4

1 回答 1

0

虽然您的容器可能包含预编译的资产,但您正在使用以下行在其上安装一个卷:

    # This mounts the current Buildkite build into /app, ensuring any
    # generated files and artifacts are available to the buildkite-agent on
    # the host machine (outside of the Docker Container)
    volumes:
      - "./:/app"

因此,无论 Buildkite 提供什么,您都可以在里面生活/app。一个可能的解决方法是避免挂载该目录:

    # This mounts the current Buildkite build into /app, ensuring any
    # generated files and artifacts are available to the buildkite-agent on
    # the host machine (outside of the Docker Container)
    volumes:
      - "./:/app"
      - "/app/public"

您可能还需要考虑构建资产作为测试管道的一个步骤,并从 Dockerfile 中删除该功能(并创建仍然构建资产的生产映像版本)

于 2020-06-16T22:21:42.353 回答