如何在gitlab ci中合并Dockerfile?

时间:2018-12-20 12:59:03

标签: docker gitlab-ci

我有这个gitlab-ci.yml来构建我的SpringBoot应用程序:

image: maven:latest

variables:
  MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"

cache:
  paths:
    - .m2/repository/
    - target/

build:
  stage: build
  script:
    - mvn $MAVEN_CLI_OPTS clean compile
  only:
    - /^release.*/

test:
  stage: test
  script:
    - mvn $MAVEN_CLI_OPTS test
    - "cat target/site/coverage/jacoco-ut/index.html"
  only:
    - /^release.*/

现在,我需要在测试阶段运行另一个作业:集成测试。我的应用程序在带有内存数据库的Headless Chrome上运行集成测试,我需要在Windows上执行的所有操作是:mvn integration-test

我发现一个已经准备好无头Chrome的Dockerfile,所以我需要将maven:latest图像与此新图像https://hub.docker.com/r/justinribeiro/chrome-headless/

结合起来

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以通过选择@pytest.mark.parametrize('add_surname,age,expected', [[NAME1, AGE1, OUTPUT1], [NAME2, AGE2, OUTPUT2]], indirect=['add_surname']) 作为基础映像来编写新的docker文件。 (这意味着所有Maven最新的图像依赖项都在那里)。您可以将此link参阅如何编写docker文件。

由于maven:latest的基本映像是debian映像,而包含具有Headless Chrome的Dockerfile的docker文件也是debian映像,因此所有OS命令都是相同的。因此,您可以像下面这样编写一个docker文件,其中基本映像为maven:latest,其余映像与here相同。

maven:latest

我已经检查过了,它工作正常。一旦编写了FROM maven:latest LABEL name="chrome-headless" \ maintainer="Justin Ribeiro <justin@justinribeiro.com>" \ version="2.0" \ description="Google Chrome Headless in a container" # Install deps + add Chrome Stable + purge all the things RUN apt-get update && apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ --no-install-recommends \ && curl -sSL https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \ && echo "deb https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list \ && apt-get update && apt-get install -y \ google-chrome-beta \ fontconfig \ fonts-ipafont-gothic \ fonts-wqy-zenhei \ fonts-thai-tlwg \ fonts-kacst \ fonts-symbola \ fonts-noto \ ttf-freefont \ --no-install-recommends \ && apt-get purge --auto-remove -y curl gnupg \ && rm -rf /var/lib/apt/lists/* # Add Chrome as a user RUN groupadd -r chrome && useradd -r -g chrome -G audio,video chrome \ && mkdir -p /home/chrome && chown -R chrome:chrome /home/chrome \ && mkdir -p /opt/google/chrome-beta && chown -R chrome:chrome /opt/google/chrome-beta # Run Chrome non-privileged USER chrome # Expose port 9222 EXPOSE 9222 # Autorun chrome headless with no GPU ENTRYPOINT [ "google-chrome" ] CMD [ "--headless", "--disable-gpu", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222" ] ,就可以使用Dockerfile从与Dockerfile相同的存储库中进行构建。然后,您可以将其推送到docker hub或您自己的注册表,您的gitlab运行程序可以在其中访问docker映像。确保以示例方式标记您喜欢的docker映像,让我们以为该标记为例,然后将其推送到本地存储库dokcer build .

然后将gitlab-ci.yml文件中的先前标记用作{your-docker-repo}/maven-with-chrome-headless:1.0.0

答案 1 :(得分:0)

不要“合并” Docker容器。您将不同的服务放入不同的容器中,然后一起运行它们。看一下kubernetes(现在它在gitlab中提供了通用支持),或者选择更简单的解决方案,例如docker-composedocker-swarm

对于集成测试,我们使用docker-compose

无论如何,如果使用docker-compose,您可能会陷入需要所谓的docker-in-docker的情况。这取决于您用来运行gitlab作业的工作程序类型。如果您使用shell执行程序,一切都会好起来的。如果您使用的是docker执行器,则必须正确设置它,因为您不能从docker调用docker而不进行其他手动设置。

如果不是选择使用多个容器,并且您肯定要全部放入一个容器中,则建议的方法是使用管理程序在容器内启动进程。选项之一是supervisordhttp://supervisord.org/