首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker: Dockerfile -it在Dockerfile还是YML?

Docker: Dockerfile -it在Dockerfile还是YML?
EN

Stack Overflow用户
提问于 2021-02-14 00:39:48
回答 1查看 236关注 0票数 0

我刚接触到docker,并试图了解如何执行PHP脚本。我创建了一个Ubuntu容器,并指示它使用以下示例执行PHP脚本:

代码语言:javascript
复制
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)之后做同样的事情时,一切都很好,并产生输出。

我在composer中尝试了command: tail -F anything,并在命令中添加了各种标志,比如set -x,但是仍然没有发生任何事情,日志中也没有任何东西。

是否有一种方法可以将Dockerfile命令放入Dockerfile?

当我在Java应用程序中使用类似类型的命令时,我会得到输出等,而不是使用PHP。

这是Dockerfile

代码语言:javascript
复制
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"]
EN

回答 1

Stack Overflow用户

发布于 2021-02-15 02:13:20

完全的新手错误..。终端窗口不显示脚本返回的输出。为此您需要额外的日志记录命令。

我正在VS代码中执行以下操作:

代码语言:javascript
复制
docker compose up

^这相当于在终端中执行docker-compose up -d --build

这是在分离模式下运行的,显然没有从容器输出日志。

因此,我需要执行以下操作来查看容器中的日志

代码语言:javascript
复制
docker containers view logs

^这相当于在终端中执行docker logs --tail

然后,我看到了所有的错误,它正在返回。结果,我没有以正确的格式执行命令。

简单的修复方法是将所有命令写入bash脚本,然后使用以下命令在Dockerfile末尾调用该脚本

代码语言:javascript
复制
CMD ["./start.sh"]

start.sh看起来就像

代码语言:javascript
复制
#!/usr/bin/env bash
set -e
php script1.php
php script2.php

P.S:我希望VS代码中的docker扩展有一个命令,比如"docker用日志组合起来“之类的命令,这样您就可以立即看到容器中发生了什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66191377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档