docker - 构建时如何将源代码复制到图像
问题描述
我在 Centos 服务器上有 Jenkins,还在同一台服务器上部署了 Docker 并建立了连接。我正在尝试使用 Jenkins 管道将 Docker 映像部署到不同的生产服务器。
我已经在 github 上有了所有需要部署的源代码。
JENKINFILE(下面只有一小部分)
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Running build automation'
sh './gradlew build --no-daemon'
archiveArtifacts artifacts: 'dist/trainSchedule.zip'
}
}
stage('Build Docker Image') {
when {
branch 'master'
}
steps {
script {
app = docker.build("willbla/train-schedule")
app.inside {
sh 'echo $(curl localhost:8080)'
}
}
}
}
stage('Push Docker Image') {
when {
branch 'master'
}
steps {
script {
docker.withRegistry('https://registry.hub.docker.com', 'docker_hub_login') {
app.push("${env.BUILD_NUMBER}")
app.push("latest")
码头工人文件
FROM node:carbon
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "npm", "start" ]
我能够构建映像并进行部署,但我对 Docker 如何使用源代码构建映像感到困惑COPY package*.json ./ .
。为此,它必须在我的 Docker 所在的 Jenkins 服务器上本地。我找到了通过命令构建的图像,docker image ls
并且还在 中找到了构建工件/var/lib/jenkins/jobs/<my-job-name>-build/builds/8/archive/target
,但是源代码在哪里以及它是如何在 Dockerfile 中复制的?
解决方案
当 Jenkins 运行时,您的代码将被检出到您的 jenkins 机器上的工作目录中。所以你所有的源文件都位于你的詹金斯盒子上。
调用 docker build 时,build 目录就是 docker 文件所在的目录。该目录更改为
WORKDIR /usr/src/app
您的 docker 文件正在执行两个复制操作。
COPY package*.json ./
RUN npm install
这会将 package.json 复制到 docker build 映像中,然后 npm install 所有依赖项(与结帐后在本地计算机上的方式相同)。
然后
COPY . .
将当前目录(/usr/src/app)中的所有文件复制到正在构建的 docker 映像中。这是实际复制您的源代码的调用。
这在您的詹金斯盒子上的位置将取决于您的詹金斯设置。
这里有一些关于如何设置的阅读如何 在 Jenkins 上更改工作区和构建记录根目录?
tldr; 根据上面的代码片段,docker 拉入镜像的源代码是 {JENKINS_WORKSPACE}/usr/src/app。
推荐阅读
- python - 如何在python(patsy)中编写多元公式,VAR是否支持?
- javascript - 为什么不检查正确的值?(Javascript/HTML)
- python - ValueError:检查目标时出错:预期 main_prediction 有 3 个维度,但得到了形状为 (1128, 1) 的数组
- javascript - SyntaxError: super() 仅在派生类构造函数中有效
- firebase - 基于谷歌“托管域”授权用户
- html - 防止 HTML 输入在溢出时移动
- javascript - 使用 Map + Rest 运算符 (JavaScript)
- c - 参考函数未编译
- javascript - 看不到警报 - 通过 TempData 引导的 mvc5
- css - Css:仅更改第一个 div