如何从Jenkins在docker容器内执行命令

时间:2019-07-01 11:40:52

标签: linux shell docker jenkins docker-compose

我的要求是手动将证书添加到容器中Java的击键操作中。为此,我正在使用以下命令。

ngOnInit() { this.cat = 'cat'; } ->进入容器

sudo docker exec -it my-container-name bash->更改目录到Java安全路径

cd /java/lib/security->安装证书

以上命令运行正常。现在,我想通过詹金斯(Jenkins)使它自动化。我的意思是,我希望这些命令在之后执行 'keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias testcert -file /cert/test-Base64.cer'。

任何人都可以帮忙。

2 个答案:

答案 0 :(得分:0)

如果您仍想在容器启动后执行此操作,请使用

sudo docker exec -it my-container-name bash -c "cd /java/lib/security; keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias testcert -file /cert/test-Base64.cer"

答案 1 :(得分:0)

通常,您应该找到避免docker exec的方法,尤其是对于这样的脚本使用。 (非常有可能的是,自动化任务将删除并重新创建容器,而无需您进行手动设置步骤。在Docker Swarm或Kubernetes等集群环境中,这是双重事实。)

如果您有一些现有的密钥库文件只想注入到容器中,最简单的方法是在启动时使用docker run -v选项将其推入。您已经需要一个完全填充的密钥库文件。

docker run \
  -v $PWD/keystore.jks:/usr/lib/java/jre/lib/security/keystore.jks \
  ...

如果在启动时无法注入完全填充的密钥库文件,则可以编写在容器启动时运行的脚本。它会寻找一些众所周知的目录,在其中的每个文件上运行keytool命令,然后运行作为命令行参数传递的命令。

#!/bin/sh
if [ -d /cert ]; then
  for f in /cert/*.cer; do
    keytool ... -file "$f"
  done
fi
exec "$@"

在您的Dockerfile中,复制此脚本并将其设为ENTRYPOINT。如果您以前有ENTRYPOINT ["java", ...]行,请将其更改为CMD。看起来像

FROM java:8
...
COPY entrypoint.sh /app
ENTRYPOINT ["/app/entrypoint.sh"]
CMD ["java", "-jar", "/app/myapp.jar"]

然后,当您运行容器时,插入/cert目录

docker run \
  -v $PWD/cert:/cert \
  ...