1

我正在用 gitlab-runner 图像尝试一些东西,

    FROM gitlab/gitlab-runner:alpine
    WORKDIR /app
    COPY . /app
    RUN apk add yarn && yarn install

    RUN yarn --version        # this layer prints 1.16.0

    RUN ng build --prod
    EXPOSE 3000
    CMD ["yarn", "run", "start"]

以上是我创建的docker文件

    docker build -t runner:1 .

我能够成功构建图像

    docker run -p 3000:3000 runner:1

但是当我尝试运行容器时,它给了我以下错误

`*FATAL: Command yarn not found.*`

不确定行为,如果它能够apk add yarn在基础映像中安装 yarn () 并使用安装依赖项,yarn install那么它如何在运行容器时无法找到 yarn 命令?我要去哪里错了。

同样在 alpine 中安装了哪个目录纱线?

我知道它不是一个高效的 docker 文件,但我试图在优化它之前先运行容器。

4

2 回答 2

2

它输出版本。这意味着已经安装了纱线。您可以找到与找到版本相同的路径。

RUN which yarn

Step 6/10 : RUN which yarn
 ---> Running in 0f633b81f2ed
/usr/bin/yarn

我们可以看到/usr/bin/已经添加到PATH.

 Step 7/11 : RUN echo $PATH
 ---> Running in fc3f40b6bfd9
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

但我不明白为什么不从 PATH 读取纱线。

因此,我们在 Dockerfile 中明确设置了 PATH。

ENV PATH=${PATH} 

但是,问题仍然存在。现在我们必须在 Dockerfile 中分别ENTRYPOINT将yarn 和 commands 分开。CMD

ENTRYPOINT ["yarn"]
CMD ["run", "start"]

更新了 Dockerfile

FROM gitlab/gitlab-runner:alpine

ENV PATH=${PATH}

WORKDIR /app
COPY . /app
RUN apk add yarn && yarn install

RUN yarn --version        # this layer prints 1.16.0
RUN ng build --prod

EXPOSE 3000
ENTRYPOINT ["yarn"]
CMD ["run", "start"]
---

$ docker run -p 3000:3000 harik8/yarn:latest 
yarn run v1.16.0
error Couldn't find a package.json file in "/app"
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

基本图像的行为看起来不寻常。最好是通过它。

于 2020-05-29T09:08:16.790 回答
1

要构建您的应用程序,您不应使用 gitlab-runner 映像,而应使用“节点”映像。

Gilab-runner 映像用于运行 gitlab 代理,该代理可以连接到 docker 引擎并生成您将在其中执行构建的节点容器,在您的情况下是 docker 映像构建。

要使用 gilab,您需要准备一个 gitlab-ci 文件,您将在其中定义构建所需的步骤和“服务”。

Tl;dr:将基本图像更改为 node:latest 并作为一个完全独立的工作设置 gitlab 运行器。

但是,如果您的目标是让您的应用程序扩展 gitlab 运行程序,请尝试 docker 多阶段构建。

首先,使用 node:latest image 构建您的应用程序,然后将构建输出复制到 gitlab-runner。

诸如 gitlab-runner 之类的运行时映像已从 yarn 或 npm 之类的构建工具中剥离,这就是您的映像失败的原因。主要目标是保持运行时映像尽可能小,并且在生产级工作中不需要 sdk,有时甚至是危险的。

于 2020-05-28T22:03:28.650 回答