docker - Docker:Dockerfile 或 YML 中的 docker exec -it?
问题描述
我是 docker 新手,并试图了解执行 PHP 脚本的工作原理。我创建了一个 Ubuntu 容器,并使用以下示例指示它执行 PHP 脚本:
RUN /bin/bash -c "set -x /usr/bin/php7.1 ./x_test/php_version.php"
CMD ["php" "./x_test/php_version.php"]
执行脚本后,日志或终端中不会显示任何内容。
但是,当我在执行“附加 shell”() 之后执行完全相同的操作时,docker exec -it
一切正常并产生输出。
我尝试command: tail -F anything
在作曲家中添加各种标志到命令中,set -x
但仍然没有发生任何事情,日志中也没有任何内容。
有没有办法将 docker exec it 命令放入 Dockerfile 中?
当我在 Java 应用程序中使用类似类型的命令时,我得到了输出等,但没有使用 PHP。
这是 Dockerfile
FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
ADD selenium-server-standalone-3.8.1.jar /
# a few minor docker-specific tweaks
# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48
&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
&& chmod +x /usr/sbin/policy-rc.d \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56
&& dpkg-divert --local --rename --add /sbin/initctl \
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151
&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests
# delete all the apt list files since they're big and get stale quickly
RUN rm -rf /var/lib/apt/lists/*
# this forces "apt-get update" in dependent images, which is also good
# (see also https://bugs.launchpad.net/cloud-images/+bug/1699913)
# make systemd-detect-virt return "docker"
# See: https://github.com/systemd/systemd/blob/aa0c34279ee40bce2f9681b496922dedbadfca19/src/basic/virt.c#L434
RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container
# Install updates
RUN apt-get update -y && apt-get install -y software-properties-common language-pack-en-base
# Install Java
RUN apt-get install -y default-jre
# Get the PHP library
RUN LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php
RUN apt-get -y update && apt-get install -y \
php7.1 \
php7.1-pgsql \
php-pear \
php7.1-curl \
php7.1-sqlite3 \
php7.1-xml \
php7.1-bcmath \
php7.1-zip \
php7.1-mbstring \
php-xdebug \
php-ast
RUN mkdir /app
WORKDIR /app
RUN /bin/bash -c "set -x /usr/bin/php7.1 ./x_test/php_version.php"
CMD ["php" "./x_test/php_version.php"]
解决方案
完全新手错误..终端窗口不显示脚本返回的输出。为此,您需要额外的日志记录命令。
我在 VS Code 中执行以下操作:
docker compose up
^ 这相当于docker-compose up -d --build
在终端中执行
这以分离模式运行,显然不会从容器输出日志。
所以我需要执行以下操作才能查看容器中的日志
docker containers view logs
^ 这相当于docker logs --tail
在终端中执行
然后我看到了它返回的所有错误。原来我没有以正确的格式执行命令。
简单的解决方法是将所有命令写入 bash 脚本,然后在结束时Dockerfile
使用以下命令调用该脚本
CMD ["./start.sh"]
start.sh 看起来像
#!/usr/bin/env bash
set -e
php script1.php
php script2.php
PS:我希望 VS 代码中的 docker 扩展有一个类似“docker compose up with logs”之类的命令,这样你就可以立即看到容器内发生了什么。
推荐阅读
- random - MicroPython 中的 random 似乎确实有什么作用?
- java - 为什么解析器可以工作,但当我尝试打印它时返回空数据?
- qt - 为什么 Qt 以这种方式检查 QML 应用程序的创建?
- html - 为什么这个链接悬停效果是从中间开始而不是从左边开始的?
- python - 如何根据索引号而不是元素值从数组中提取特定索引?
- c - 允许以_开头的C变量名,和(0x8)是什么意思?
- reactjs - 单击项目时打印当前选定的项目
- css - CSS
- 子菜单不会在点击时关闭,需要与关闭链接交换
- go - 使用 go 模块将 retool 替换为 tools.go 用于多开发人员和 CI 环境
- node.js - 如何在 nock 回调中获取查询参数