小编nor*_*bjd的帖子

Docker:容器A可以调用位于其他容器B上的可执行文件吗?

我有两个Docker镜像,一个包含pandoc(用于将不同格式的文档转换为多种格式的实用程序),另一个包含pdflatex(从texlive,将tex文件转换为pdf).我的目标是将文档转换mdpdf.

我可以分别运行每个图像:

# call pandoc inside my-pandoc-image (md -> tex)
docker run --rm \
    -v $(pwd):/pandoc \
    my-pandoc-image \
    pandoc -s test.md -o test.tex

# call pdflatex inside my-texlive-image (tex -> pdf)
docker run --rm \
    -v $(pwd):/texlive \
    my-texlive-image \
    pdflatex test.tex # generates test.pdf
Run Code Online (Sandbox Code Playgroud)

但是,事实上,我想要的是直接调用pandoc(从它的容器)转换mdpdf,如下所示:

docker run --rm \
    -v $(pwd):/pandoc \
    my-pandoc-image \
    pandoc -s test.md --latex-engine …
Run Code Online (Sandbox Code Playgroud)

pdflatex pandoc docker docker-compose

14
推荐指数
1
解决办法
1926
查看次数

openapi-generator-maven-plugin (Java) 无法正确处理 allOf

通过org.openapitools:openapi-generator-maven-plugin,我注意到allOf在响应中使用由多个对象组成不会生成组合这些多个对象的类。相反,它使用本节中定义的第一个类allOf

这是一个最小的例子(openapi.yaml):

openapi: 3.0.0
info:
  title: Test
  version: v1
paths:
  /test:
    get:
      operationId: get
      responses:
        '200':
          description: Get
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/A'
                  - $ref: '#/components/schemas/B'
components:
  schemas:
    A:
      type: object
      properties:
        attA:
          type: string
    B:
      type: object
      properties:
        attB:
          type: integer
Run Code Online (Sandbox Code Playgroud)

通过以下方式在 Java 中生成类时:

mvn org.openapitools:openapi-generator-maven-plugin:5.2.0:generate \
    -Dopenapi.generator.maven.plugin.inputSpec=openapi.yaml \
    -Dopenapi.generator.maven.plugin.generatorName=java
Run Code Online (Sandbox Code Playgroud)

它显示一个警告:

[WARNING] allOf with multiple schemas defined. Using only the first one: A
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它生成了类 A 和 B。但是,当调用 时get() …

java openapi openapi-generator

14
推荐指数
1
解决办法
9885
查看次数

在 Python 中的桌面应用程序中安全地分发 OAuth 2.0 client_secret

我正在寻找一些关于如何在 Python 中设计和创建我自己的桌面应用程序(或已安装的应用程序)的最佳实践示例代码,需要 OAuth 2.0 授权流到 Google,并找到了 Google 提供的这个存储库:https : //github.com/ googlesamples/oauth-apps-for-windows(用 C# 编码,但无论如何设计应该是相同的)。

在深入研究代码时,我惊讶地发现它client_secret被直接嵌入到源代码中(请看这里:https : //github.com/googlesamples/oauth-apps-for-windows/blob/ e79f1575b5858c5f617d29f2435a93996e4248c5/OAuthConsoleApp/OAuthConsoleApp/Program.cs#L47)。

我在关于“已安装的应用程序”的 Google Developers 文档中找到了这个:

当您通过 Google API 控制台创建客户端 ID 时,指定这是一个已安装的应用程序,然后选择 Android、Chrome、iOS 或“其他”作为应用程序类型。该过程会生成一个客户端 ID,在某些情况下还会生成一个客户端机密,您将其嵌入到应用程序的源代码中。(在这种情况下,客户端机密显然不被视为机密。)

另外,我不知道为什么 Android 或 iOS 应用程序client_secret在从控制台生成的 OAuth 客户端 ID中不包含此内容,而其他本机应用程序(桌面)应该包含此内容。

而且我还在很多网站上发现,客户端的秘密应该保密……正如其名称所暗示的那样。

我已经阅读了本机应用程序的不同 RFC(我认为是最可靠的来源)并发现这很有用:

https://tools.ietf.org/html/draft-ietf-oauth-native-apps-12#appendix-A

  1. 不假设本机应用程序客户端可以保密。如果机密被分发给同一原生应用程序的多个安装,则不应将它们视为机密。见第 8.5 节。

但我想确定我理解正确。

因此,在从 Google API 控制台为“其他”应用程序类型生成 OAuth 客户端 ID 后,是否可以将客户端密钥直接嵌入到我的应用程序中?这样做真的没有安全问题吗?这篇SO帖子:如果攻击者获得了应用程序的client_secret,他可以做什么?谈论安全问题,所以我有点迷茫。

使用google-auth-oauthlib避免从头开始实现 OAuth 协议,我是否可以安全地分发以下代码(****值不会被明显混淆):

from google_auth_oauthlib …
Run Code Online (Sandbox Code Playgroud)

security oauth-2.0 python-3.x google-oauth

10
推荐指数
2
解决办法
1818
查看次数

DAG无法在Google Cloud Composer网络服务器上点击,但在本地Airflow上正常运行

我正在使用带有图像版本和Python 2.7的Google Cloud Composer(在Google云平台上管理Airflow)composer-0.5.3-airflow-1.9.0,我面临一个奇怪的问题:导入我的DAG后,它们无法从Web UI中点击(并且没有按钮) "Trigger DAG","Graph view",...),虽然在运行本地Airflow时都能正常工作.

即使在Composer上的Web服务器中不可用,我的DAG仍然存在.我可以使用CLI(list_dags)列出它们,描述它们(list_tasks)甚至触发它们(trigger_dag).

再现问题的最小例子

我用来重现问题的一个最小例子如下所示.使用钩子(此处GoogleCloudStorageHook)非常重要,因为使用钩子时会发生Composer上的错误.最初,我使用自定义挂钩(在自定义插件中),并且面临同样的问题.

这里,该示例基本上列出了GCS存储桶(my-bucket)中的所有条目,并为每个以条目开头的条目生成DAG my_dag.

import datetime

from airflow import DAG
from airflow.contrib.hooks.gcs_hook import GoogleCloudStorageHook
from airflow.operators.bash_operator import BashOperator

google_conn_id = 'google_cloud_default'

gcs_conn = GoogleCloudStorageHook(google_conn_id)

bucket = 'my-bucket'
prefix = 'my_dag'

entries = gcs_conn.list(bucket, prefix=prefix)

for entry in entries:
    dag_id = str(entry)

    dag = DAG(
        dag_id=dag_id,
        start_date=datetime.datetime.today(),
        schedule_interval='0 0 1 * *'
    ) …
Run Code Online (Sandbox Code Playgroud)

python python-2.7 airflow airflow-scheduler google-cloud-composer

9
推荐指数
1
解决办法
1266
查看次数

气流:如果一项任务失败,则 DAG 标记为“成功”,因为触发规则 ALL_DONE

我有以下 3 个任务的 DAG:

start --> special_task --> end
Run Code Online (Sandbox Code Playgroud)

中间的任务可以成功也可以失败,但end 必须始终执行(想象一下这是一个干净地关闭资源的任务)。为此,我使用了触发规则 ALL_DONE

end.trigger_rule = trigger_rule.TriggerRule.ALL_DONE
Run Code Online (Sandbox Code Playgroud)

使用它,end如果special_task失败则正确执行。但是,由于end是最后一个任务并且成功,因此 DAG 始终标记为SUCCESS

如何配置我的 DAG,以便如果其中一项任务失败,则整个 DAG 被标记为FAILED

重现的例子

import datetime

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.utils import trigger_rule

dag = DAG(
    dag_id='my_dag',
    start_date=datetime.datetime.today(),
    schedule_interval=None
)

start = BashOperator(
    task_id='start',
    bash_command='echo start',
    dag=dag
)

special_task = BashOperator(
    task_id='special_task',
    bash_command='exit 1', # force failure
    dag=dag
)

end = BashOperator( …
Run Code Online (Sandbox Code Playgroud)

python-2.7 airflow

8
推荐指数
2
解决办法
1万
查看次数

从 Makefile 规则打印粗体或彩色文本

我正在尝试从以下打印粗体文本Makefile

printf-bold-1:
    @printf "normal text - \e[1mbold text\e[0m"
Run Code Online (Sandbox Code Playgroud)

但是,转义序列按原样打印,因此在运行时make printf-bold-1,我得到:

普通文本 - \e[1mbold text\e[0m

而不是预期:

普通文本 -粗体文本

这很奇怪,因为我可以从我的终端打印粗体文本:printf "normal text - \e[1mbold text\e[0m"按预期直接运行命令会产生:

普通文本 -粗体文本

在 中Makefile,我尝试使用@echoorecho代替@printf,或打印\x1b代替\e,但没有成功。

以下是一些描述我的环境(带有标准 Gnome 终端的 Linux)的变量,如果可以的话:

COLORTERM=gnome-terminal
TERM=xterm-256color
Run Code Online (Sandbox Code Playgroud)

另请注意,在某些同事的笔记本电脑 (Mac) 上,可以正确打印粗体文本。

在各种环境下从Makefile规则打印粗体或彩色文本的便携方式是什么?

makefile gnu-make gnome-terminal ansi-colors

7
推荐指数
2
解决办法
4971
查看次数

使用 Google Cloud Platform 服务帐户查询 GSuite Directory API

我想查询GSuite Admin SDK Directory API以返回组中的所有用户,在 Go 中,并作为 GCP 服务帐户进行身份验证(该脚本将在 Google Compute Engine VM 中或作为 Google Cloud Function 执行)。

我使用的服务帐户(我们称之为my-service-account@my-project.iam.gserviceaccount.com)已在 GSuite 中被授予必要的范围:

我还有一个 GSuite管理员帐户(我们称之为my-admin@my-domain.com)。该帐户将用于委派(请参阅有关委派的文档)。

我可以使用以下代码返回组中的所有用户(基于上面提供的链接中的代码,并且我删除了大部分错误处理以使代码更短):

package main

import (
    "io/ioutil"
    "log"
    "os"

    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
    admin "google.golang.org/api/admin/directory/v1"
)

func main() {
    srv := createAdminDirectoryService(
        os.Getenv("SERVICE_ACCOUNT_FILE_PATH"),
        os.Getenv("GSUITE_ADMIN_USER_EMAIL"),
    )
    members := listUsersInGroup(srv, os.Args[1])
    log.Println(members)
}

func createAdminDirectoryService(serviceAccountFilePath,
                                 gsuiteAdminUserEmail string) *admin.Service {
    jsonCredentials, _ := ioutil.ReadFile(serviceAccountFilePath)

    config, …
Run Code Online (Sandbox Code Playgroud)

go jwt google-cloud-platform google-workspace

7
推荐指数
1
解决办法
1192
查看次数

Rust : futures::future::join_all(...).await 按顺序运行 future,但需要并行性

我有以下async功能(实现并不重要):

async fn long_task(task_number: i32) {
    // do some long work
    println!("Task {} executed", task_number);
}
Run Code Online (Sandbox Code Playgroud)

我想同时运行n次这个函数,所以我定义了这个函数:

async fn execute_long_tasks_async(n: i32) {
    let mut futures = Vec::new();
    for i in 1..=n {
        futures.push(long_task(i));
    }
    futures::future::join_all(futures).await;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用该join_all函数来等待所有任务都执行完毕。然后我在我的中调用这个函数main

fn main() {
    futures::executor::block_on(execute_long_tasks_async(3));
}
Run Code Online (Sandbox Code Playgroud)

我的问题是任务是按顺序运行的:

Executing task 1
Task 1 executed
Executing task 2
Task 2 executed
Executing task 3
Task 3 executed
Run Code Online (Sandbox Code Playgroud)

但我希望它同时运行,我会得到类似的结果:

Executing task 1
Executing task 3
Executing task 2
Task …
Run Code Online (Sandbox Code Playgroud)

asynchronous rust async-await

7
推荐指数
1
解决办法
5194
查看次数

Docker:在多个容器上共享/ dev / snd会导致“设备或资源繁忙”

添加主机设备--device /dev/snd)到多克尔容器,我有时会遇到Device or resource busy错误。

我用一个涉及音频(alsa)的最小示例重现了该问题。这是我的Dockerfile(产生图像docker-device-example):

FROM    debian:buster

RUN     apt-get update \
 &&     apt-get install -y --no-install-recommends \
            alsa-utils \
 &&     rm -rf /var/lib/apt/lists/*
Run Code Online (Sandbox Code Playgroud)

我正在speaker-test使用/dev/snd共享运行以下命令(该工具是生成可用来测试扬声器的音调的工具):

docker run --rm \
    -i -t \
    --device /dev/snd \
    docker-device-example \
    speaker-test
Run Code Online (Sandbox Code Playgroud)

问题

当运行上一个命令时,会发出粉红声音,但仅在某些情况下

  • 如果我没有在主机上播放任何声音:例如,如果我正在播放视频,并且即使视频已暂停,命令也会失败
  • 如果我没有运行另一个容器来访问/dev/snd设备

使用时看起来像是/dev/snd“锁定”的,如果是这种情况,我得到以下输出(错误由后两行表示):

speaker-test 1.1.6

Playback device is default
Stream parameters are 48000Hz, S16_LE, 1 channels
Using …
Run Code Online (Sandbox Code Playgroud)

alsa docker

6
推荐指数
1
解决办法
1590
查看次数

单个dockerfiles GitHub存储库+ Docker Hub自动构建

我想dockerfiles在GitHub上创建一个存储库以集中Dockerfile我到目前为止创建的所有自定义代码。我还想独立地自动在Docker Hub上自动化每个映像的构建。

GitHub上有很多这样的存储库:

(我不会在这里谈论最繁星的存储库:https : //github.com/jessfraz/dockerfiles,因为正如您在Docker Hub上看到的那样,这些不是自动构建)

想要的dockerfiles存储库结构

我希望我的dockerfilesGitHub存储库具有以下结构(分支master),基于上面提到的GitHub存储库:

dockerfiles (GitHub repo)
    |- docker-image-1
        |- Dockerfile
    |- docker-image-2
        |- Dockerfile
    |- ...
Run Code Online (Sandbox Code Playgroud)

Docker Hub构建自动化

组态

在Docker Hub上,我可以创建2个公共自动化构建版本:docker-image-1docker-image-2,都引用我的dockerfilesGitHub存储库,但是构建设置不同(实际上,只有Dockerfile位置不同):

  • docker-image-1
    • 类型:分支
    • 姓名:主人
    • Dockerfile位置/ docker -image-1 /
    • Docker标记名称:最新
  • docker-image-2
    • 类型:分支
    • 姓名:主人
    • Dockerfile位置/ …

git docker dockerhub

6
推荐指数
1
解决办法
267
查看次数