>我正在尝试一些带有 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 build -t runner:1 .
我能够成功构建映像
docker run -p 3000:3000 runner:1
但是当我尝试运行容器时,它给了我以下错误
`*FATAL: Command yarn not found.*`
不确定行为,如果它能够在基本映像中安装 yarn (apk add yarn
( 并使用yarn install
安装依赖项,那么它在运行容器时如何找不到 yarn 命令?我哪里出错了。
还有在哪个目录纱线安装在高山?
我知道它不是一个高效的 docker 文件,但我正在尝试在优化容器之前先运行容器。
它输出版本。这意味着纱线已经安装。您可以找到与查找版本相同的路径。
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
和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.
基本映像的行为看起来不寻常。最好通过它。
要构建您的应用程序,您不应该使用 gitlab-runner 图像,而应该使用 "node" 图像。
Gilab-runner 镜像用于运行 gitlab 代理,该代理可以连接到 docker 引擎并生成您将在其中执行构建的节点容器,在您的情况下是 docker 镜像构建。
要使用 gilab,您需要准备一个 gitlab-ci 文件,您将在其中定义构建所需的步骤和"服务"。
Tl;DR:将基本映像更改为 Node:Latest 并作为完全独立的工作设置 GitHubLab 运行程序。
但是,如果您的目标是让您的应用程序扩展 gitlab 运行器,请尝试 docker 多阶段构建。
首先,使用 node:latest image 构建应用,然后将构建输出复制到 gitlab-runner 中。
像 gitlab-runner 这样的运行时镜像是从 yarn 或 npm 等构建工具中剥离的,这就是你的镜像失败的原因。主要目标是保持运行时映像尽可能小,并且不需要 SDK,有时在生产级工作时很危险。