检查非守护程序 Docker 容器,在它完成后 运行
Inspect non-daemon Docker container, after it has completed running
我有一个用
创建的容器
# start
docker build -t cdt-tests .
docker run -it --name cdt-tests cdt-tests
# end => I want to inspect the container filesystem after it's done
因为它不是 运行在分离模式下,我如何检查容器?我想要做的是阻止容器"auto-closing",这样我就可以在容器完成后检查它的文件系统。
cdt-测试的 Dockerfile 看起来像:
FROM node:6
RUN apt-get update && \
apt-get -y install sudo
RUN sudo apt-get -y update
RUN sudo apt-get -y upgrade
RUN sudo apt-get install -y sqlite3 libsqlite3-dev
USER root
RUN mkdir -p /tmp/test-deps
RUN mkdir -p /usr/local/cdt-tests
WORKDIR /usr/local/cdt-tests
ENV SUMAN_POSTINSTALL_IS_DAEMON no
RUN rm -rf node_modules
RUN npm set progress=false
RUN npm config set loglevel=warn
RUN npm set loglevel=warn
COPY package.json .
RUN npm install --no-optional > /dev/null 2>&1
RUN npm install bower > /dev/null 2>&1
COPY . .
RUN ./node_modules/.bin/bower install --config.interactive=false --allow-root > /dev/null 2>&1
ENTRYPOINT ["/bin/bash", "/usr/local/cdt-tests/@run-tests.sh"]
我知道使用技巧来覆盖入口点并检查容器,如下所示:
docker run -it --entrypoint /bin/bash --name cdt-tests cdt-tests
但是,这对我当前的用例不起作用,因为我想检查容器 after @运行-tests.sh已完成!
所以我有两个问题:
- 我如何在完成 运行ning 后检查非守护程序容器的文件系统?
- 如何获取为非守护程序容器创建的容器的容器 ID(不使用 $(docker ps))。
如果我执行 docker ps -a
,我会看到:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08740a432d1c cdt-tests "/bin/bash /usr/lo..." 24 seconds ago Exited (130) 7 seconds ago cdt-tests
f27a302b1d8f cdt-server "/bin/bash /usr/lo..." 38 seconds ago Up 36 seconds cdt-server
b854506e75df cisco-selenium "/opt/bin/entry_po..." 41 seconds ago Up 39 seconds 4444/tcp cdt-selenium
a37cab33b293 mongo "docker-entrypoint..." 43 seconds ago Up 41 seconds 27017/tcp cdt-mongo
所以我们可以看到 cdt-tests 在那里,即使它不是守护进程。
所以我们尝试检查它,像这样:
docker exec cdt-tests /bin/bash
但是我们得到一个错误:
Error response from daemon: Container 08740a432d1c8f014bc138c82706de1e9682a052c088531d60b33c6acbbd5559 is not running
怎么办?
我不知道问题 2。
但是对于问题 1,一个可能的解决方案是捕获退出信号——尽管这将在容器本身内执行。但我想如果 objective 是检查容器中的文件系统,您可以将结果通过管道传输到挂载目录。
例如在 运行-tests.sh 脚本中添加
exiting() {
# do file system inspection here
}
# trap the exit signal
trap exiting SIGINT SIGTERM EXIT
编辑:
要将日志 directory/file 安装到主机,请使用 -v 选项
docker run -it -v $HOME/log:/var/log --name cdt-tests cdt-tests
注意,当使用 -v 选项时,请确保您没有挂载到容器的工作目录 - docker 将用主机内容覆盖它。
docker cp 命令的另一个答案也应该有效。我主要使用 -v,因为在主机上保留日志意味着我可以在程序 运行ning 时使用 tail -f 检查或观看它。这取决于用例。另一件要记住的事情是,如果程序 运行ning ok,容器将无错退出,并且无法进行复制。容器只有在错误退出时才会保留。
How can I inspect the filesystem of a non-daemon container after it has completed running?
使用docker cp
。见 docs
The docker cp utility copies the contents of SRC_PATH to the DEST_PATH. You can copy from the container’s file system to the local machine or the reverse, from the local filesystem to the container. (...) The CONTAINER can be a running or stopped container. The SRC_PATH or DEST_PATH can be a file or directory.
另一种选择是将您的容器具体化为新图像,并在其上 运行 bash:
docker commit <stopped-container> new_image_name
docker run -it --entrypoint /bin/bash new_image_name
How can I get the container id for the container that's created for a non-daemon container (without using $(docker ps)).
1) 当您执行 docker run -d
时,输出是已创建的容器 ID,因此您可以保存该信息:
container_id=$(docker run -d .......)
2) 这将显示已停止的测试容器:
docker ps -a --filter ancestor=cdt-tests
并将最后停止的测试容器放入 var 中:
container_id=$(docker ps -q -a --filter ancestor=cdt-tests | head -n1)
每个案例还有许多其他变体。
编辑。使用卷版本方法,您可以将单个文件绑定为卷:
docker run -v ./tests.log:/path/to/logs/file.log -it --name cdt-tests cdt-tests
我有一个用
创建的容器# start
docker build -t cdt-tests .
docker run -it --name cdt-tests cdt-tests
# end => I want to inspect the container filesystem after it's done
因为它不是 运行在分离模式下,我如何检查容器?我想要做的是阻止容器"auto-closing",这样我就可以在容器完成后检查它的文件系统。
cdt-测试的 Dockerfile 看起来像:
FROM node:6
RUN apt-get update && \
apt-get -y install sudo
RUN sudo apt-get -y update
RUN sudo apt-get -y upgrade
RUN sudo apt-get install -y sqlite3 libsqlite3-dev
USER root
RUN mkdir -p /tmp/test-deps
RUN mkdir -p /usr/local/cdt-tests
WORKDIR /usr/local/cdt-tests
ENV SUMAN_POSTINSTALL_IS_DAEMON no
RUN rm -rf node_modules
RUN npm set progress=false
RUN npm config set loglevel=warn
RUN npm set loglevel=warn
COPY package.json .
RUN npm install --no-optional > /dev/null 2>&1
RUN npm install bower > /dev/null 2>&1
COPY . .
RUN ./node_modules/.bin/bower install --config.interactive=false --allow-root > /dev/null 2>&1
ENTRYPOINT ["/bin/bash", "/usr/local/cdt-tests/@run-tests.sh"]
我知道使用技巧来覆盖入口点并检查容器,如下所示:
docker run -it --entrypoint /bin/bash --name cdt-tests cdt-tests
但是,这对我当前的用例不起作用,因为我想检查容器 after @运行-tests.sh已完成!
所以我有两个问题:
- 我如何在完成 运行ning 后检查非守护程序容器的文件系统?
- 如何获取为非守护程序容器创建的容器的容器 ID(不使用 $(docker ps))。
如果我执行 docker ps -a
,我会看到:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08740a432d1c cdt-tests "/bin/bash /usr/lo..." 24 seconds ago Exited (130) 7 seconds ago cdt-tests
f27a302b1d8f cdt-server "/bin/bash /usr/lo..." 38 seconds ago Up 36 seconds cdt-server
b854506e75df cisco-selenium "/opt/bin/entry_po..." 41 seconds ago Up 39 seconds 4444/tcp cdt-selenium
a37cab33b293 mongo "docker-entrypoint..." 43 seconds ago Up 41 seconds 27017/tcp cdt-mongo
所以我们可以看到 cdt-tests 在那里,即使它不是守护进程。
所以我们尝试检查它,像这样:
docker exec cdt-tests /bin/bash
但是我们得到一个错误:
Error response from daemon: Container 08740a432d1c8f014bc138c82706de1e9682a052c088531d60b33c6acbbd5559 is not running
怎么办?
我不知道问题 2。 但是对于问题 1,一个可能的解决方案是捕获退出信号——尽管这将在容器本身内执行。但我想如果 objective 是检查容器中的文件系统,您可以将结果通过管道传输到挂载目录。
例如在 运行-tests.sh 脚本中添加
exiting() {
# do file system inspection here
}
# trap the exit signal
trap exiting SIGINT SIGTERM EXIT
编辑: 要将日志 directory/file 安装到主机,请使用 -v 选项
docker run -it -v $HOME/log:/var/log --name cdt-tests cdt-tests
注意,当使用 -v 选项时,请确保您没有挂载到容器的工作目录 - docker 将用主机内容覆盖它。
docker cp 命令的另一个答案也应该有效。我主要使用 -v,因为在主机上保留日志意味着我可以在程序 运行ning 时使用 tail -f 检查或观看它。这取决于用例。另一件要记住的事情是,如果程序 运行ning ok,容器将无错退出,并且无法进行复制。容器只有在错误退出时才会保留。
How can I inspect the filesystem of a non-daemon container after it has completed running?
使用docker cp
。见 docs
The docker cp utility copies the contents of SRC_PATH to the DEST_PATH. You can copy from the container’s file system to the local machine or the reverse, from the local filesystem to the container. (...) The CONTAINER can be a running or stopped container. The SRC_PATH or DEST_PATH can be a file or directory.
另一种选择是将您的容器具体化为新图像,并在其上 运行 bash:
docker commit <stopped-container> new_image_name
docker run -it --entrypoint /bin/bash new_image_name
How can I get the container id for the container that's created for a non-daemon container (without using $(docker ps)).
1) 当您执行 docker run -d
时,输出是已创建的容器 ID,因此您可以保存该信息:
container_id=$(docker run -d .......)
2) 这将显示已停止的测试容器:
docker ps -a --filter ancestor=cdt-tests
并将最后停止的测试容器放入 var 中:
container_id=$(docker ps -q -a --filter ancestor=cdt-tests | head -n1)
每个案例还有许多其他变体。
编辑。使用卷版本方法,您可以将单个文件绑定为卷:
docker run -v ./tests.log:/path/to/logs/file.log -it --name cdt-tests cdt-tests