我有一个在Docker容器中运行的Web应用程序.此应用程序需要访问公司文件服务器上的某些文件(带有Active Directory域控制器的Windows Server).我正在尝试访问的文件是为我们的客户创建的图像文件,Web应用程序将它们显示为客户端组合的一部分.
在我的开发机器上,我通过条目安装了相应的文件夹/etc/fstab,主机安装点通过--volume参数安装在Docker容器中.这非常有效.
现在我正在尝试将一个生产容器组合在一起,该容器将在不同的服务器上运行,并且不依赖于在主机上安装的CIFS共享.所以我尝试将相应的条目添加到/etc/fstab容器中的文件中并使用它们进行安装mount -a.我得到mount error(13): Permission denied.
在线的一点研究让我看到了关于Docker安全性的这篇文章.如果我正确读取它,看起来Docker明确否认在容器中挂载文件系统的能力.我尝试以只读方式挂载共享,但这(不出所料)也失败了.
所以,我有两个问题:
我是否理解Docker阻止使用mount内部容器?
任何人都可以想到另一种方法来实现这一点,而无需在主机上安装CIFS共享,然后将主机文件夹安装在Docker容器中?
我正试着.env在Laravel 5中进行配置.
这是我的故事:我正在将现有的Laravel 4应用程序转换为Laravel 5.我目前有不同的环境(local和production),并且级联配置系统运行良好.我将环境特定的应用程序配置放在单独的文件夹下app/config.
我的应用程序目前在Docker容器中部署(和开发).为了构建部署,我使用Dockerfile来构建我的应用程序映像(基于我的master分支),然后将其推送到存储库并在生产服务器上提取.
所以现在我正在尝试将我的配置转换为Laravel 5,我有点困惑.我读到的所有内容都说您将.env文件添加到.gitignore文件中,因此它不会包含在您的存储库中.我理解这样做的安全原因 - 不要将敏感的API密钥/密码/提交到您的存储库.但是我不确定如果我的生成.env文件不是存储库的一部分,如何确保我的生成文件包含在我的构建步骤中.
我的想法是将我的生产.env文件放在我的开发环境之外的文件系统中,然后在需要时复制它.
这是管理这个的"最佳实践"吗?这是别人怎么做的?
谢谢!
我为我的Laravel应用程序定义了几个库,它们暴露了常量.
例如,我有一个用于计算假期和工作日的课程,用于计算某些报告的工作日数.
我的类定义如下所示:
<?php namespace MyApp\Libraries;
/**
* The Holiday Calculation Helper Library
*
* A helper class to calculate holidays and working days.
*/
class Holidays {
/**
* The defined EBS holidays: New Years Day
*/
const NEW_YEARS_DAY = "new years day";
/**
* The defined EBS holidays: Independence Day
*/
const INDEPENDENCE_DAY = "independence day";
/**
* The defined EBS holidays: Christmas Day
*/
const CHRISTMAS_DAY = "christmas day";
...
Run Code Online (Sandbox Code Playgroud)
这些由(例如)一种date方法使用,该方法获取假日常数值和一年,并返回该年度假日期.我有一个外观和服务提供商设置,所以这个库可以在Laravel Way™中使用.一切都很完美,我对所有东西进行了单元测试,我对代码感到满意.
我的问题是如何引用这些常量.如果我使用外观并从代码的其他部分调用库,它看起来像这样: …
情况如下:
我有一个Laravel 4.2应用程序,该应用程序从第三方API检索资产。这是一项长期资产(每12-24小时仅更改一次),并且非常耗时(一个大图像文件)。我确实缓存了资产,因此影响或多或少都已最小化,但是仍然有这样的情况,早上登录我的应用程序的第一个人必须等待应用程序首次加载资产。
我已经设置了一项工作,将排队等待并且每八小时运行一次。这应该确保缓存中的资产始终是新鲜的。它可以在作业运行八小时后重新入队。
问题是这样的:我将把这个工作系统部署到生产中,而且我不确定如何第一次运行它。
理想情况下,我希望有一个管理选项,其中有一个按钮,上面写着“单击此处提交作业”,但我想使其尽可能地简单并防止他人(我不是唯一的管理员)提交作业。为此,应用程序需要检查并查看作业是否已经在队列中。我找不到一种以实现独立的方式执行此操作的方法(我正在使用redis,但将来可能会更改)。
另一个选择是添加一个artisan命令来运行初始过程。这样,我可以部署该应用程序,运行一个artisan命令,而不必理会它。
因此,回顾一下,我有两个问题:
是否可以检查队列以查看其中有哪些作业?
有一个更好的方法吗?
谢谢
在Linux上的Docker容器中进行开发时,权限存在问题:如何管理主机和容器之间的文件所有权和权限.
想象一下,我有一个运行Ubuntu和Apache服务器的Docker镜像.使用(最新版本)Apache的默认设置,文档根目录将是/var/www/htmlApache,Apache将作为www-data用户运行.
为了进行一些开发,我通过Docker公开文档根目录-v /path/to/my/files:/var/www/html.这就是出现问题的地方:
这些文件/path/to/my/files由容器www-data用户拥有.如果我很幸运,我的主人有一个www-data用户,那将是该用户; 否则,它将是容器本地的独特用户.这些文件的权限(可能)是0755.
因此,当我以自己(称为用户jsmith)的方式工作时,由于文件权限和所有权不正确,我无法编辑这些文件.
我可以将文件的所有权更改为jsmith,但这会导致Apache出现问题 - 它将难以访问文档根目录中的文件.
我可以将权限更改为0777,但我在工作过程中创建的任何新文件都将归其所有jsmith.
最终结果是必须不断调整开发文件的所有权和权限.其他人一定有这个问题,但是我在开发工作流程中使用Docker这个主题的每篇文章都忽略了这个问题.
我确实有一个解决方案,但我对此并不满意:
我在那里设置了一个文件夹/src/myproject.这包含我的开发文件并归其所有www-data:www-data.
使用BindFS,我安装/src/myproject的~/myproject,映射www-data:www-data到jsmith:jsmith.这允许我编辑文件~/myproject而不必弄乱权限.
Apache Docker容器使用安装/src/myproject目录-v /src/myproject:/var/www/html.Apache看到了www-data文件的所有权,没有任何问题.
这很好用,但看起来过于复杂.其他人如何解决这个问题?
我在使用 Typescript 和导入moment包时遇到了一个奇怪的问题。我在几个不同的地方看到过它,我什至看到它出现在同一个文件中,这取决于我是否向类添加了特定的静态方法。
问题是这样的:
当我使用 导入 moment 时import * as moment from 'moment';,我没有遇到 Typescript 错误,但是我的测试确实遇到了问题;具体来说,他们失败了TypeError: moment is not a function。
当我更改导入时import moment from 'moment';,代码有效,但我得到"moment" has no default export.
我不明白这些之间的区别。我已经看到了其他问题(比如这个,它推荐了第一种语法)。对上述问题的已接受答案的评论建议打开allowSyntheticDefaultImports标志,这确实纠正了问题,但我有点担心该标志。文档说:
允许从没有默认导出的模块中默认导入。这不会影响代码发出,只是类型检查。
这似乎意味着没有对以这种方式导入的模块进行类型检查。
所以,两个问题:
allowSyntheticDefaultImports是否正确理解了该标志的 TS 文档?它是否关闭了moment包的类型检查?FWIW,我正在使用 Typescript 3.4.5 和时刻 2.24.0。
我遇到了PHP函数的问题is_file().
一些预备知识:我正在使用PHP 5.5.10和Apache 2.4.9在32位Ubuntu 12.04上进行开发.
我目前正在重写一些工作代码,将其转换为Laravel中的库(使用Facade和ServiceProvider完成).我这样做主要是为了清理我在年轻和愚蠢时(大约6个月前)编写的一些代码并实施单元测试.我正在编写的图书馆提供了签订合同的方法(其中有两种不同的类型,还有更多),并找到PDF文档的路径(扫描的纸质合同).我找到路径的方法工作正常,测试都通过了.
在我的旧代码中,我曾经这样做:
/**
* Get a scanned contract and return it to the client
*
* @param string $type
* The contract type. Must be either static::CONTRACT1 or static::CONTRACT2.
*
* @param string $contract_id
* The contract ID
*
* @return Response
*/
public static function get($type, $contract_id)
{
// get the file name
//
$results = static::getFileName($type, $contract_id);
// did we find a file? if not, throw a ScannedContractNotFoundException
//
if(!$results) …Run Code Online (Sandbox Code Playgroud) 我一直在使用React和React-Router组合一个单页应用程序,但我似乎不明白如何保护这些应用程序。
我发现一篇不错的清晰博客文章显示了一种方法,但对我而言似乎并不安全。基本上,该文章中介绍的方法是限制用户无权访问的组件的呈现。作者多写了几篇文章,它们是该思想的变体,将其扩展到了React-Router路由和其他组件,但是在他们心中,所有这些方法似乎都依赖于同一有缺陷的思想:客户端代码决定要做什么基于组成组件时存储中的数据。对我来说,这似乎是一个问题-怎样才能阻止一个进取的黑客弄乱代码来访问东西?
我想到了三种不同的方法,但我都不满意:
我当然可以编写授权代码,使得客户端代码不断地与服务器检查授权,但这似乎很浪费。
我可以设置应用程序,以便仅在服务器确认客户端有权访问该代码之后,才将模块从服务器推送到客户端。但这似乎涉及将我的代码分解成一百万个小模块,而不是一个漂亮的整体式捆绑包(我正在使用browserify)。
某些服务器端呈现系统可能会起作用,这将确保用户只能看到服务器已决定有权查看的页面。但这似乎很复杂,而且似乎也向后退了一步(如果我想让服务器完成所有工作,则可以编写传统的Web应用程序)。
那么,最好的方法是什么?别人如何解决这个问题?
我在我的laravel 5项目中使用了socialite包.我在hostgator中托管我的网站.我已经检查了三次,我在hostgator中的php版本是5.5.22.
但我仍然得到这个错误.
FatalErrorException in CurlFactory.php line 69:
Call to undefined function GuzzleHttp\Handler\curl_reset()
in CurlFactory.php line 69
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用Facebook以及使用社交网站的Google登录,但在重定向到我的控制器/功能的两种情况下都会抛出此错误.
请帮我.什么可能是错误
我的Auth控制器功能是
public function getFacebookLogin(){
return Socialite::driver('facebook')->redirect();
}
public function getHandleFbLogin(){
//echo "hey";
$user = Socialite::driver('facebook')->user();
print_r($user);
}
public function getGoogleLogin(){
return Socialite::driver('google')->redirect();
}
public function getHandleGpLogin(){
echo "hey";
$user = Socialite::driver('google')->user();
print_r($user);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过编写一些遗留代码的单元测试来清理现有的应用程序(并在整个过程中进行更新).我重写了一些库,我真的很喜欢TDD方法.但是,现在是时候继续测试一些控制器了,我在第一组测试中遇到了问题.我正在按照Jeffery Way的Laravel Testing Decoded解释.
这里的目标是测试我的登录路线:http://my-development-server/login.代码应该像这样工作:首先,检查某人是否已经登录 - 如果是,则将它们重定向到仪表板(应用程序中的主页).否则,渲染登录页面.挺直的.
以下是涉及的路线:
Route::get('login', array(
'as' => 'login',
'uses' => 'MyApp\Controllers\AccountController@getLogin',
));
Route::get('/', array(
'as' => 'dashboard',
'uses' => 'MyApp\Controllers\DashboardController@showDashboard',
'before' => 'acl:dashboard.view',
));
Run Code Online (Sandbox Code Playgroud)
这是AccountController::getLogin方法:
public function getLogin()
{
// Are we logged in?
if (\Sentry::check())
return Redirect::route('dashboard');
// Show the page.
return View::make('account.login');
}
Run Code Online (Sandbox Code Playgroud)
我正在使用该Sentry库进行用户身份验证.
这是我的第一次测试:
class AccountControllerTest extends TestCase {
public function tearDown()
{
Mockery::close();
}
public function test_login_alreadyLoggedIn()
{
// arrange
//
\Sentry::shouldReceive("check")
->once() …Run Code Online (Sandbox Code Playgroud) laravel ×4
docker ×3
php ×3
laravel-4 ×2
laravel-5 ×2
linux ×2
cifs ×1
git ×1
mockery ×1
mount ×1
permissions ×1
phpunit ×1
queue ×1
react-router ×1
reactjs ×1
redux ×1
symfony ×1
typescript ×1
unit-testing ×1
windows ×1