我正在尝试创建一个 GitLab 管道,但由于某种原因,我运行后:
- docker run image composer install
- docker run image ls
它显示了我的项目的每个文件,除了供应商目录,即使在作业日志中我看到依赖项确实安装了。
CONDUCT.md
CONTRIBUTING.md
Dockerfile
LICENSE.md
README.md
TODO.md
Vagrantfile
composer.json
composer.lock
config
data
html
module
phpcs.xml
phpunit.xml.dist
public
我错过了什么吗?
Docker run
将把图像运行到一个独特的容器中。命令完成后,您的容器将“完成”,并且您执行的任何内容都可以在该容器的卷中使用。
当您再次执行 docker run
时,会创建另一个容器,因此之前的命令永远不会在该容器中执行(使用容器的卷)。
如果您想将其与虚拟机进行比较(以更好地理解它),每个
docker run
命令都会启动一个不同的虚拟机。命令完成后,虚拟机将暂停。
根据你的问题,我不确定你想做什么,所以我只描述2种情况。
如果您只想在映像中运行命令,但不想构建新映像。您应该将其添加到您的 gitlab-ci.yaml 文件中。它将运行您图像中的命令。
#.gitlab-ci.yaml
your_job:
image: [your_image]
script:
- composer install
- ls
如果您想构建镜像,则必须将命令添加到 Dockerfile 中。然后在管道中构建图像。
# Dockerfile
FROM [your_image]
WORKDIR /var/www
COPY . .
RUN composer install \
&& ls
然后您可以将以下脚本添加到您的管道中
# .gitlab-ci.yml
your_job:
script:
- docker build -t [repository]:[tag]
- docker push [repository]:[tag]
我还看到有些人在 docker 构建范围之外运行
composer install
,然后复制项目和供应商目录。通常是因为它们需要不同的系统包,但您可以为此使用多阶段 docker 构建。