首页 > 解决方案 > 如何在 Jenkins 的 docker 容器中执行命令

问题描述

我的要求是手动将证书添加到容器中的 Java 中的密钥。为此,我使用以下命令。

sudo docker exec -it my-container-name bash--> 进入容器

cd /java/lib/security--> 将目录更改为 java 安全路径

keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias testcert -file /cert/test-Base64.cer--> 安装证书

上述命令工作正常。现在,我想从詹金斯自动化这个。我的意思是,我希望这些命令在 ' sudo docker-compose up -d' 之后执行。

任何人都可以请帮忙。

标签: linuxshelldockerjenkinsdocker-compose

解决方案


您通常应该找到避免的方法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 \
  ...

推荐阅读