2016-08-30 3 views
0

Ich möchte einen separaten Docker-Container haben, der meine App erstellt, und wenn es fertig ist, übergibt es einen 'dist'-Katalog an den zweiten Container, der bereitgestellt wird.Ordner zwischen Builds übergeben - GitLab CI mit Docker

Ich habe versucht, die Artefakte und "Volume" Anweisung, aber es scheint nicht zu funktionieren. Hat jemand irgendwelche Probleme oder Lösungen?

.gitlab-ci.yml

stages: 
    - build 
    - push 
    - deploy 


build_app: 
    stage: build 
    script: 
    - ./deployment/build.sh 
    tags: 
    - shell 
    artifacts: 
    paths: 
    - /dist 

push_app: 
    stage: push 
    script: 
    - ./deployment/push.sh 
    tags: 
    - shell 
    dependencies: 
    - build_app 

deploy_app: 
    stage: deploy 
    script: 
    - ./deployment/deploy.sh 
    tags: 
    - shell 

build.sh

#!/bin/bash 
set -e 

echo "Building application" 

docker build -t build:latest -f "deployment/build.docker" . 

build.docker

RUN mkdir /app 
ADD . /app/ 

WORKDIR /app 

//code that creates /dist folder 

VOLUME ["/app/dist"] 

push.sh

#!/bin/bash 
set -e 
docker build -t push:latest -f "deployment/push.docker" . 

#and other stuff here 

push.docker

// the first catalog is not there 
ADD /app/dist /web 

Antwort

0

Ihr Problem ist, dass Sie nicht mit dem VOLUME-Befehl richtig in build.docker verwenden. Wenn Sie das neueste Image booten, wird der Inhalt von/app/dist in das Containerverzeichnis auf dem Host-Dateisystem kopiert. Das entspricht nicht Ihrem aktuellen Arbeitsverzeichnis.

Hier ist eine feste Version:

build.sh

#!/bin/bash 
set -e 

echo "Building application" 

docker build -t build:latest -f "deployment/build.docker" . 

# Remove old dist directory 
rm -rf ${PWD}/dist 

# Here we boot the image, make a directory on the host system ${PWD}/dist and mount it into the container. 
# After that we copy the files from /app/dist to the host system /dist 
docker run -i -v ${PWD}/dist:/dist -w /dist -u $(id -u) \ 
    build:latest sh cp /app/dist /dist 

push.docker

// the first catalog is not there 
COPY /dist /web 
+0

'sh: 0: kann nicht geöffnet cp ERROR: Build fehlgeschlagen: Exit-Status 1 ' Da stimmt etwas nicht – VanDavv

1

Was Sie suchen ist caching:

cache is used to specify a list of files and directories which should be cached between builds.

Also würde man so etwas in der Wurzel Ihrer gitlab-ci.yml definieren:

cache: 
    untracked: true 
    key: "$CI_BUILD_REF_NAME" 
    paths: 
    - dist/ 

build_app: ... 

Die dist/ wird dann zwischengespeichert werden unter allen Versionen verfügbar.

+0

'Schritt 3: ADD/dist/web lstat dist: keine solche Datei oder das Verzeichnis ERROR: Build failed : exit status 1 Leider funktioniert es nicht, und ja, das ist, was ich gesucht habe – VanDavv

+0

Ich verwende Cache für Java (MVN) und NodeJs Projekte, ich kann nicht wirklich sagen, warum es nicht für Sie arbeitet. Versuchen Sie, Ihr CI-Skript auf ein Minimum mit 2 Stufen zu strippen: eine Stufe, um den Cache aufzufüllen ('mkdir dist && touch dist/test.txt') und eine weitere Stufe, die prüft, ob Cache vorhanden ist (' cat dist/test.txt')). –

Verwandte Themen