我正在尝试使用2个Docker容器设置原始CI / CD管道 - 我将其称为 jenkins 和 node-app 。我的目标是让 jenkins 容器在提交到GitHub仓库时运行一个作业(已经完成)。该作业应在 node-app 容器上运行$emailverification = 1; // added
// start verify loop
foreach($_POST["email"] as $key => $email)
{
// Filter var email to comfirm it is an email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false)
{
$emailcheckarray[] = 1;
} else {
$emailcheckarray[] = 0;
$emailverification = 0; // added
}
// Create a string for later
$emailfields .= $email .",";
}
脚本。因此,当开发人员提交GitHub时, jenkins 会选择提交,然后启动包括自动化测试在内的工作(将来),然后在 node-app 上进行部署
jenkins 容器正在使用最新图片(Dockerfile)。
node-app 容器的Dockerfile是:
deploy.sh
使用Docker Compose链接 jenkins 和 node-app ,并且FROM node:latest
EXPOSE 80
WORKDIR /usr/src/final-exercise
ADD . /usr/src/final-exercise
RUN apt-get update -y
RUN apt-get install -y nodejs npm
RUN cd /src/final-exercise; npm install
CMD ["node", "/usr/src/final-exercise/app.js"]
文件包含(更新,感谢@alkis):
docker-compose.yml
使用node-app:
container_name: node-app
build: .
ports:
- 80:80
links:
- jenkins
jenkins:
container_name: jenkins
image: jenkins
ports:
- 8080:8080
volumes:
- /home/ec2-user/final-exercise:/var/jenkins
构建容器并按预期启动。 docker-compose up -d
得出(更新):
docker ps
我可以从 node-app ping jenkins ,反之亦然。
这甚至可能吗?如果没有,我在这里犯了一个架构错误吗?
非常感谢你,我很感激!
编辑:
我偶然发现CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69e52b216d48 finalexercise_node-app "node /usr/src/final-" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp node-app
5f7e779e5fbd jenkins "/bin/tini -- /usr/lo" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins
并使用this和this轻松输入容器的shell。但是,这两个都假设原点(在他们的情况下是主机,在我的情况下是 jenkins 容器)安装了Docker以便找到目标容器的PID。我可以从主持人nsenter
进入 node-app ,但 jenkins 仍然没有运气。
答案 0 :(得分:0)
node-app:
build: .
ports:
- 80:80
links:
- finalexercise_jenkins_1
jenkins:
image: jenkins
ports:
- 8080:8080
volumes:
- /home/ec2-user/final-exercise:/var/jenkins
尝试以上方法。您按图像名称链接,但必须使用容器名称。 在您的情况下,由于您没有明确指定容器名称,因此它会像这样自动生成
finalexercise : folder where your docker-compose.yml is located
node-app : container configs tag
1 : you only have one container with the prefix finalexercise_node-app. If you built a second one, then its name will be finalexercise_node-app_2
yml文件的设置:
node-app:
build: .
container_name: my-node-app
ports:
- 80:80
links:
- my-jenkins
jenkins:
image: jenkins
container_name: my-jenkins
ports:
- 8080:8080
volumes:
- /home/ec2-user/final-exercise:/var/jenkins
当然,您也可以为node-app指定容器名称,这样您就可以使用常量进行通信。
<强>更新强>
为了测试,请登录jenkins容器的bash终端
docker exec -it my-jenkins bash
然后尝试ping my-node-app,甚至telnet以获取特定端口。
ping my-node-app:80
或者你可以
telnet my-node-app 80
<强>更新强>
exec
command可以轻松完成您想要做的事情。
从您的主机,您可以执行此操作(尝试它,以确保它正在工作)
docker exec -i <container_name> ./deploy.sh
如果上述方法有效,则您的问题委托从容器执行相同的命令。因为它不能这样做,因为发出命令的容器(jenkins)无法访问主机的docker安装(它不仅识别命令,而且保存对您需要访问的容器的控制权)。
我没有使用其中任何一个,但我知道两个解决方案